test_getAdaptedProfiles_locales.js (9873B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 /* 5 * Test to ensure locale specific placeholders for credit card fields are properly used 6 * to transform various values in the profile. 7 */ 8 9 "use strict"; 10 11 const DEFAULT_CREDITCARD_RECORD = { 12 guid: "123", 13 "cc-exp-month": 1, 14 "cc-exp-year": 2025, 15 "cc-exp": "2025-01", 16 }; 17 18 const getCCExpYearFormatted = () => { 19 return DEFAULT_CREDITCARD_RECORD["cc-exp-year"].toString().substring(2); 20 }; 21 22 const getCCExpMonthFormatted = () => { 23 return DEFAULT_CREDITCARD_RECORD["cc-exp-month"].toString().padStart(2, "0"); 24 }; 25 26 const DEFAULT_EXPECTED_CREDITCARD_RECORD_SEPARATE_EXPIRY_FIELDS = { 27 ...DEFAULT_CREDITCARD_RECORD, 28 "cc-exp-month-formatted": getCCExpMonthFormatted(), 29 "cc-exp-year-formatted": getCCExpYearFormatted(), 30 }; 31 32 const FR_TESTCASES = [ 33 { 34 description: "Use placeholder to adjust cc-exp format [mm/aa].", 35 document: `<form><input autocomplete="cc-number"> 36 <input placeholder="mm/aa" autocomplete="cc-exp"></form>`, 37 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 38 expectedResult: [ 39 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 40 "cc-exp": "01/25", 41 }), 42 ], 43 }, 44 { 45 description: "Use placeholder to adjust cc-exp format [mm / aa].", 46 document: `<form><input autocomplete="cc-number"> 47 <input placeholder="mm / aa" autocomplete="cc-exp"></form>`, 48 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 49 expectedResult: [ 50 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 51 "cc-exp": "01/25", 52 }), 53 ], 54 }, 55 { 56 description: "Use placeholder to adjust cc-exp format [MM / AA].", 57 document: `<form><input autocomplete="cc-number"> 58 <input placeholder="MM / AA" autocomplete="cc-exp"></form>`, 59 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 60 expectedResult: [ 61 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 62 "cc-exp": "01/25", 63 }), 64 ], 65 }, 66 { 67 description: "Use placeholder to adjust cc-exp format [mm / aaaa].", 68 document: `<form><input autocomplete="cc-number"> 69 <input placeholder="mm / aaaa" autocomplete="cc-exp"></form>`, 70 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 71 expectedResult: [ 72 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 73 "cc-exp": "01/2025", 74 }), 75 ], 76 }, 77 { 78 description: "Use placeholder to adjust cc-exp format [mm - aaaa].", 79 document: `<form><input autocomplete="cc-number"> 80 <input placeholder="mm - aaaa" autocomplete="cc-exp"></form>`, 81 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 82 expectedResult: [ 83 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 84 "cc-exp": "01-2025", 85 }), 86 ], 87 }, 88 { 89 description: "Use placeholder to adjust cc-exp format [aaaa-mm].", 90 document: `<form><input autocomplete="cc-number"> 91 <input placeholder="aaaa-mm" autocomplete="cc-exp"></form>`, 92 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 93 expectedResult: [ 94 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 95 "cc-exp": "2025-01", 96 }), 97 ], 98 }, 99 { 100 description: "Use placeholder to adjust cc-exp-year field [aa].", 101 document: `<form> 102 <input autocomplete="cc-number"> 103 <input autocomplete="cc-exp-month"> 104 <input autocomplete="cc-exp-year" placeholder="AA"> 105 </form>`, 106 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 107 expectedResult: [ 108 { ...DEFAULT_EXPECTED_CREDITCARD_RECORD_SEPARATE_EXPIRY_FIELDS }, 109 ], 110 }, 111 ]; 112 113 const DE_TESTCASES = [ 114 { 115 description: "Use placeholder to adjust cc-exp format [mm / jj].", 116 document: `<form><input autocomplete="cc-number"> 117 <input placeholder="mm / jj" autocomplete="cc-exp"></form>`, 118 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 119 expectedResult: [ 120 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 121 "cc-exp": "01/25", 122 }), 123 ], 124 }, 125 { 126 description: "Use placeholder to adjust cc-exp format [MM / JJ].", 127 document: `<form><input autocomplete="cc-number"> 128 <input placeholder="MM / JJ" autocomplete="cc-exp"></form>`, 129 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 130 expectedResult: [ 131 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 132 "cc-exp": "01/25", 133 }), 134 ], 135 }, 136 { 137 description: "Use placeholder to adjust cc-exp format [mm / jjjj].", 138 document: `<form><input autocomplete="cc-number"> 139 <input placeholder="mm / jjjj" autocomplete="cc-exp"></form>`, 140 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 141 expectedResult: [ 142 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 143 "cc-exp": "01/2025", 144 }), 145 ], 146 }, 147 { 148 description: "Use placeholder to adjust cc-exp format [MM / JJJJ].", 149 document: `<form><input autocomplete="cc-number"> 150 <input placeholder="MM / JJJJ" autocomplete="cc-exp"></form>`, 151 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 152 expectedResult: [ 153 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 154 "cc-exp": "01/2025", 155 }), 156 ], 157 }, 158 { 159 description: "Use placeholder to adjust cc-exp format [mm - jj].", 160 document: `<form><input autocomplete="cc-number"> 161 <input placeholder="mm - jj" autocomplete="cc-exp"></form>`, 162 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 163 expectedResult: [ 164 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 165 "cc-exp": "01-25", 166 }), 167 ], 168 }, 169 { 170 description: "Use placeholder to adjust cc-exp format [MM - JJ].", 171 document: `<form><input autocomplete="cc-number"> 172 <input placeholder="MM - JJ" autocomplete="cc-exp"></form>`, 173 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 174 expectedResult: [ 175 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 176 "cc-exp": "01-25", 177 }), 178 ], 179 }, 180 { 181 description: "Use placeholder to adjust cc-exp format [mm - jjjj].", 182 document: `<form><input autocomplete="cc-number"> 183 <input placeholder="mm - jjjj" autocomplete="cc-exp"></form>`, 184 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 185 expectedResult: [ 186 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 187 "cc-exp": "01-2025", 188 }), 189 ], 190 }, 191 { 192 description: "Use placeholder to adjust cc-exp format [MM - JJJJ].", 193 document: `<form><input autocomplete="cc-number"> 194 <input placeholder="MM - JJJJ" autocomplete="cc-exp"></form>`, 195 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 196 expectedResult: [ 197 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 198 "cc-exp": "01-2025", 199 }), 200 ], 201 }, 202 { 203 description: "Use placeholder to adjust cc-exp format [jjjj - mm].", 204 document: `<form><input autocomplete="cc-number"> 205 <input placeholder="jjjj - mm" autocomplete="cc-exp"></form>`, 206 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 207 expectedResult: [ 208 Object.assign({}, DEFAULT_CREDITCARD_RECORD, { 209 "cc-exp": "2025-01", 210 }), 211 ], 212 }, 213 { 214 description: "Use placeholder to adjust cc-exp-year field [jj].", 215 document: `<form> 216 <input autocomplete="cc-number"> 217 <input autocomplete="cc-exp-month"> 218 <input autocomplete="cc-exp-year" placeholder="JJ"> 219 </form>`, 220 profileData: [Object.assign({}, DEFAULT_CREDITCARD_RECORD)], 221 expectedResult: [ 222 { ...DEFAULT_EXPECTED_CREDITCARD_RECORD_SEPARATE_EXPIRY_FIELDS }, 223 ], 224 }, 225 ]; 226 227 var FormAutofillHandler; 228 var FormAutofillHeuristics; 229 add_task(async function () { 230 ({ FormAutofillHandler } = ChromeUtils.importESModule( 231 "resource://gre/modules/shared/FormAutofillHandler.sys.mjs" 232 )); 233 ({ FormAutofillHeuristics } = ChromeUtils.importESModule( 234 "resource://gre/modules/shared/FormAutofillHeuristics.sys.mjs" 235 )); 236 }); 237 238 const TESTCASES = [FR_TESTCASES, DE_TESTCASES]; 239 240 for (let localeTests of TESTCASES) { 241 for (let testcase of localeTests) { 242 add_task(async function () { 243 info("Starting testcase: " + testcase.description); 244 245 let doc = MockDocument.createTestDocument( 246 "http://localhost:8080/test/", 247 testcase.document 248 ); 249 let form = doc.querySelector("form"); 250 let formLike = FormLikeFactory.createFromForm(form); 251 let handler = new FormAutofillHandler(formLike); 252 253 const fieldDetails = FormAutofillHandler.collectFormFieldDetails( 254 handler.form 255 ); 256 FormAutofillHeuristics.parseAndUpdateFieldNamesParent(fieldDetails); 257 handler.setIdentifiedFieldDetails(fieldDetails); 258 259 handler.focusedInput = form.elements[0]; 260 let adaptedRecords = handler.getAdaptedProfiles(testcase.profileData); 261 adaptedRecords.forEach(record => delete record._original); 262 Assert.deepEqual(adaptedRecords, testcase.expectedResult); 263 264 if (testcase.expectedOptionElements) { 265 testcase.expectedOptionElements.forEach((expectedOptionElement, i) => { 266 for (let field in expectedOptionElement) { 267 let select = form.querySelector(`[autocomplete=${field}]`); 268 let expectedOption = doc.getElementById( 269 expectedOptionElement[field] 270 ); 271 Assert.notEqual(expectedOption, null); 272 273 let value = testcase.profileData[i][field]; 274 let cache = handler._cacheValue.matchingSelectOption.get(select); 275 let targetOption = cache[value] && cache[value].deref(); 276 Assert.notEqual(targetOption, null); 277 278 Assert.equal(targetOption, expectedOption); 279 } 280 }); 281 } 282 }); 283 } 284 }