import { describe, test, expect } from "bun:test"; import { CwMemberController } from "../../../src/controllers/CwMemberController"; // --------------------------------------------------------------------------- // Helpers // --------------------------------------------------------------------------- function buildMockCwMember(overrides: Record = {}) { return { id: "member-1", cwMemberId: 42, identifier: "jdoe", firstName: "John", lastName: "Doe", officeEmail: "jdoe@example.com", inactiveFlag: false, apiKey: null, cwLastUpdated: new Date("2026-02-01"), createdAt: new Date("2026-01-01"), updatedAt: new Date("2026-02-01"), ...overrides, }; } // --------------------------------------------------------------------------- // Tests // --------------------------------------------------------------------------- describe("CwMemberController", () => { // ----------------------------------------------------------------- // Constructor // ----------------------------------------------------------------- describe("constructor", () => { test("sets all public properties from data", () => { const data = buildMockCwMember(); const ctrl = new CwMemberController(data as any); expect(ctrl.id).toBe("member-1"); expect(ctrl.cwMemberId).toBe(42); expect(ctrl.identifier).toBe("jdoe"); expect(ctrl.firstName).toBe("John"); expect(ctrl.lastName).toBe("Doe"); expect(ctrl.officeEmail).toBe("jdoe@example.com"); expect(ctrl.inactiveFlag).toBe(false); expect(ctrl.apiKey).toBeNull(); expect(ctrl.cwLastUpdated).toEqual(new Date("2026-02-01")); expect(ctrl.createdAt).toEqual(new Date("2026-01-01")); expect(ctrl.updatedAt).toEqual(new Date("2026-02-01")); }); test("handles null officeEmail", () => { const data = buildMockCwMember({ officeEmail: null }); const ctrl = new CwMemberController(data as any); expect(ctrl.officeEmail).toBeNull(); }); test("handles apiKey set", () => { const data = buildMockCwMember({ apiKey: "secret-key" }); const ctrl = new CwMemberController(data as any); expect(ctrl.apiKey).toBe("secret-key"); }); }); // ----------------------------------------------------------------- // fullName getter // ----------------------------------------------------------------- describe("fullName", () => { test("returns firstName + lastName", () => { const ctrl = new CwMemberController(buildMockCwMember() as any); expect(ctrl.fullName).toBe("John Doe"); }); test("returns trimmed name when lastName is empty", () => { const ctrl = new CwMemberController( buildMockCwMember({ lastName: "" }) as any, ); expect(ctrl.fullName).toBe("John"); }); test("returns trimmed name when firstName is empty", () => { const ctrl = new CwMemberController( buildMockCwMember({ firstName: "" }) as any, ); expect(ctrl.fullName).toBe("Doe"); }); test("falls back to identifier when both names are empty", () => { const ctrl = new CwMemberController( buildMockCwMember({ firstName: "", lastName: "" }) as any, ); expect(ctrl.fullName).toBe("jdoe"); }); }); // ----------------------------------------------------------------- // mapCwToDb (static) // ----------------------------------------------------------------- describe("mapCwToDb", () => { test("maps CW member fields to DB schema", () => { const cwItem = { identifier: "jdoe", firstName: "John", lastName: "Doe", officeEmail: "jdoe@example.com", inactiveFlag: false, _info: { lastUpdated: "2026-02-01T12:00:00Z" }, }; const result = CwMemberController.mapCwToDb(cwItem as any); expect(result.identifier).toBe("jdoe"); expect(result.firstName).toBe("John"); expect(result.lastName).toBe("Doe"); expect(result.officeEmail).toBe("jdoe@example.com"); expect(result.inactiveFlag).toBe(false); expect(result.cwLastUpdated).toEqual(new Date("2026-02-01T12:00:00Z")); }); test("handles null/missing fields with defaults", () => { const cwItem = { identifier: "empty", firstName: null, lastName: null, officeEmail: null, inactiveFlag: null, _info: null, }; const result = CwMemberController.mapCwToDb(cwItem as any); expect(result.firstName).toBe(""); expect(result.lastName).toBe(""); expect(result.officeEmail).toBeNull(); expect(result.inactiveFlag).toBe(false); expect(result.cwLastUpdated).toBeInstanceOf(Date); }); test("handles undefined _info.lastUpdated", () => { const cwItem = { identifier: "test", firstName: "A", lastName: "B", officeEmail: null, inactiveFlag: false, _info: {}, }; const result = CwMemberController.mapCwToDb(cwItem as any); // Without lastUpdated, falls through to new Date() expect(result.cwLastUpdated).toBeInstanceOf(Date); }); }); // ----------------------------------------------------------------- // toJson // ----------------------------------------------------------------- describe("toJson", () => { test("returns all fields including fullName", () => { const ctrl = new CwMemberController(buildMockCwMember() as any); const json = ctrl.toJson(); expect(json.id).toBe("member-1"); expect(json.cwMemberId).toBe(42); expect(json.identifier).toBe("jdoe"); expect(json.firstName).toBe("John"); expect(json.lastName).toBe("Doe"); expect(json.fullName).toBe("John Doe"); expect(json.officeEmail).toBe("jdoe@example.com"); expect(json.inactiveFlag).toBe(false); expect(json.apiKey).toBeNull(); expect(json.cwLastUpdated).toEqual(new Date("2026-02-01")); expect(json.createdAt).toEqual(new Date("2026-01-01")); expect(json.updatedAt).toEqual(new Date("2026-02-01")); }); test("includes fullName in JSON", () => { const ctrl = new CwMemberController( buildMockCwMember({ firstName: "", lastName: "" }) as any, ); expect(ctrl.toJson().fullName).toBe("jdoe"); }); }); });