From b8d6addf28aced41e283becbb4a41fd97f37c26c Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Wed, 5 Apr 2023 10:46:31 -0600 Subject: [PATCH] include new files --- lib/test/config-builder.test.ts | 204 ++++++++++++++++++++++++++++++++ lib/test/config-types.test.ts | 23 ++++ 2 files changed, 227 insertions(+) create mode 100644 lib/test/config-builder.test.ts create mode 100644 lib/test/config-types.test.ts diff --git a/lib/test/config-builder.test.ts b/lib/test/config-builder.test.ts new file mode 100644 index 0000000..7f81b89 --- /dev/null +++ b/lib/test/config-builder.test.ts @@ -0,0 +1,204 @@ +import { testOutput } from "./output.test"; +import { Config } from "../config/builder/config"; +import { List } from "../config/builder/list"; +import { Value } from "../config/builder/value"; +import { Variants } from "../config/builder/variants"; + +describe("builder tests", () => { + test("String", () => { + const bitcoinPropertiesBuilt: { + "peer-tor-address": { + name: string; + description: string | null; + type: "string"; + }; + } = Config.of({ + "peer-tor-address": Value.string({ + name: "Peer tor address", + default: "", + description: "The Tor address of the peer interface", + warning: null, + required: true, + masked: true, + placeholder: null, + pattern: null, + patternDescription: null, + }), + }).build(); + expect(JSON.stringify(bitcoinPropertiesBuilt)).toEqual( + /*json*/ `{ + "peer-tor-address": { + "type": "string", + "default": "", + "description": "The Tor address of the peer interface", + "warning": null, + "masked": true, + "placeholder": null, + "pattern": null, + "patternDescription": null, + "inputmode":"text", + "name": "Peer tor address", + "required": true + }}` + .replaceAll("\n", " ") + .replaceAll(/\s{2,}/g, "") + .replaceAll(": ", ":") + ); + }); +}); + +describe("values", () => { + test("boolean", () => { + const value = Value.boolean({ + name: "Testing", + }); + const validator = value.validator(); + validator.unsafeCast(false); + testOutput()(null); + }); + test("string", () => { + const value = Value.string({ + name: "Testing", + required: false, + }); + const validator = value.validator(); + validator.unsafeCast("test text"); + testOutput()(null); + }); + test("textarea", () => { + const value = Value.textarea({ + name: "Testing", + required: false, + }); + const validator = value.validator(); + validator.unsafeCast("test text"); + testOutput()(null); + }); + test("number", () => { + const value = Value.number({ + name: "Testing", + required: false, + integral: false, + }); + const validator = value.validator(); + validator.unsafeCast(2); + testOutput()(null); + }); + test("select", () => { + const value = Value.select({ + name: "Testing", + required: false, + values: { + a: "A", + b: "B", + }, + }); + const validator = value.validator(); + validator.unsafeCast("a"); + validator.unsafeCast("b"); + testOutput()(null); + }); + test("multiselect", () => { + const value = Value.multiselect({ + name: "Testing", + values: { + a: "A", + b: "B", + }, + }); + const validator = value.validator(); + validator.unsafeCast([]); + validator.unsafeCast(["a", "b"]); + testOutput>()(null); + }); + test("object", () => { + const value = Value.object({ + name: "Testing", + spec: Config.of({ + a: Value.boolean({ + name: "test", + }), + }), + }); + const validator = value.validator(); + validator.unsafeCast({ a: true }); + testOutput()(null); + }); + test("union", () => { + const value = Value.union( + { + name: "Testing", + required: true, + }, + Variants.of({ + a: { + name: "a", + spec: Config.of({ b: Value.boolean({ name: "b" }) }), + }, + }) + ); + const validator = value.validator(); + validator.unsafeCast({ unionSelectKey: "a", unionSelectValue: { b: false } }); + type Test = typeof validator._TYPE; + testOutput()(null); + }); + test("list", () => { + const value = Value.list( + List.number( + { + name: "test", + }, + { + integral: false, + } + ) + ); + const validator = value.validator(); + validator.unsafeCast([1, 2, 3]); + testOutput()(null); + }); +}); + +describe("Builder List", () => { + test("obj", () => { + const value = Value.list( + List.obj( + { + name: "test", + }, + { + spec: Config.of({ test: Value.boolean({ name: "test" }) }), + } + ) + ); + const validator = value.validator(); + validator.unsafeCast([{ test: true }]); + testOutput()(null); + }); + test("string", () => { + const value = Value.list( + List.string( + { + name: "test", + }, + {} + ) + ); + const validator = value.validator(); + validator.unsafeCast(["test", "text"]); + testOutput()(null); + }); + test("number", () => { + const value = Value.list( + List.number( + { + name: "test", + }, + { integral: true } + ) + ); + const validator = value.validator(); + validator.unsafeCast([12, 45]); + testOutput()(null); + }); +}); diff --git a/lib/test/config-types.test.ts b/lib/test/config-types.test.ts new file mode 100644 index 0000000..98a145c --- /dev/null +++ b/lib/test/config-types.test.ts @@ -0,0 +1,23 @@ +import { ListValueSpecOf, ValueSpecList, isValueSpecListOf } from "../config/config-types"; +import { Config } from "../config/builder/config"; +import { List } from "../config/builder/list"; +import { Value } from "../config/builder/value"; + +describe("Config Types", () => { + test("isValueSpecListOf", () => { + const options = [List.obj, List.string, List.number]; + for (const option of options) { + const test = option({} as any, { spec: Config.of({}) } as any) as any; + const someList = Value.list(test).build(); + if (isValueSpecListOf(someList, "string")) { + someList.spec satisfies ListValueSpecOf<"string">; + } else if (isValueSpecListOf(someList, "number")) { + someList.spec satisfies ListValueSpecOf<"number">; + } else if (isValueSpecListOf(someList, "object")) { + someList.spec satisfies ListValueSpecOf<"object">; + } else { + throw new Error("Failed to figure out the type: " + JSON.stringify(someList)); + } + } + }); +});