From f35abf46c98c848cbc5255fd23454d8cc06c610f Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Fri, 17 Jan 2025 09:46:57 -0400 Subject: [PATCH] Fix `FlatFileSchemaResolver` messing up `$recursiveRef` Signed-off-by: Juan Cruz Viotti --- .../jsonschema_flat_file_resolver_test.cc | 25 ++++++++++++++++++ test/jsonschema/jsonschema_relativize_test.cc | 26 +++++++++++++++++++ .../schemas/2019-09-recursive-ref.json | 8 ++++++ 3 files changed, 59 insertions(+) create mode 100644 test/jsonschema/schemas/2019-09-recursive-ref.json diff --git a/test/jsonschema/jsonschema_flat_file_resolver_test.cc b/test/jsonschema/jsonschema_flat_file_resolver_test.cc index 6c9707126..b24a07bff 100644 --- a/test/jsonschema/jsonschema_flat_file_resolver_test.cc +++ b/test/jsonschema/jsonschema_flat_file_resolver_test.cc @@ -273,3 +273,28 @@ TEST(JSONSchema_FlatFileSchemaResolver, case_insensitive_reidentify) { EXPECT_TRUE(resolver("https://EXAMPLE.com").has_value()); EXPECT_TRUE(resolver("https://example.com").has_value()); } + +TEST(JSONSchema_FlatFileSchemaResolver, with_recursive_ref) { + sourcemeta::jsontoolkit::FlatFileSchemaResolver resolver; + const auto schema_path{std::filesystem::path{SCHEMAS_PATH} / + "2019-09-recursive-ref.json"}; + + const sourcemeta::jsontoolkit::JSON expected = + sourcemeta::jsontoolkit::parse(R"JSON({ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "https://www.sourcemeta.com/2019-09-recursive-ref.json", + "$recursiveAnchor": true, + "additionalProperties": { + "$recursiveRef": "#" + } + })JSON"); + + const auto &identifier{resolver.add(schema_path)}; + EXPECT_EQ(identifier, + "https://www.sourcemeta.com/2019-09-recursive-ref.json"); + EXPECT_TRUE(resolver("https://www.sourcemeta.com/2019-09-recursive-ref.json") + .has_value()); + EXPECT_EQ( + resolver("https://www.sourcemeta.com/2019-09-recursive-ref.json").value(), + expected); +} diff --git a/test/jsonschema/jsonschema_relativize_test.cc b/test/jsonschema/jsonschema_relativize_test.cc index dbbbc60d7..aba9e11af 100644 --- a/test/jsonschema/jsonschema_relativize_test.cc +++ b/test/jsonschema/jsonschema_relativize_test.cc @@ -316,3 +316,29 @@ TEST(JSONSchema_relativize, 2020_12_2) { EXPECT_EQ(schema, expected); } + +TEST(JSONSchema_relativize, recursive_ref) { + auto schema = sourcemeta::jsontoolkit::parse(R"JSON({ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "https://www.sourcemeta.com", + "$recursiveAnchor": true, + "additionalProperties": { + "$recursiveRef": "#" + } + })JSON"); + + sourcemeta::jsontoolkit::relativize( + schema, sourcemeta::jsontoolkit::default_schema_walker, + sourcemeta::jsontoolkit::official_resolver); + + const auto expected = sourcemeta::jsontoolkit::parse(R"JSON({ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "https://www.sourcemeta.com", + "$recursiveAnchor": true, + "additionalProperties": { + "$recursiveRef": "#" + } + })JSON"); + + EXPECT_EQ(schema, expected); +} diff --git a/test/jsonschema/schemas/2019-09-recursive-ref.json b/test/jsonschema/schemas/2019-09-recursive-ref.json new file mode 100644 index 000000000..910af14c1 --- /dev/null +++ b/test/jsonschema/schemas/2019-09-recursive-ref.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "https://www.sourcemeta.com/2019-09-recursive-ref.json", + "$recursiveAnchor": true, + "additionalProperties": { + "$recursiveRef": "#" + } +}