Path: blob/main/tests/unit/schema-validation/error-narrowing.test.ts
6451 views
/*1* error-narrowing.test.ts2*3* Unit tests regarding the YAML validation error narrowing heuristics4*5* Copyright (C) 2022 Posit Software, PBC6*7*/89import {10assertYamlValidationFails,11expectValidationError,12schemaFromString,13yamlValidationUnitTest,14} from "./utils.ts";15import {16readAndValidateYamlFromMappedString,17ValidationError,18} from "../../../src/core/lib/yaml-schema/validated-yaml.ts";19import { asMappedString } from "../../../src/core/lib/mapped-text.ts";20import { Schema } from "../../../src/core/lib/yaml-schema/types.ts";2122const readAndThrow = async (str: string, schema: Schema): Promise<unknown> => {23const { yaml, yamlValidationErrors } =24await readAndValidateYamlFromMappedString(25asMappedString(str),26schema,27);28if (yamlValidationErrors.length) {29throw new ValidationError("this should throw", yamlValidationErrors);30}31return yaml;32};3334// deno-lint-ignore require-await35yamlValidationUnitTest("schema-narrowing", async () => {36const schema = schemaFromString(`37id: schema-test-138record:39baz: number40bar: string41`);42const ymlStr = `43baz: 344`;45assertYamlValidationFails(async () => {46await readAndThrow(ymlStr, schema);47}, (e: ValidationError) =>48expectValidationError(e)49.toHaveLength(1)50.forSchemaPathToEndWith("required"));51});5253yamlValidationUnitTest("schema-narrowing", async () => {54const _s1 = schemaFromString(`55id: navigation-item-test-156anyOf:57- path58- object:59properties:60href:61string:62description: |63Link to file contained with the project or external URL64url:65hidden: true66string:67description: |68Alias for href69file:70hidden: true71string:72description: |73Alias for href74text:75string:76description: |77Text to display for navigation item (defaults to the78document title if not provided)79icon:80string:81description:82short: Name of bootstrap icon (e.g. \`github\`, \`twitter\`, \`share\`)83long: |84Name of bootstrap icon (e.g. \`github\`, \`twitter\`, \`share\`)85See <https://icons.getbootstrap.com/> for a list of available icons86aria-label:87string:88description: "Accessible label for the navigation item."89menu:90arrayOf:91schema:92ref: navigation-item-test-193closed: true94`);9596const _s2 = schemaFromString(`97id: chapter-item-test-198anyOf:99- ref: navigation-item-test-1100- record:101part:102path:103description: "Part title or path to input file"104chapters:105arrayOf:106ref: navigation-item-test-1107description: "Path to chapter input file"108`);109110const s3 = schemaFromString(`111id: chapter-list-test-1112arrayOf:113ref: chapter-item-test-1114`);115116const ymlStr = `117- part: "Hardening"118chapters:119- hardening/hardening.qmd120- text: "Set Up SSL"121file: hardening/set_up_ssl.qmd122- hardening/browser_security.qmd123- hardening/r_session_security.qmd124- hardening/database.qmd125- hardening/other.qmd126- hardening/example_secure_configuration.qmd127- part: "-----"128`;129130await assertYamlValidationFails(async () => {131await readAndThrow(ymlStr, s3);132}, (e: ValidationError) => {133return expectValidationError(e)134.toHaveLength(1)135.forSchemaPathToEndWith("required");136});137});138139yamlValidationUnitTest("error-narrowing", async () => {140const schema = schemaFromString(`141id: error-narrowing-schema-test142anyOf:143- string144- record:145foo: string146bar: string`);147148await assertYamlValidationFails(async () => {149await readAndThrow("foo: bar", schema);150}, (e: ValidationError) => {151return expectValidationError(e)152.toHaveLength(1)153.forSchemaPathToEndWith("required");154});155});156157158