aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/util_datamapper_spec.lua8
-rw-r--r--spec/util_jsonschema_spec.lua102
2 files changed, 107 insertions, 3 deletions
diff --git a/spec/util_datamapper_spec.lua b/spec/util_datamapper_spec.lua
index 3b0ae87e..51ccf127 100644
--- a/spec/util_datamapper_spec.lua
+++ b/spec/util_datamapper_spec.lua
@@ -25,7 +25,7 @@ describe("util.datamapper", function()
from = attr();
type = attr();
id = attr();
- body = "string";
+ body = true; -- should be assumed to be a string
lang = {type = "string"; xml = {attribute = true; prefix = "xml"}};
delay = {
type = "object";
@@ -56,7 +56,8 @@ describe("util.datamapper", function()
xml = {namespace = "urn:xmpp:reactions:0"; name = "reactions"};
properties = {
to = {type = "string"; xml = {attribute = true; name = "id"}};
- reactions = {type = "array"; items = {type = "string"; xml = {name = "reaction"}}};
+ -- should be assumed to be array since it has 'items'
+ reactions = { items = { xml = { name = "reaction" } } };
};
};
stanza_ids = {
@@ -190,7 +191,8 @@ describe("util.datamapper", function()
version = {
type = "object";
xml = {name = "query"; namespace = "jabber:iq:version"};
- properties = {name = "string"; version = "string"; os = "string"};
+ -- properties should be assumed to be strings
+ properties = {name = true; version = {}; os = {}};
};
};
};
diff --git a/spec/util_jsonschema_spec.lua b/spec/util_jsonschema_spec.lua
new file mode 100644
index 00000000..74da2c07
--- /dev/null
+++ b/spec/util_jsonschema_spec.lua
@@ -0,0 +1,102 @@
+local js = require "util.jsonschema";
+local json = require "util.json";
+local lfs = require "lfs";
+
+-- https://github.com/json-schema-org/JSON-Schema-Test-Suite.git 2.0.0-550-g88d6948
+local test_suite_dir = "spec/JSON-Schema-Test-Suite/tests/draft2020-12"
+if lfs.attributes(test_suite_dir, "mode") ~= "directory" then return end
+
+-- Tests to skip and short reason why (NYI = not yet implemented)
+local skip = {
+ ["ref.json:0:3"] = "NYI additionalProperties";
+ ["ref.json:3:2"] = "FIXME investigate, util.jsonpath issue?",
+ ["ref.json:6:1"] = "NYI",
+ ["required.json:0:2"] = "distinguishing objects from arrays",
+ ["additionalProperties.json:0:2"] = "distinguishing objects from arrays",
+ ["additionalProperties.json:0:5"] = "NYI",
+ ["additionalProperties.json:1:0"] = "NYI",
+ ["anchor.json"] = "$anchor NYI",
+ ["const.json:1"] = "deepcompare",
+ ["const.json:13:2"] = "IEEE 754 equality",
+ ["const.json:2"] = "deepcompare",
+ ["const.json:8"] = "deepcompare",
+ ["const.json:9"] = "deepcompare",
+ ["contains.json:0:5"] = "distinguishing objects from arrays",
+ ["defs.json"] = "need built-in meta-schema",
+ ["dependentRequired.json"] = "NYI",
+ ["dependentSchemas.json"] = "NYI",
+ ["dynamicRef.json"] = "NYI",
+ ["enum.json:1:3"] = "deepcompare",
+ ["id.json"] = "NYI",
+ ["maxContains.json"] = "NYI",
+ ["maxLength.json:0:4"] = "UTF-16",
+ ["maxProperties.json"] = "NYI",
+ ["minContains.json"] = "NYI",
+ ["minLength.json:0:4"] = "UTF-16",
+ ["minProperties.json"] = "NYI",
+ ["multipleOf.json:1"] = "multiples of IEEE 754 fractions",
+ ["multipleOf.json:2"] = "multiples of IEEE 754 fractions",
+ ["pattern.json"] = "NYI",
+ ["patternProperties.json"] = "NYI",
+ ["properties.json:1:2"] = "NYI",
+ ["properties.json:1:3"] = "NYI",
+ ["ref.json:14"] = "NYI",
+ ["ref.json:15"] = "NYI",
+ ["ref.json:16"] = "NYI",
+ ["ref.json:17"] = "NYI",
+ ["ref.json:18"] = "NYI",
+ ["ref.json:13"] = "NYI",
+ ["ref.json:19"] = "NYI",
+ ["ref.json:11"] = "NYI",
+ ["ref.json:12:1"] = "FIXME",
+ ["refRemote.json"] = "DEFINITELY NYI",
+ ["type.json:3:4"] = "distinguishing objects from arrays",
+ ["type.json:3:6"] = "null is weird",
+ ["type.json:4:3"] = "distinguishing objects from arrays",
+ ["type.json:4:6"] = "null is weird",
+ ["type.json:9:4"] = "null is weird",
+ ["type.json:9:6"] = "null is weird",
+ ["unevaluatedItems.json"] = "NYI",
+ ["unevaluatedProperties.json"] = "NYI",
+ ["uniqueItems.json:0:11"] = "deepcompare",
+ ["uniqueItems.json:0:13"] = "deepcompare",
+ ["uniqueItems.json:0:14"] = "deepcompare",
+ ["uniqueItems.json:0:22"] = "deepcompare",
+ ["uniqueItems.json:0:24"] = "deepcompare",
+ ["uniqueItems.json:0:9"] = "deepcompare",
+ ["unknownKeyword.json"] = "NYI",
+ ["vocabulary.json"] = "NYI",
+};
+
+local function label(s, i)
+ return string.format("%s:%d", s, i-1);
+end
+
+describe("util.jsonschema.validate", function()
+ for test_case_file in lfs.dir(test_suite_dir) do
+ -- print(skip[test_case_file] and "do " or "skip", test_case_file)
+ if test_case_file:sub(-5) == ".json" and not skip[test_case_file] then
+ describe(test_case_file, function()
+ local test_cases;
+ setup(function()
+ local f = assert(io.open(test_suite_dir .. "/" .. test_case_file));
+ local rawdata = assert(f:read("*a"), "failed to read " .. test_case_file)
+ test_cases = assert(json.decode(rawdata), "failed to parse " .. test_case_file)
+ end)
+ describe("tests", function()
+ for i, schema_test in ipairs(test_cases) do
+ local generic_label = label(test_case_file, i);
+ describe(schema_test.description or generic_label, function()
+ for j, test in ipairs(schema_test.tests) do
+ local specific_label = label(generic_label, j);
+ ((skip[generic_label] or skip[specific_label]) and pending or it)(test.description, function()
+ assert.equal(test.valid, js.validate(schema_test.schema, test.data), specific_label .. " " .. test.description);
+ end)
+ end
+ end)
+ end
+ end)
+ end)
+ end
+ end
+end);