tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });