Skip to content

Commit

Permalink
fix: standalone validation code, tests (fixes #88)
Browse files Browse the repository at this point in the history
  • Loading branch information
epoberezkin committed Mar 10, 2021
1 parent 47a40b5 commit 5e04e67
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 20 deletions.
7 changes: 3 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
"scripts": {
"build": "rm -rf dist && tsc",
"eslint": "eslint \"src/**/*.*s\" \"spec/**/*.*s\"",
"prettier:write": "prettier --write \"./**/*.{md,json,ts,js}\"",
"prettier:check": "prettier --list-different \"./**/*.{md,json,ts,js}\"",
"prettier:write": "prettier --write \"./**/*.{json,ts,js}\"",
"prettier:check": "prettier --list-different \"./**/*.{json,ts,js}\"",
"test-spec": "jest \"spec/*.ts\"",
"test-cov": "jest \"spec/*.ts\" --coverage",
"test": "npm run prettier:check && npm run eslint && npm run build && npm run test-cov",
Expand Down Expand Up @@ -50,7 +50,6 @@
"husky": "^4.3.0",
"jest": "^26.6.3",
"lint-staged": "^10.5.1",
"pre-commit": "^1.2.2",
"prettier": "^2.1.2",
"ts-jest": "^26.4.4",
"typescript": "^4.0.5"
Expand All @@ -62,6 +61,6 @@
}
},
"lint-staged": {
"*.{md,json,yaml,js,ts}": "prettier --write"
"*.{json,yaml,js,ts}": "prettier --write"
}
}
37 changes: 27 additions & 10 deletions spec/object.spec.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import ajvErrors from ".."
import Ajv, {SchemaObject, ErrorObject, ValidateFunction} from "ajv"
import AjvPack from "ajv/dist/standalone/instance"
import assert = require("assert")

function _ajv(verbose?: boolean): Ajv {
return ajvErrors(new Ajv({allErrors: true, verbose, code: {source: true}}))
}

describe("errorMessage value is an object", () => {
let ajvs: Ajv[]
let ajvs: (Ajv | AjvPack)[]

beforeEach(() => {
ajvs = [
ajvErrors(new Ajv({allErrors: true})),
ajvErrors(new Ajv({allErrors: true, verbose: true})),
]
ajvs = [_ajv(), _ajv(true), new AjvPack(_ajv()), new AjvPack(_ajv(true))]
})

describe("keywords", () => {
Expand Down Expand Up @@ -50,7 +52,10 @@ describe("errorMessage value is an object", () => {
assert.strictEqual(err.dataPath, "")
assert.strictEqual(err.schemaPath, "#/errorMessage")
const replacedKeywords = err.params.errors.map((e: ErrorObject) => e.keyword)
assert.deepStrictEqual(replacedKeywords.sort(), expectedErr.sort())
assert.deepStrictEqual(
Array.from(replacedKeywords.sort()),
Array.from(expectedErr.sort())
)
} else {
// original error
assert.strictEqual(err.keyword, expectedErr)
Expand Down Expand Up @@ -134,7 +139,10 @@ describe("errorMessage value is an object", () => {
assert.strictEqual(err.dataPath, "/foo")
assert.strictEqual(err.schemaPath, "#/properties/foo/errorMessage")
const replacedKeywords = err.params.errors.map((e: ErrorObject) => e.keyword)
assert.deepStrictEqual(replacedKeywords.sort(), expectedErr.sort())
assert.deepStrictEqual(
Array.from(replacedKeywords.sort()),
Array.from(expectedErr.sort())
)
} else {
// original error
assert.strictEqual(err.keyword, expectedErr)
Expand Down Expand Up @@ -281,7 +289,10 @@ describe("errorMessage value is an object", () => {
assert.strictEqual(err.dataPath, "")
assert.strictEqual(err.schemaPath, "#/errorMessage")
const replacedKeywords = err.params.errors.map((e: ErrorObject) => e.keyword)
assert.deepStrictEqual(replacedKeywords, Object.keys(expectedErr))
assert.deepStrictEqual(
Array.from(replacedKeywords),
Array.from(Object.keys(expectedErr))
)
} else {
// original error
assert.strictEqual(err.keyword, expectedErr)
Expand Down Expand Up @@ -570,7 +581,10 @@ describe("errorMessage value is an object", () => {
assert((Array.isArray(data) ? /^\/(0|1)$/ : /^\/(foo|bar)$/).test(err.dataPath))
assert.strictEqual(err.schemaPath, "#/errorMessage")
const replacedKeywords = err.params.errors.map((e: ErrorObject) => e.keyword)
assert.deepStrictEqual(replacedKeywords.sort(), expectedErr.sort())
assert.deepStrictEqual(
Array.from(replacedKeywords.sort()),
Array.from(expectedErr.sort())
)
} else {
// original error
assert.strictEqual(err.keyword, expectedErr)
Expand Down Expand Up @@ -620,7 +634,10 @@ describe("errorMessage value is an object", () => {
: schema.errorMessage[expectedErr[0] === "required" ? "required" : "_"]
assert.strictEqual(err.message, expectedMessage)
const replacedKeywords = err.params.errors.map((e: ErrorObject) => e.keyword)
assert.deepStrictEqual(replacedKeywords.sort(), expectedErr.sort())
assert.deepStrictEqual(
Array.from(replacedKeywords.sort()),
Array.from(expectedErr.sort())
)
} else {
// original error
assert.strictEqual(err.keyword, expectedErr)
Expand Down
15 changes: 10 additions & 5 deletions spec/string.spec.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import ajvErrors from ".."
import Ajv, {ErrorObject} from "ajv"
import AjvPack from "ajv/dist/standalone/instance"
import assert = require("assert")

function _ajv(verbose?: boolean): Ajv {
return ajvErrors(new Ajv({allErrors: true, verbose, code: {source: true}}))
}

describe("errorMessage value is a string", () => {
it("should replace all errors with custom error message", () => {
const ajvs = [
ajvErrors(new Ajv({allErrors: true})),
ajvErrors(new Ajv({allErrors: true, verbose: true})),
]
const ajvs = [_ajv(), _ajv(true), new AjvPack(_ajv()), new AjvPack(_ajv(true))]

const schema = {
type: "object",
Expand Down Expand Up @@ -40,7 +42,10 @@ describe("errorMessage value is a string", () => {
const replacedKeywords = err.params.errors.map((e: ErrorObject) => {
return e.keyword
})
assert.deepStrictEqual(replacedKeywords.sort(), expectedReplacedKeywords.sort())
assert.deepStrictEqual(
Array.from(replacedKeywords.sort()),
Array.from(expectedReplacedKeywords.sort())
)
}
})
})
Expand Down
5 changes: 4 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,10 @@ function errorMessage(options: ErrorMessageOptions): CodeKeywordDefinition {
_`${err}.dataPath.indexOf(${dataPath}) === 0`
),
() => {
const childRegex = gen.scopeValue("pattern", {ref: /^\/([^/]*)(?:\/|$)/})
const childRegex = gen.scopeValue("pattern", {
ref: /^\/([^/]*)(?:\/|$)/,
code: _`new RegExp("^\\\/([^/]*)(?:\\\/|$)")`,
})
const matches = gen.const(
"emMatches",
_`${childRegex}.exec(${err}.dataPath.slice(${dataPath}.length))`
Expand Down

0 comments on commit 5e04e67

Please sign in to comment.