Skip to content

Commit c6364c9

Browse files
fixed:format test failure
Signed-off-by: Diya <[email protected]>
1 parent 3f94311 commit c6364c9

File tree

4 files changed

+159
-10
lines changed

4 files changed

+159
-10
lines changed

src/error-handlers/format.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,32 @@ const format = async (normalizedErrors, instance, localization) => {
1111
/** @type ErrorObject[] */
1212
const errors = [];
1313

14-
if (normalizedErrors["https://json-schema.org/keyword/format"]) {
15-
for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/format"]) {
16-
if (!normalizedErrors["https://json-schema.org/keyword/format"][schemaLocation]) {
17-
const keyword = await getSchema(schemaLocation);
18-
errors.push({
19-
message: localization.getFormatErrorMessage(Schema.value(keyword)),
20-
instanceLocation: Instance.uri(instance),
21-
schemaLocation: schemaLocation
22-
});
14+
const formats = [
15+
"https://json-schema.org/keyword/draft-2020-12/format",
16+
"https://json-schema.org/keyword/draft-2019-09/format",
17+
"https://json-schema.org/keyword/draft-07/format",
18+
"https://json-schema.org/keyword/draft-06/format",
19+
"https://json-schema.org/keyword/draft-04/format",
20+
];
21+
22+
for (const formatKeyword of formats) {
23+
if (!normalizedErrors[formatKeyword]) {
24+
continue;
25+
}
26+
27+
for (const schemaLocation in normalizedErrors[formatKeyword]) {
28+
const valid = normalizedErrors[formatKeyword][schemaLocation];
29+
if (valid) {
30+
continue;
2331
}
32+
33+
const keyword = await getSchema(schemaLocation);
34+
35+
errors.push({
36+
message: localization.getFormatErrorMessage(Schema.value(keyword)),
37+
instanceLocation: Instance.uri(instance),
38+
schemaLocation
39+
});
2440
}
2541
}
2642

src/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import arrayRangeErrorHandler from "./error-handlers/array-range-handler.js";
5050
import constErrorHandler from "./error-handlers/const.js";
5151
import containsErrorHandler from "./error-handlers/contains.js";
5252
import enumErrorHandler from "./error-handlers/enum.js";
53+
import format from "./normalization-handlers/format.js";
5354
import formatErrorHandler from "./error-handlers/format.js";
5455
import multipleOfErrorHandler from "./error-handlers/multipleOf.js";
5556
import notErrorHandler from "./error-handlers/not.js";
@@ -83,6 +84,11 @@ setNormalizationHandler("https://json-schema.org/keyword/dependentSchema", depen
8384
setNormalizationHandler("https://json-schema.org/keyword/definitions", definitions);
8485
setNormalizationHandler("https://json-schema.org/keyword/else", elseKeyword);
8586
setNormalizationHandler("https://json-schema.org/keyword/enum", enumKeyword);
87+
setNormalizationHandler("https://json-schema.org/keyword/draft-2020-12/format", format);
88+
setNormalizationHandler("https://json-schema.org/keyword/draft-2019-09/format", format);
89+
setNormalizationHandler("https://json-schema.org/keyword/draft-07/format", format);
90+
setNormalizationHandler("https://json-schema.org/keyword/draft-06/format", format);
91+
setNormalizationHandler("https://json-schema.org/keyword/draft-04/format", format);
8692
setNormalizationHandler("https://json-schema/keyword/exclusiveMaximum", exclusiveMaximum);
8793
setNormalizationHandler("https://json-schema/keyword/exclusiveMinimum", exclusiveMinimum);
8894
setNormalizationHandler("https://json-schema.org/keyword/items", items);

src/keyword-error-message.test.js

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import { registerSchema } from "@hyperjump/json-schema/draft-2020-12";
44
import { unregisterSchema } from "@hyperjump/json-schema";
55
import { getSchemaDescription } from "./schema-descriptions.js";
66
import { Localization } from "./localization.js";
7+
import "@hyperjump/json-schema/draft-04";
8+
import "@hyperjump/json-schema/draft-06";
9+
import "@hyperjump/json-schema/draft-2019-09";
10+
import "@hyperjump/json-schema/draft-07";
711

812
/**
913
* @import { OutputFormat} from "./index.d.ts"
@@ -639,7 +643,7 @@ describe("Error messages", async () => {
639643
}]);
640644
});
641645

642-
test("format: email", async () => {
646+
test("format: email (draft-2020-12)", async () => {
643647
registerSchema({
644648
$schema: "https://json-schema.org/draft/2020-12/schema",
645649
format: "email"
@@ -666,6 +670,117 @@ describe("Error messages", async () => {
666670
]);
667671
});
668672

673+
test("format: email (draft-2019-09)", async () => {
674+
registerSchema({
675+
$schema: "https://json-schema.org/draft/2019-09/schema",
676+
format: "email"
677+
}, schemaUri);
678+
679+
const instance = "not-an-email";
680+
const output = {
681+
valid: false,
682+
errors: [
683+
{
684+
absoluteKeywordLocation: "https://example.com/main#/format",
685+
instanceLocation: "#"
686+
}
687+
]
688+
};
689+
690+
const result = await betterJsonSchemaErrors(output, schemaUri, instance);
691+
expect(result.errors).to.eql([
692+
{
693+
schemaLocation: "https://example.com/main#/format",
694+
instanceLocation: "#",
695+
message: localization.getFormatErrorMessage("email")
696+
}
697+
]);
698+
});
699+
700+
test("format: email (draft-07)", async () => {
701+
registerSchema({
702+
$schema: "http://json-schema.org/draft-07/schema",
703+
format: "email"
704+
}, schemaUri);
705+
706+
const instance = "not-an-email";
707+
const output = {
708+
valid: false,
709+
errors: [
710+
{
711+
absoluteKeywordLocation: "https://example.com/main#/format",
712+
instanceLocation: "#"
713+
}
714+
]
715+
};
716+
717+
const result = await betterJsonSchemaErrors(output, schemaUri, instance);
718+
expect(result.errors).to.eql([
719+
{
720+
schemaLocation: "https://example.com/main#/format",
721+
instanceLocation: "#",
722+
message: localization.getFormatErrorMessage("email")
723+
}
724+
]);
725+
});
726+
727+
test("format: email (draft-06)", async () => {
728+
registerSchema({
729+
$schema: "http://json-schema.org/draft-06/schema",
730+
format: "email"
731+
}, schemaUri);
732+
733+
const instance = "not-an-email";
734+
const output = {
735+
valid: false,
736+
errors: [
737+
{
738+
absoluteKeywordLocation: "https://example.com/main#/format",
739+
instanceLocation: "#"
740+
}
741+
]
742+
};
743+
744+
const result = await betterJsonSchemaErrors(output, schemaUri, instance);
745+
746+
expect(result.errors).to.eql([
747+
{
748+
schemaLocation: "https://example.com/main#/format",
749+
instanceLocation: "#",
750+
message: localization.getFormatErrorMessage("email")
751+
}
752+
]);
753+
});
754+
755+
test("format: email (draft-04)", async () => {
756+
757+
registerSchema({
758+
$schema: "http://json-schema.org/draft-04/schema",
759+
format: "email"
760+
}, schemaUri);
761+
762+
const instance = "not-an-email";
763+
const output = {
764+
valid: false,
765+
errors: [
766+
{
767+
absoluteKeywordLocation: "https://example.com/main#/format",
768+
instanceLocation: "#"
769+
}
770+
]
771+
};
772+
773+
const result = await betterJsonSchemaErrors(output, schemaUri, instance);
774+
775+
expect(result.errors).to.eql([
776+
{
777+
schemaLocation: "https://example.com/main#/format",
778+
instanceLocation: "#",
779+
message: localization.getFormatErrorMessage("email")
780+
}
781+
]);
782+
});
783+
669784
test("pattern", async () => {
670785
registerSchema({
671786
$schema: "https://json-schema.org/draft/2020-12/schema",
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* @import { KeywordHandler } from "../index.d.ts"
3+
*/
4+
5+
/** @type KeywordHandler */
6+
const format = {
7+
appliesTo() {
8+
return true;
9+
}
10+
};
11+
12+
export default format;

0 commit comments

Comments
 (0)