Default to nulls and update tests

This commit is contained in:
Ola Hungerford
2025-02-27 21:33:37 -07:00
parent 6ec82e21b1
commit 44982e6c97
5 changed files with 120 additions and 33 deletions

View File

@@ -7,40 +7,42 @@ import { JsonSchemaType } from "../../components/DynamicJsonForm";
describe("generateDefaultValue", () => {
test("generates default string", () => {
expect(generateDefaultValue({ type: "string" })).toBe("");
expect(generateDefaultValue({ type: "string", required: true })).toBe("");
});
test("generates default number", () => {
expect(generateDefaultValue({ type: "number" })).toBe(0);
expect(generateDefaultValue({ type: "number", required: true })).toBe(0);
});
test("generates default integer", () => {
expect(generateDefaultValue({ type: "integer" })).toBe(0);
expect(generateDefaultValue({ type: "integer", required: true })).toBe(0);
});
test("generates default boolean", () => {
expect(generateDefaultValue({ type: "boolean" })).toBe(false);
expect(generateDefaultValue({ type: "boolean", required: true })).toBe(false);
});
test("generates default array", () => {
expect(generateDefaultValue({ type: "array" })).toEqual([]);
expect(generateDefaultValue({ type: "array", required: true })).toEqual([]);
});
test("generates default empty object", () => {
expect(generateDefaultValue({ type: "object" })).toEqual({});
expect(generateDefaultValue({ type: "object", required: true })).toEqual({});
});
test("generates default null for unknown types", () => {
expect(generateDefaultValue({ type: "unknown" as any })).toBe(null);
// @ts-expect-error Testing with invalid type
expect(generateDefaultValue({ type: "unknown", required: true })).toBe(null);
});
test("generates object with properties", () => {
const schema: JsonSchemaType = {
type: "object",
required: true,
properties: {
name: { type: "string" },
age: { type: "number" },
isActive: { type: "boolean" },
name: { type: "string", required: true },
age: { type: "number", required: true },
isActive: { type: "boolean", required: true },
},
};
expect(generateDefaultValue(schema)).toEqual({
@@ -53,15 +55,18 @@ describe("generateDefaultValue", () => {
test("handles nested objects", () => {
const schema: JsonSchemaType = {
type: "object",
required: true,
properties: {
user: {
type: "object",
required: true,
properties: {
name: { type: "string" },
name: { type: "string", required: true },
address: {
type: "object",
required: true,
properties: {
city: { type: "string" },
city: { type: "string", required: true },
},
},
},
@@ -135,7 +140,8 @@ describe("validateValueAgainstSchema", () => {
test("returns true for unknown types", () => {
expect(
validateValueAgainstSchema("anything", { type: "unknown" as any }),
// @ts-expect-error Testing with invalid type
validateValueAgainstSchema("anything", { type: "unknown" }),
).toBe(true);
});
});

View File

@@ -4,9 +4,19 @@ import { JsonObject } from "./jsonPathUtils";
/**
* Generates a default value based on a JSON schema type
* @param schema The JSON schema definition
* @returns A default value matching the schema type
* @returns A default value matching the schema type, or null for non-required fields
*/
export function generateDefaultValue(schema: JsonSchemaType): JsonValue {
if ("default" in schema) {
// Ensure we don't return undefined even if schema.default is undefined
return schema.default === undefined ? null : schema.default;
}
if (!schema.required) {
return null;
}
switch (schema.type) {
case "string":
return "";
@@ -18,12 +28,15 @@ export function generateDefaultValue(schema: JsonSchemaType): JsonValue {
case "array":
return [];
case "object": {
if (!schema.properties) return {};
const obj: JsonObject = {};
if (schema.properties) {
Object.entries(schema.properties).forEach(([key, prop]) => {
obj[key] = generateDefaultValue(prop);
Object.entries(schema.properties)
.filter(([, prop]) => prop.required)
.forEach(([key, prop]) => {
const value = generateDefaultValue(prop);
obj[key] = value;
});
}
return obj;
}
default:
@@ -53,13 +66,19 @@ export function validateValueAgainstSchema(
value: JsonValue,
schema: JsonSchemaType,
): boolean {
// Handle undefined values for non-required fields
if (value === undefined && !schema.required) {
return true;
}
// Basic type validation
switch (schema.type) {
case "string":
return typeof value === "string";
case "number":
case "integer":
return typeof value === "number";
case "integer":
return typeof value === "number" && Number.isInteger(value);
case "boolean":
return typeof value === "boolean";
case "array":
@@ -68,6 +87,8 @@ export function validateValueAgainstSchema(
return (
typeof value === "object" && value !== null && !Array.isArray(value)
);
case "null":
return value === null;
default:
return true;
}