Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
3a0fb3d
Use full schema (schema-base.yaml) for coverage
handrews Jun 13, 2025
0fadf2e
Do not expect coverage of unreachable schema
handrews Jun 13, 2025
f66d94c
Fix spelling
handrews Jun 13, 2025
d986f88
Fix coverage calculation
handrews Jun 13, 2025
20eec3a
Remove stray commented-out line.
handrews Jun 13, 2025
8136caa
Use full schema-base to run schema tests
handrews Jun 13, 2025
3a0a025
Use matching jsonSchemaDialect
handrews Jun 12, 2025
0c75419
Update scripts/schema-test-coverage.mjs
handrews Jun 13, 2025
835059f
Merge pull request #4702 from handrews/redundant
ralfhandl Jun 13, 2025
b862c2e
Merge pull request #4701 from handrews/cov-main
ralfhandl Jun 13, 2025
fec632d
Merge pull request #4707 from OAI/main
ralfhandl Jun 13, 2025
3b6551c
Fix typos
handrews Jun 13, 2025
1873c23
Merge pull request #4708 from handrews/fixit
ralfhandl Jun 13, 2025
eee4d20
Merge pull request #4709 from OAI/main
handrews Jun 13, 2025
ea3dd41
Set exit code only if base branch is not dev
ralfhandl Jun 14, 2025
4765634
Merge pull request #4712 from ralfhandl/main-base-branch-for-schema-t…
handrews Jun 14, 2025
5d06d24
Merge pull request #4715 from OAI/main
handrews Jun 14, 2025
60f359f
Determine OAS Base Vocab name
ralfhandl Jun 14, 2025
dee2baa
Determine OAS Base Vocab name from meta.yaml
ralfhandl Jun 14, 2025
ce4ecec
Merge pull request #4720 from ralfhandl/main-determine-dialect
handrews Jun 14, 2025
b173b48
Merge pull request #4721 from OAI/main
ralfhandl Jun 14, 2025
0703eb2
Merge pull request #4719 from ralfhandl/dev-determine-dialect
handrews Jun 14, 2025
bdfbbcf
Merge remote-tracking branch 'upstream/dev' into 3.2-merge-dev
ralfhandl Jun 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/schema-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ name: schema-test
#

# run this on push to any branch and creation of pull-requests
on:
push: {}
on:
pull_request: {}
workflow_dispatch: {}

Expand All @@ -33,3 +32,5 @@ jobs:

- name: Run tests
run: npm run test
env:
BASE: ${{ github.event.pull_request.base.ref }}
71 changes: 14 additions & 57 deletions scripts/schema-test-coverage.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import { readdir, readFile } from "node:fs/promises";
import YAML from "yaml";
import { join } from "node:path";
import { argv } from "node:process";
import { registerSchema, validate } from "@hyperjump/json-schema/draft-2020-12";
import { registerSchema, validate } from "@hyperjump/json-schema/openapi-3-1";
import "@hyperjump/json-schema/draft-04";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";

/**
* @import { EvaluationPlugin } from "@hyperjump/json-schema/experimental"
Expand Down Expand Up @@ -118,65 +118,22 @@ const runTests = async (schemaUri, testDirectory) => {
};
};

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

const parseYamlFromFile = (filePath) => {
const schemaYaml = readFileSync(filePath, "utf8");
return YAML.parse(schemaYaml, { prettyErrors: true });
};
registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));

const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

defineVocabulary(oasBaseVocab, {
"discriminator": "https://spec.openapis.org/oas/3.0/keyword/discriminator",
"example": "https://spec.openapis.org/oas/3.0/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/3.0/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/3.0/keyword/xml"
});

registerSchema(meta);
registerSchema(parseYamlFromFile("./src/schemas/validation/dialect.yaml"));
registerSchema(parseYamlFromFile("./src/schemas/validation/schema.yaml"));

Expand Down
4 changes: 1 addition & 3 deletions scripts/schema-test-coverage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,11 @@

[[ ! -e src/schemas ]] && exit 0

branch=$(git branch --show-current)

echo
echo "Schema Test Coverage"
echo

node scripts/schema-test-coverage.mjs src/schemas/validation/schema-base.yaml tests/schema/pass
rc=$?

[[ "$branch" == "dev" ]] || exit $rc
[[ "$BASE" == "dev" ]] || exit $rc
65 changes: 11 additions & 54 deletions tests/schema/schema.test.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { readdirSync, readFileSync } from "node:fs";
import YAML from "yaml";
import { registerSchema, validate, setMetaSchemaOutputFormat } from "@hyperjump/json-schema/openapi-3-1";
import { BASIC, addKeyword, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { BASIC, defineVocabulary } from "@hyperjump/json-schema/experimental";
import { describe, test, expect } from "vitest";

import contentTypeParser from "content-type";
Expand All @@ -26,67 +26,24 @@ const parseYamlFromFile = (filePath) => {

setMetaSchemaOutputFormat(BASIC);

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
interpret: (discriminator, instance, context) => {
return true;
},
/* discriminator is not exactly an annotation, but it's not allowed
* to change the validation outcome (hence returing true from interopret())
* and for our purposes of testing, this is sufficient.
*/
annotation: (discriminator) => {
return discriminator;
},
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/example",
interpret: (example, instance, context) => {
return true;
},
annotation: (example) => {
return example;
},
});
const meta = parseYamlFromFile("./src/schemas/validation/meta.yaml");
const oasBaseVocab = Object.keys(meta.$vocabulary)[0];

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
interpret: (externalDocs, instance, context) => {
return true;
},
annotation: (externalDocs) => {
return externalDocs;
},
defineVocabulary(oasBaseVocab, {
"discriminator": "https://spec.openapis.org/oas/3.0/keyword/discriminator",
"example": "https://spec.openapis.org/oas/3.0/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/3.0/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/3.0/keyword/xml"
});

addKeyword({
id: "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
interpret: (xml, instance, context) => {
return true;
},
annotation: (xml) => {
return xml;
},
});

defineVocabulary(
"https://spec.openapis.org/oas/3.2/vocab/base",
{
"discriminator": "https://spec.openapis.org/oas/schema/vocab/keyword/discriminator",
"example": "https://spec.openapis.org/oas/schema/vocab/keyword/example",
"externalDocs": "https://spec.openapis.org/oas/schema/vocab/keyword/externalDocs",
"xml": "https://spec.openapis.org/oas/schema/vocab/keyword/xml",
},
);

registerSchema(parseYamlFromFile("./src/schemas/validation/meta.yaml"));
registerSchema(meta);
registerSchema(parseYamlFromFile("./src/schemas/validation/dialect.yaml"));
registerSchema(parseYamlFromFile("./src/schemas/validation/schema.yaml"));

const validateOpenApi = await validate("./src/schemas/validation/schema-base.yaml");
const fixtures = './tests/schema';

describe("v3.2", () => {
describe("v3.1", () => {
describe("Pass", () => {
readdirSync(`${fixtures}/pass`, { withFileTypes: true })
.filter((entry) => entry.isFile() && /\.yaml$/.test(entry.name))
Expand Down