test_addressDataLoader.js (4234B)
1 "use strict"; 2 3 const SUPPORT_COUNTRIES_TESTCASES = [ 4 { 5 country: "US", 6 properties: ["languages", "alternative_names", "sub_keys", "sub_names"], 7 }, 8 { 9 country: "CA", 10 properties: ["languages", "name", "sub_keys", "sub_names"], 11 }, 12 { 13 country: "DE", 14 properties: ["name"], 15 }, 16 ]; 17 18 var AddressMetaDataLoader, FormAutofillUtils; 19 add_setup(async () => { 20 ({ FormAutofillUtils } = ChromeUtils.importESModule( 21 "resource://gre/modules/shared/FormAutofillUtils.sys.mjs" 22 )); 23 ({ AddressMetaDataLoader } = ChromeUtils.importESModule( 24 "resource://gre/modules/shared/AddressMetaDataLoader.sys.mjs" 25 )); 26 }); 27 28 add_task(async function test_initalState() { 29 // addressData should be empty 30 Assert.deepEqual(AddressMetaDataLoader.addressData, {}); 31 // Verify dataLoaded state 32 Assert.equal(AddressMetaDataLoader.dataLoaded.country, false); 33 Assert.equal(AddressMetaDataLoader.dataLoaded.level1.size, 0); 34 }); 35 36 add_task(async function test_loadDataCountry() { 37 sinon.spy(AddressMetaDataLoader, "loadAddressMetaData"); 38 let metadata = FormAutofillUtils.getCountryAddressData("US"); 39 Assert.ok(AddressMetaDataLoader.addressData, "addressData exists"); 40 // Verify _dataLoaded state 41 Assert.equal(AddressMetaDataLoader.dataLoaded.country, true); 42 Assert.equal(AddressMetaDataLoader.dataLoaded.level1.size, 0); 43 // _loadAddressMetaData should be called 44 sinon.assert.called(AddressMetaDataLoader.loadAddressMetaData); 45 // Verify metadata 46 Assert.equal(metadata.id, "data/US"); 47 Assert.ok( 48 metadata.alternative_names, 49 "US alternative names should be loaded from extension" 50 ); 51 AddressMetaDataLoader.loadAddressMetaData.resetHistory(); 52 53 // Load data without country 54 let newMetadata = FormAutofillUtils.getCountryAddressData(); 55 // _loadAddressMetaData should not be called 56 sinon.assert.notCalled(AddressMetaDataLoader.loadAddressMetaData); 57 Assert.deepEqual( 58 metadata, 59 newMetadata, 60 "metadata should be US if country is not specified" 61 ); 62 AddressMetaDataLoader.loadAddressMetaData.resetHistory(); 63 }); 64 65 // This test is currently Disable! 66 // This is because - Loading a non-existent resource could potentially cause a crash 67 // (See Bug 1859588). To address this issue, We can check for the file's existence 68 // before attempting to load the script. However, given that we are not using 69 // state data, just keep the solution simple by disabling the test. 70 add_task(async function test_loadDataState() { 71 sinon.spy(AddressMetaDataLoader, "loadAddressMetaData"); 72 // Load level 1 data that does not exist 73 let undefinedMetadata = FormAutofillUtils.getCountryAddressData("US", "CA"); 74 // loadAddressMetaData should be called 75 sinon.assert.called(AddressMetaDataLoader.loadAddressMetaData); 76 Assert.equal(undefinedMetadata, undefined, "metadata should be undefined"); 77 Assert.ok( 78 AddressMetaDataLoader.dataLoaded.level1.has("US"), 79 "level 1 state array should be set even there's no valid metadata" 80 ); 81 AddressMetaDataLoader.loadAddressMetaData.resetHistory(); 82 83 // Load level 1 data again 84 undefinedMetadata = FormAutofillUtils.getCountryAddressData("US", "AS"); 85 Assert.equal(undefinedMetadata, undefined, "metadata should be undefined"); 86 // loadAddressMetaData should not be called 87 sinon.assert.notCalled(AddressMetaDataLoader.loadAddressMetaData); 88 }).skip(); 89 90 SUPPORT_COUNTRIES_TESTCASES.forEach(testcase => { 91 add_task(async function test_support_country() { 92 info("Starting testcase: Check " + testcase.country + " metadata"); 93 let metadata = FormAutofillUtils.getCountryAddressData(testcase.country); 94 Assert.ok( 95 testcase.properties.every(key => metadata[key]), 96 "These properties should exist: " + testcase.properties 97 ); 98 // Verify the multi-locale country 99 if (metadata.languages && metadata.languages.length > 1) { 100 let locales = FormAutofillUtils.getCountryAddressDataWithLocales( 101 testcase.country 102 ); 103 Assert.equal( 104 metadata.languages.length, 105 locales.length, 106 "Total supported locales should be matched" 107 ); 108 metadata.languages.forEach((lang, index) => { 109 Assert.equal(lang, locales[index].lang, `Should support ${lang}`); 110 }); 111 } 112 }); 113 });