UNPKG

@daiso-tech/core

Version:

The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.

306 lines 13.3 kB
/** * @module Serde */ import { beforeEach } from "vitest"; /** * The `flexibleSerdeTestSuite` function simplifies the process of testing your custom implementation of {@link IFlexibleSerde | `IFlexibleSerde`} with `vitest`. * * IMPORT_PATH: `"@daiso-tech/core/serde/test-utilities"` * @group TestUtilities * @example * ```ts * import { describe, test, expect } from "vitest"; * import { Serde } from "@daiso-tech/core/serde"; * import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/adapters"; * import { flexibleSerdeTestSuite } from "@daiso-tech/core/serde/test-utilities"; * * describe("class: Serde", () => { * flexibleSerdeTestSuite({ * createSerde: () => new Serde(new SuperJsonSerdeAdapter()), * test, * expect, * }); * }); * ``` */ export function flexibleSerdeTestSuite(settings) { const { expect, test, createSerde } = settings; let flexibleSerde; class User { name; age; static deserialize(serializedUser) { return new User(serializedUser.name, serializedUser.age); } constructor(name, age) { this.name = name; this.age = age; } serialize() { return { name: this.name, age: this.age, }; } getInfo() { return `name: ${this.name}, age: ${this.age.toString()}`; } } class ExtendedUser extends User { static deserialize(serializedUser) { return new ExtendedUser(serializedUser.name, serializedUser.age); } } beforeEach(() => { flexibleSerde = createSerde(); }); test("Should work with positive integer", () => { const value = 1; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with negative integer", () => { const value = -1; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with positive decimal", () => { const value = 1.5; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with negative decimal", () => { const value = -1.5; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with NaN", () => { const value = NaN; const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeNaN(); }); test("Should work with Infinity", () => { const value = Infinity; const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(isFinite(deserializedValue)).toBe(false); }); test("Should work with null", () => { const value = null; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with undefined", () => { const value = undefined; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with Bigint", () => { const value = 20n; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with true", () => { const value = true; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with false", () => { const value = false; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with string", () => { const value = "str"; expect(flexibleSerde.deserialize(flexibleSerde.serialize(value))).toBe(value); }); test("Should work with Date", () => { const value = new Date("2024-01-01"); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Date); expect(deserializedValue).toEqual(value); }); test("Should work with RegExp", () => { const value = /test/; const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(RegExp); expect(deserializedValue).toEqual(value); }); test("Should work with Buffer", () => { const value = Buffer.from("asd"); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Buffer); expect(deserializedValue.toString("base64")).toEqual(value.toString("base64")); }); test("Should work with ArrayBuffer", () => { const value = Buffer.from("asd").buffer; const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(ArrayBuffer); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with Uint8Array", () => { const value = new Uint8Array(Buffer.from("asd")); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Uint8Array); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with Int8Array", () => { const value = new Int8Array(Buffer.from("asd")); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Int8Array); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with Uint16Array", () => { const value = new Uint16Array(Buffer.from("asd")); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Uint16Array); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with Int16Array", () => { const value = new Int16Array(Buffer.from("asd")); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Int16Array); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with Uint32Array", () => { const value = new Uint32Array(Buffer.from("asd")); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Uint32Array); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with Int32Array", () => { const value = new Int32Array(Buffer.from("asd")); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Int32Array); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with Float32Array", () => { const value = new Float32Array(Buffer.from("asd")); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Float32Array); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with Float64Array", () => { const value = new Float64Array(Buffer.from("asd")); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Float64Array); expect(Buffer.from(deserializedValue).toString("base64")).toEqual(Buffer.from(value).toString("base64")); }); test("Should work with BigUint64Array", () => { const value = new BigUint64Array(Buffer.from("asd").buffer); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(BigUint64Array); expect(Buffer.from(deserializedValue.buffer).toString("base64")).toEqual(Buffer.from(value.buffer).toString("base64")); }); test("Should work with BigInt64Array", () => { const value = new BigInt64Array(Buffer.from("asd").buffer); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(BigInt64Array); expect(Buffer.from(deserializedValue.buffer).toString("base64")).toEqual(Buffer.from(value.buffer).toString("base64")); }); test("Should work with URL", () => { const value = new URL("../cats", "http://www.example.com/dogs"); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(URL); expect(deserializedValue.toString()).toEqual(deserializedValue.toString()); }); test("Should work with URLSearchParams", () => { const value = new URLSearchParams([ ["a", "1"], ["b", "2"], ]); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(URLSearchParams); expect(deserializedValue.toString()).toEqual(deserializedValue.toString()); }); test("Should work with Set", () => { const value = new Set(["a", "b", "c"]); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Set); expect(deserializedValue).toEqual(value); }); test("Should work with Map", () => { const value = new Map([ ["a", 1], ["b", 2], ["c", 3], ]); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toBeInstanceOf(Map); expect(deserializedValue).toEqual(value); }); test("Should work with array", () => { const value = [ 0, -1, 1, -1.5, 1.5, NaN, Infinity, 2n, true, false, "str", new Date("2024-01-01"), new Set(["a", "b", "c"]), new Map([ ["a", 1], ["b", 2], ["c", 3], ]), /test/, ]; const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toEqual(value); }); test("Should work with object", () => { const value = Object.fromEntries([ ["a", 0], ["b", -1], ["c", 1], ["d", -1.5], ["e", 1.5], ["f", NaN], ["g", Infinity], ["h", 2n], ["j", true], ["l", false], ["i", "str"], ["r", new Date("2024-01-01")], ["k", new Set(["a", "b", "c"])], [ "p", new Map([ ["a", 1], ["b", 2], ["c", 3], ]), ], ["a", /test/], ]); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(value)); expect(deserializedValue).toEqual(value); }); test("Should work with custom registerd classes", () => { flexibleSerde.registerClass(User); const user = new User("Abra", 20); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(user)); expect(deserializedValue).toBeInstanceOf(User); expect(deserializedValue.getInfo()).toBe("name: Abra, age: 20"); }); test("Should work with custom registerd classes that is extended", () => { flexibleSerde.registerClass(ExtendedUser); const user = new ExtendedUser("Abra", 20); const deserializedValue = flexibleSerde.deserialize(flexibleSerde.serialize(user)); expect(deserializedValue).toBeInstanceOf(ExtendedUser); expect(deserializedValue.getInfo()).toBe("name: Abra, age: 20"); }); test("Should work with custom ISerdeTransformer", () => { const transformer = { name: User.name, isApplicable(value) { return (value instanceof User && value.constructor.name === User.name); }, deserialize(serializedValue) { return User.deserialize(serializedValue); }, serialize(deserializedValue) { return deserializedValue.serialize(); }, }; flexibleSerde.registerCustom(transformer); }); } //# sourceMappingURL=flexible-serde.test-suite.js.map