Skip to content

Commit 9a401d1

Browse files
authored
Test transformers that remove identifiers (#1644)
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent 69fcfff commit 9a401d1

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

test/jsonschema/jsonschema_transform_rules.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,4 +314,28 @@ class ExampleRuleDefinitionsToDefsWithRereference final
314314
}
315315
};
316316

317+
class ExampleRuleRemoveIdentifiers final
318+
: public sourcemeta::core::SchemaTransformRule {
319+
public:
320+
ExampleRuleRemoveIdentifiers()
321+
: sourcemeta::core::SchemaTransformRule("example_rule_remove_identifiers",
322+
"Remove all identifiers") {};
323+
324+
[[nodiscard]] auto condition(const sourcemeta::core::JSON &schema,
325+
const sourcemeta::core::JSON &,
326+
const sourcemeta::core::Vocabularies &,
327+
const sourcemeta::core::SchemaFrame &,
328+
const sourcemeta::core::SchemaFrame::Location &,
329+
const sourcemeta::core::SchemaWalker &,
330+
const sourcemeta::core::SchemaResolver &) const
331+
-> sourcemeta::core::SchemaTransformRule::Result override {
332+
return schema.is_object() &&
333+
(schema.defines("$id") || schema.defines("$anchor"));
334+
}
335+
336+
auto transform(sourcemeta::core::JSON &schema) const -> void override {
337+
schema.erase_keys({"$id", "$anchor"});
338+
}
339+
};
340+
317341
#endif

test/jsonschema/jsonschema_transformer_test.cc

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ TEST(JSONSchema_transformer, rereference_not_hit) {
747747
EXPECT_EQ(document, expected);
748748
}
749749

750-
TEST(JSONSchema_transformer, rereference_not_fixed) {
750+
TEST(JSONSchema_transformer, rereference_not_fixed_ref) {
751751
sourcemeta::core::SchemaTransformer bundle;
752752
bundle.add<ExampleRuleDefinitionsToDefsNoRereference>();
753753

@@ -791,6 +791,79 @@ TEST(JSONSchema_transformer, rereference_not_fixed) {
791791
EXPECT_EQ(document, expected);
792792
}
793793

794+
TEST(JSONSchema_transformer, rereference_not_fixed_id) {
795+
sourcemeta::core::SchemaTransformer bundle;
796+
bundle.add<ExampleRuleRemoveIdentifiers>();
797+
798+
sourcemeta::core::JSON document = sourcemeta::core::parse_json(R"JSON({
799+
"$schema": "https://json-schema.org/draft/2020-12/schema",
800+
"$id": "https://example.com",
801+
"$ref": "helper",
802+
"$defs": {
803+
"helper": {
804+
"$id": "helper"
805+
}
806+
}
807+
})JSON");
808+
809+
TestTransformTraces entries;
810+
const bool result =
811+
bundle.apply(document, sourcemeta::core::schema_official_walker,
812+
sourcemeta::core::schema_official_resolver,
813+
transformer_callback_trace(entries));
814+
815+
EXPECT_TRUE(result);
816+
EXPECT_EQ(entries.size(), 0);
817+
818+
// The reference is now just treated as an external one
819+
820+
const sourcemeta::core::JSON expected = sourcemeta::core::parse_json(R"JSON({
821+
"$schema": "https://json-schema.org/draft/2020-12/schema",
822+
"$ref": "helper",
823+
"$defs": {
824+
"helper": {}
825+
}
826+
})JSON");
827+
828+
EXPECT_EQ(document, expected);
829+
}
830+
831+
TEST(JSONSchema_transformer, rereference_not_fixed_anchor) {
832+
sourcemeta::core::SchemaTransformer bundle;
833+
bundle.add<ExampleRuleRemoveIdentifiers>();
834+
835+
sourcemeta::core::JSON document = sourcemeta::core::parse_json(R"JSON({
836+
"$schema": "https://json-schema.org/draft/2020-12/schema",
837+
"$ref": "#helper",
838+
"$defs": {
839+
"helper": {
840+
"$anchor": "helper"
841+
}
842+
}
843+
})JSON");
844+
845+
TestTransformTraces entries;
846+
const bool result =
847+
bundle.apply(document, sourcemeta::core::schema_official_walker,
848+
sourcemeta::core::schema_official_resolver,
849+
transformer_callback_trace(entries));
850+
851+
EXPECT_TRUE(result);
852+
EXPECT_EQ(entries.size(), 0);
853+
854+
// The reference is now just treated as an external one
855+
856+
const sourcemeta::core::JSON expected = sourcemeta::core::parse_json(R"JSON({
857+
"$schema": "https://json-schema.org/draft/2020-12/schema",
858+
"$ref": "#helper",
859+
"$defs": {
860+
"helper": {}
861+
}
862+
})JSON");
863+
864+
EXPECT_EQ(document, expected);
865+
}
866+
794867
TEST(JSONSchema_transformer, rereference_fixed_1) {
795868
sourcemeta::core::SchemaTransformer bundle;
796869
bundle.add<ExampleRuleDefinitionsToDefsWithRereference>();

0 commit comments

Comments
 (0)