import { AvoInspector } from "../AvoInspector"; import { defaultOptions, type } from "./constants"; describe("Schema Parsing", () => { const inspector = new AvoInspector(defaultOptions); beforeAll(() => { inspector.enableLogging(false); }); test("Empty array returned if eventProperties are not set", () => { // @ts-ignore const schema = inspector.extractSchema(); expect(schema).toEqual([]); }); test("Property types and names are set", () => { // Given const eventProperties = { prop0: true, prop1: 1, prop2: "str", prop3: 0.5, prop4: undefined, prop5: null, prop6: { an: "object" }, prop7: [ "a", "list", { "obj in list": true, "int field": 1, }, ["another", "list"], [1, 2], ], }; // When const res = inspector.extractSchema(eventProperties); // Then res.forEach(({ propertyName }, index) => { expect(propertyName).toBe(`prop${index}`); }); expect(res[0].propertyType).toBe(type.BOOL); expect(res[1].propertyType).toBe(type.INT); expect(res[2].propertyType).toBe(type.STRING); expect(res[3].propertyType).toBe(type.FLOAT); expect(res[4].propertyType).toBe(type.NULL); expect(res[5].propertyType).toBe(type.NULL); expect(res[6].propertyType).toBe(type.OBJECT); expect(res[6].children).toMatchObject([ { propertyName: "an", propertyType: type.STRING, }, ]); expect(res[7].propertyType).toBe(type.STRINGLIST); expect(res[7].children).toMatchObject([ type.STRING, [ { propertyName: "obj in list", propertyType: type.BOOL, }, { propertyName: "int field", propertyType: type.INT, }, ], [type.STRING], [type.INT], ]); }); test("Duplicated values are removed", () => { // Given const eventProperties = { prop0: ["true", "false", true, 10, "true", true, 11, 10, 0.1, 0.1], }; // When const res = inspector.extractSchema(eventProperties); // Then expect(res[0].propertyType).toBe(type.STRINGLIST); }); test("Empty and falsy values are set correctly", () => { // Given const eventProperties = { prop0: false, prop1: 0, prop2: "", prop3: 0.0, prop4: undefined, prop5: null, prop6: {}, prop7: [], }; // When const res = inspector.extractSchema(eventProperties); // Then expect(res[0].propertyType).toBe(type.BOOL); expect(res[1].propertyType).toBe(type.INT); expect(res[2].propertyType).toBe(type.STRING); expect(res[3].propertyType).toBe(type.INT); expect(res[4].propertyType).toBe(type.NULL); expect(res[5].propertyType).toBe(type.NULL); expect(res[6].propertyType).toBe(type.OBJECT); expect(res[6].children).toMatchObject([]); expect(res[7].propertyType).toBe(type.STRINGLIST); expect(res[7].children).toMatchObject([]); }); test("List of string returns list(string)", () => { // Given const eventProperties = { prop0: ["a", "b", "c"], }; // When const res = inspector.extractSchema(eventProperties); // Then expect(res[0].propertyType).toBe(type.STRINGLIST); }); test("List of multiple types returns list(`firstType`)", () => { // Given const eventProperties = { prop0: [1.2, "two", {"three": 3}], }; // When const res = inspector.extractSchema(eventProperties); // Then expect(res[0].propertyType).toBe(type.FLOATLIST); }); });