summaryrefslogtreecommitdiffstats
path: root/browser/components/pagedata/tests/unit/test_pagedata_schema.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/pagedata/tests/unit/test_pagedata_schema.js')
-rw-r--r--browser/components/pagedata/tests/unit/test_pagedata_schema.js210
1 files changed, 210 insertions, 0 deletions
diff --git a/browser/components/pagedata/tests/unit/test_pagedata_schema.js b/browser/components/pagedata/tests/unit/test_pagedata_schema.js
new file mode 100644
index 0000000000..fcd9c4b297
--- /dev/null
+++ b/browser/components/pagedata/tests/unit/test_pagedata_schema.js
@@ -0,0 +1,210 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/*
+ * Tests schema validation.
+ */
+
+add_task(async function testBasic() {
+ // Old data types, should not be recognised.
+ Assert.equal(PageDataSchema.nameForType(1), null);
+ Assert.equal(PageDataSchema.nameForType(2), null);
+
+ Assert.equal(
+ PageDataSchema.nameForType(PageDataSchema.DATA_TYPE.VIDEO),
+ "VIDEO"
+ );
+ Assert.equal(
+ PageDataSchema.nameForType(PageDataSchema.DATA_TYPE.PRODUCT),
+ "PRODUCT"
+ );
+});
+
+add_task(async function testProduct() {
+ // Products must have a name
+ await Assert.rejects(
+ PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, {}),
+ /missing required property 'name'/
+ );
+
+ await PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, {
+ name: "Bolts",
+ });
+
+ await PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, {
+ name: "Bolts",
+ price: {
+ value: 5,
+ },
+ });
+
+ await PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, {
+ name: "Bolts",
+ price: {
+ value: 5,
+ currency: "USD",
+ },
+ });
+
+ await Assert.rejects(
+ PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, {
+ name: "Bolts",
+ price: {
+ currency: "USD",
+ },
+ }),
+ /missing required property 'value'/
+ );
+
+ await PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, {
+ name: "Bolts",
+ shippingCost: {
+ value: 5,
+ currency: "USD",
+ },
+ });
+
+ await Assert.rejects(
+ PageDataSchema.validateData(PageDataSchema.DATA_TYPE.PRODUCT, {
+ name: "Bolts",
+ shippingCost: {
+ currency: "USD",
+ },
+ }),
+ /missing required property 'value'/
+ );
+});
+
+add_task(async function testCoalesce() {
+ let joined = PageDataSchema.coalescePageData({}, {});
+ Assert.deepEqual(joined, { data: {} });
+
+ joined = PageDataSchema.coalescePageData(
+ {
+ url: "https://www.google.com/",
+ data: {
+ [PageDataSchema.DATA_TYPE.PRODUCT]: {
+ name: "bolts",
+ },
+ [PageDataSchema.DATA_TYPE.VIDEO]: {
+ name: "My video",
+ duration: 500,
+ },
+ },
+ },
+ {
+ url: "https://www.mozilla.com/",
+ date: 27,
+ siteName: "Mozilla",
+ data: {
+ [PageDataSchema.DATA_TYPE.PRODUCT]: {
+ name: "newname",
+ price: {
+ value: 55,
+ },
+ },
+ [PageDataSchema.DATA_TYPE.AUDIO]: {
+ name: "My song",
+ },
+ },
+ }
+ );
+
+ Assert.deepEqual(joined, {
+ url: "https://www.google.com/",
+ date: 27,
+ siteName: "Mozilla",
+ data: {
+ [PageDataSchema.DATA_TYPE.PRODUCT]: {
+ name: "bolts",
+ price: {
+ value: 55,
+ },
+ },
+ [PageDataSchema.DATA_TYPE.VIDEO]: {
+ name: "My video",
+ duration: 500,
+ },
+ [PageDataSchema.DATA_TYPE.AUDIO]: {
+ name: "My song",
+ },
+ },
+ });
+});
+
+add_task(async function testPageData() {
+ // Full page data needs a url and a date
+ await Assert.rejects(
+ PageDataSchema.validatePageData({}),
+ /missing required property 'url'/
+ );
+
+ await Assert.rejects(
+ PageDataSchema.validatePageData({ url: "https://www.google.com" }),
+ /missing required property 'date'/
+ );
+
+ await Assert.rejects(
+ PageDataSchema.validatePageData({ date: 55 }),
+ /missing required property 'url'/
+ );
+
+ Assert.deepEqual(
+ await PageDataSchema.validatePageData({
+ url: "https://www.google.com",
+ date: 55,
+ }),
+ { url: "https://www.google.com", date: 55, data: {} }
+ );
+
+ Assert.deepEqual(
+ await PageDataSchema.validatePageData({
+ url: "https://www.google.com",
+ date: 55,
+ data: {
+ 0: {
+ name: "unknown",
+ },
+ [PageDataSchema.DATA_TYPE.PRODUCT]: {
+ name: "Bolts",
+ price: {
+ value: 55,
+ },
+ },
+ },
+ }),
+ {
+ url: "https://www.google.com",
+ date: 55,
+ data: {
+ [PageDataSchema.DATA_TYPE.PRODUCT]: {
+ name: "Bolts",
+ price: {
+ value: 55,
+ },
+ },
+ },
+ }
+ );
+
+ // Should drop invalid inner data.
+ Assert.deepEqual(
+ await PageDataSchema.validatePageData({
+ url: "https://www.google.com",
+ date: 55,
+ data: {
+ [PageDataSchema.DATA_TYPE.PRODUCT]: {
+ name: "Bolts",
+ price: {
+ currency: "USD",
+ },
+ },
+ },
+ }),
+ {
+ url: "https://www.google.com",
+ date: 55,
+ data: {},
+ }
+ );
+});