Files
optima/tests/unit/controllers/CwMemberController.test.ts
T

182 lines
6.2 KiB
TypeScript

import { describe, test, expect } from "bun:test";
import { CwMemberController } from "../../../src/controllers/CwMemberController";
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
function buildMockCwMember(overrides: Record<string, any> = {}) {
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");
});
});
});