178 lines
4.2 KiB
JavaScript
178 lines
4.2 KiB
JavaScript
'use strict'
|
|
|
|
const { test } = require('node:test')
|
|
|
|
const build = require('..')
|
|
|
|
test('serialize string with quotes - issue #794', (t) => {
|
|
t.plan(2)
|
|
|
|
const schema = {
|
|
type: 'object',
|
|
properties: {
|
|
message: {
|
|
type: 'string'
|
|
}
|
|
}
|
|
}
|
|
|
|
const input = {
|
|
message: 'Error: Property "name" is required'
|
|
}
|
|
|
|
const stringify = build(schema)
|
|
const output = stringify(input)
|
|
|
|
// The output should be valid JSON
|
|
t.assert.doesNotThrow(() => {
|
|
JSON.parse(output)
|
|
}, 'JSON output should be parseable')
|
|
|
|
// The parsed output should match the input
|
|
const parsed = JSON.parse(output)
|
|
t.assert.equal(parsed.message, input.message)
|
|
})
|
|
|
|
test('serialize string with various quote types - issue #794', (t) => {
|
|
t.plan(6)
|
|
|
|
const schema = {
|
|
type: 'string'
|
|
}
|
|
|
|
const stringify = build(schema)
|
|
|
|
// Test double quotes
|
|
const inputDoubleQuotes = 'Property "name" is required'
|
|
const outputDoubleQuotes = stringify(inputDoubleQuotes)
|
|
t.assert.doesNotThrow(() => JSON.parse(outputDoubleQuotes))
|
|
t.assert.equal(JSON.parse(outputDoubleQuotes), inputDoubleQuotes)
|
|
|
|
// Test single quotes (should be fine but test for completeness)
|
|
const inputSingleQuotes = "Property 'name' is required"
|
|
const outputSingleQuotes = stringify(inputSingleQuotes)
|
|
t.assert.doesNotThrow(() => JSON.parse(outputSingleQuotes))
|
|
t.assert.equal(JSON.parse(outputSingleQuotes), inputSingleQuotes)
|
|
|
|
// Test mixed quotes
|
|
const inputMixedQuotes = 'Error: "Property \'name\' is required"'
|
|
const outputMixedQuotes = stringify(inputMixedQuotes)
|
|
t.assert.doesNotThrow(() => JSON.parse(outputMixedQuotes))
|
|
t.assert.equal(JSON.parse(outputMixedQuotes), inputMixedQuotes)
|
|
})
|
|
|
|
test('serialize error-like object with quotes in message - issue #794', (t) => {
|
|
t.plan(2)
|
|
|
|
const schema = {
|
|
type: 'object',
|
|
properties: {
|
|
error: {
|
|
type: 'object',
|
|
properties: {
|
|
message: {
|
|
type: 'string'
|
|
},
|
|
code: {
|
|
type: 'string'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
const input = {
|
|
error: {
|
|
message: 'Validation failed: Property "email" must be a valid email address',
|
|
code: 'VALIDATION_ERROR'
|
|
}
|
|
}
|
|
|
|
const stringify = build(schema)
|
|
const output = stringify(input)
|
|
|
|
// The output should be valid JSON
|
|
t.assert.doesNotThrow(() => {
|
|
JSON.parse(output)
|
|
}, 'JSON output should be parseable')
|
|
|
|
// The parsed output should match the input
|
|
const parsed = JSON.parse(output)
|
|
t.assert.deepEqual(parsed, input)
|
|
})
|
|
|
|
test('serialize validation errors array with quotes - issue #794', (t) => {
|
|
t.plan(2)
|
|
|
|
const schema = {
|
|
type: 'object',
|
|
properties: {
|
|
errors: {
|
|
type: 'array',
|
|
items: {
|
|
type: 'object',
|
|
properties: {
|
|
message: {
|
|
type: 'string'
|
|
},
|
|
field: {
|
|
type: 'string'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
const input = {
|
|
errors: [
|
|
{
|
|
message: 'Property "name" is required',
|
|
field: 'name'
|
|
},
|
|
{
|
|
message: 'Property "email" must be a valid email address',
|
|
field: 'email'
|
|
},
|
|
{
|
|
message: 'Value must be between "1" and "100"',
|
|
field: 'age'
|
|
}
|
|
]
|
|
}
|
|
|
|
const stringify = build(schema)
|
|
const output = stringify(input)
|
|
|
|
// The output should be valid JSON
|
|
t.assert.doesNotThrow(() => {
|
|
JSON.parse(output)
|
|
}, 'JSON output should be parseable')
|
|
|
|
// The parsed output should match the input
|
|
const parsed = JSON.parse(output)
|
|
t.assert.deepEqual(parsed, input)
|
|
})
|
|
|
|
test('serialize string with backslashes and quotes - issue #794', (t) => {
|
|
t.plan(4)
|
|
|
|
const schema = {
|
|
type: 'string'
|
|
}
|
|
|
|
const stringify = build(schema)
|
|
|
|
// Test backslashes
|
|
const inputBackslash = 'Path: C:\\Users\\test\\file.json'
|
|
const outputBackslash = stringify(inputBackslash)
|
|
t.assert.doesNotThrow(() => JSON.parse(outputBackslash))
|
|
t.assert.equal(JSON.parse(outputBackslash), inputBackslash)
|
|
|
|
// Test combination of backslashes and quotes
|
|
const inputMixed = 'Error: Could not find file "C:\\Users\\test\\config.json"'
|
|
const outputMixed = stringify(inputMixed)
|
|
t.assert.doesNotThrow(() => JSON.parse(outputMixed))
|
|
t.assert.equal(JSON.parse(outputMixed), inputMixed)
|
|
})
|