189 lines
6.2 KiB
TypeScript
189 lines
6.2 KiB
TypeScript
import { describe, test, expect } from "bun:test";
|
|
import { CompanyController } from "../../../src/controllers/CompanyController";
|
|
import { buildMockCompany } from "../../setup";
|
|
|
|
const mockCwData = {
|
|
company: {
|
|
addressLine1: "123 Main St",
|
|
addressLine2: null,
|
|
city: "Springfield",
|
|
state: "IL",
|
|
zip: "62701",
|
|
country: { name: "United States" },
|
|
_info: { contacts_href: "" },
|
|
} as any,
|
|
defaultContact: {
|
|
id: 100,
|
|
firstName: "John",
|
|
lastName: "Doe",
|
|
inactiveFlag: false,
|
|
title: "CEO",
|
|
defaultPhoneNbr: "555-1234",
|
|
communicationItems: [
|
|
{ type: { name: "Email" }, value: "john@test.com" },
|
|
{ type: { name: "Phone" }, value: "555-1234" },
|
|
],
|
|
} as any,
|
|
allContacts: [] as any[],
|
|
};
|
|
|
|
describe("CompanyController", () => {
|
|
// -------------------------------------------------------------------
|
|
// Constructor
|
|
// -------------------------------------------------------------------
|
|
describe("constructor", () => {
|
|
test("sets public properties from company data", () => {
|
|
const data = buildMockCompany();
|
|
const ctrl = new CompanyController(data);
|
|
expect(ctrl.id).toBe("company-1");
|
|
expect(ctrl.name).toBe("Test Company");
|
|
expect(ctrl.cw_Identifier).toBe("TestCo");
|
|
expect(ctrl.cw_CompanyId).toBe(123);
|
|
});
|
|
|
|
test("accepts optional CW data", () => {
|
|
const data = buildMockCompany();
|
|
const ctrl = new CompanyController(data, mockCwData);
|
|
expect(ctrl.cw_Data).toBeDefined();
|
|
expect(ctrl.cw_Data?.company.city).toBe("Springfield");
|
|
});
|
|
|
|
test("cw_Data is undefined when not provided", () => {
|
|
const data = buildMockCompany();
|
|
const ctrl = new CompanyController(data);
|
|
expect(ctrl.cw_Data).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
// -------------------------------------------------------------------
|
|
// toJson
|
|
// -------------------------------------------------------------------
|
|
describe("toJson()", () => {
|
|
test("returns base fields without options", () => {
|
|
const ctrl = new CompanyController(buildMockCompany(), mockCwData);
|
|
const json = ctrl.toJson();
|
|
expect(json.id).toBe("company-1");
|
|
expect(json.name).toBe("Test Company");
|
|
expect(json.cw_Identifier).toBe("TestCo");
|
|
expect(json.cw_CompanyId).toBe(123);
|
|
});
|
|
|
|
test("excludes address when includeAddress is false", () => {
|
|
const ctrl = new CompanyController(buildMockCompany(), mockCwData);
|
|
const json = ctrl.toJson({
|
|
includeAddress: false,
|
|
includePrimaryContact: false,
|
|
});
|
|
expect(json.cw_Data.address).toBeUndefined();
|
|
});
|
|
|
|
test("includes address when includeAddress is true", () => {
|
|
const ctrl = new CompanyController(buildMockCompany(), mockCwData);
|
|
const json = ctrl.toJson({
|
|
includeAddress: true,
|
|
includePrimaryContact: false,
|
|
});
|
|
expect(json.cw_Data.address).toBeDefined();
|
|
expect(json.cw_Data.address!.city).toBe("Springfield");
|
|
expect(json.cw_Data.address!.state).toBe("IL");
|
|
});
|
|
|
|
test("includes primary contact when includePrimaryContact is true", () => {
|
|
const ctrl = new CompanyController(buildMockCompany(), mockCwData);
|
|
const json = ctrl.toJson({
|
|
includeAddress: false,
|
|
includePrimaryContact: true,
|
|
});
|
|
expect(json.cw_Data.primaryContact).toBeDefined();
|
|
expect(json.cw_Data.primaryContact!.firstName).toBe("John");
|
|
expect(json.cw_Data.primaryContact!.lastName).toBe("Doe");
|
|
expect(json.cw_Data.primaryContact!.email).toBe("john@test.com");
|
|
});
|
|
|
|
test("excludes primary contact when includePrimaryContact is false", () => {
|
|
const ctrl = new CompanyController(buildMockCompany(), mockCwData);
|
|
const json = ctrl.toJson({
|
|
includeAddress: false,
|
|
includePrimaryContact: false,
|
|
});
|
|
expect(json.cw_Data.primaryContact).toBeUndefined();
|
|
});
|
|
|
|
test("includes allContacts when includeAllContacts is true", () => {
|
|
const cwDataWithContacts = {
|
|
...mockCwData,
|
|
allContacts: [
|
|
{
|
|
id: 200,
|
|
firstName: "Jane",
|
|
lastName: "Smith",
|
|
inactiveFlag: false,
|
|
title: "CTO",
|
|
defaultPhoneNbr: "555-5678",
|
|
communicationItems: [
|
|
{ type: { name: "Email" }, value: "jane@test.com" },
|
|
],
|
|
} as any,
|
|
],
|
|
};
|
|
const ctrl = new CompanyController(
|
|
buildMockCompany(),
|
|
cwDataWithContacts,
|
|
);
|
|
const json = ctrl.toJson({
|
|
includeAddress: false,
|
|
includePrimaryContact: false,
|
|
includeAllContacts: true,
|
|
});
|
|
expect(json.cw_Data.allContacts).toBeDefined();
|
|
expect(json.cw_Data.allContacts).toHaveLength(1);
|
|
expect(json.cw_Data.allContacts![0]!.firstName).toBe("Jane");
|
|
});
|
|
|
|
test("email is null when no Email communication item", () => {
|
|
const noEmailCw = {
|
|
...mockCwData,
|
|
defaultContact: {
|
|
...mockCwData.defaultContact,
|
|
communicationItems: [{ type: { name: "Phone" }, value: "555" }],
|
|
},
|
|
};
|
|
const ctrl = new CompanyController(buildMockCompany(), noEmailCw);
|
|
const json = ctrl.toJson({
|
|
includeAddress: false,
|
|
includePrimaryContact: true,
|
|
});
|
|
expect(json.cw_Data.primaryContact!.email).toBeNull();
|
|
});
|
|
|
|
test("email is null when communicationItems is missing", () => {
|
|
const noCIData = {
|
|
...mockCwData,
|
|
defaultContact: {
|
|
...mockCwData.defaultContact,
|
|
communicationItems: undefined,
|
|
},
|
|
};
|
|
const ctrl = new CompanyController(buildMockCompany(), noCIData);
|
|
const json = ctrl.toJson({
|
|
includeAddress: false,
|
|
includePrimaryContact: true,
|
|
});
|
|
expect(json.cw_Data.primaryContact!.email).toBeNull();
|
|
});
|
|
|
|
test("country defaults to United States when null", () => {
|
|
const noCntry = {
|
|
...mockCwData,
|
|
company: { ...mockCwData.company, country: null },
|
|
};
|
|
const ctrl = new CompanyController(buildMockCompany(), noCntry);
|
|
const json = ctrl.toJson({
|
|
includeAddress: true,
|
|
includePrimaryContact: false,
|
|
});
|
|
expect(json.cw_Data.address!.country).toBe("United States");
|
|
});
|
|
});
|
|
});
|