test_pagedata_schema.js (4601B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 /* 5 * Tests schema validation. 6 */ 7 8 add_task(async function testBasic() { 9 // Old data types, should not be recognised. 10 Assert.equal(PageDataSchema.nameForType(1), null); 11 Assert.equal(PageDataSchema.nameForType(2), null); 12 13 Assert.equal( 14 PageDataSchema.nameForType(PageDataSchema.DATA_TYPE.VIDEO), 15 "VIDEO" 16 ); 17 Assert.equal( 18 PageDataSchema.nameForType(PageDataSchema.DATA_TYPE.PRODUCT), 19 "PRODUCT" 20 ); 21 }); 22 23 add_task(async function testProduct() { 24 // Products must have a name 25 await Assert.rejects( 26 PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, {}), 27 /missing required property 'name'/ 28 ); 29 30 await PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, { 31 name: "Bolts", 32 }); 33 34 await PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, { 35 name: "Bolts", 36 price: { 37 value: 5, 38 }, 39 }); 40 41 await PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, { 42 name: "Bolts", 43 price: { 44 value: 5, 45 currency: "USD", 46 }, 47 }); 48 49 await Assert.rejects( 50 PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, { 51 name: "Bolts", 52 price: { 53 currency: "USD", 54 }, 55 }), 56 /missing required property 'value'/ 57 ); 58 59 await PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, { 60 name: "Bolts", 61 shippingCost: { 62 value: 5, 63 currency: "USD", 64 }, 65 }); 66 67 await Assert.rejects( 68 PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, { 69 name: "Bolts", 70 shippingCost: { 71 currency: "USD", 72 }, 73 }), 74 /missing required property 'value'/ 75 ); 76 }); 77 78 add_task(async function testCoalesce() { 79 let joined = PageDataSchema.coalescePageData({}, {}); 80 Assert.deepEqual(joined, { data: {} }); 81 82 joined = PageDataSchema.coalescePageData( 83 { 84 url: "https://www.google.com/", 85 data: { 86 [PageDataSchema.DATA_TYPE.PRODUCT]: { 87 name: "bolts", 88 }, 89 [PageDataSchema.DATA_TYPE.VIDEO]: { 90 name: "My video", 91 duration: 500, 92 }, 93 }, 94 }, 95 { 96 url: "https://www.mozilla.com/", 97 date: 27, 98 siteName: "Mozilla", 99 data: { 100 [PageDataSchema.DATA_TYPE.PRODUCT]: { 101 name: "newname", 102 price: { 103 value: 55, 104 }, 105 }, 106 [PageDataSchema.DATA_TYPE.AUDIO]: { 107 name: "My song", 108 }, 109 }, 110 } 111 ); 112 113 Assert.deepEqual(joined, { 114 url: "https://www.google.com/", 115 date: 27, 116 siteName: "Mozilla", 117 data: { 118 [PageDataSchema.DATA_TYPE.PRODUCT]: { 119 name: "bolts", 120 price: { 121 value: 55, 122 }, 123 }, 124 [PageDataSchema.DATA_TYPE.VIDEO]: { 125 name: "My video", 126 duration: 500, 127 }, 128 [PageDataSchema.DATA_TYPE.AUDIO]: { 129 name: "My song", 130 }, 131 }, 132 }); 133 }); 134 135 add_task(async function testPageData() { 136 // Full page data needs a url and a date 137 await Assert.rejects( 138 PageDataSchema.validatePageData({}), 139 /missing required property 'url'/ 140 ); 141 142 await Assert.rejects( 143 PageDataSchema.validatePageData({ url: "https://www.google.com" }), 144 /missing required property 'date'/ 145 ); 146 147 await Assert.rejects( 148 PageDataSchema.validatePageData({ date: 55 }), 149 /missing required property 'url'/ 150 ); 151 152 Assert.deepEqual( 153 await PageDataSchema.validatePageData({ 154 url: "https://www.google.com", 155 date: 55, 156 }), 157 { url: "https://www.google.com", date: 55, data: {} } 158 ); 159 160 Assert.deepEqual( 161 await PageDataSchema.validatePageData({ 162 url: "https://www.google.com", 163 date: 55, 164 data: { 165 0: { 166 name: "unknown", 167 }, 168 [PageDataSchema.DATA_TYPE.PRODUCT]: { 169 name: "Bolts", 170 price: { 171 value: 55, 172 }, 173 }, 174 }, 175 }), 176 { 177 url: "https://www.google.com", 178 date: 55, 179 data: { 180 [PageDataSchema.DATA_TYPE.PRODUCT]: { 181 name: "Bolts", 182 price: { 183 value: 55, 184 }, 185 }, 186 }, 187 } 188 ); 189 190 // Should drop invalid inner data. 191 Assert.deepEqual( 192 await PageDataSchema.validatePageData({ 193 url: "https://www.google.com", 194 date: 55, 195 data: { 196 [PageDataSchema.DATA_TYPE.PRODUCT]: { 197 name: "Bolts", 198 price: { 199 currency: "USD", 200 }, 201 }, 202 }, 203 }), 204 { 205 url: "https://www.google.com", 206 date: 55, 207 data: {}, 208 } 209 ); 210 });