/** * TASK-0132 — SCIM email mapping rules (the `userName` → email policy). */ import { describe, expect, it } from "vitest"; import { ScimUsersService } from "../users.service.js"; import { ScimError } from "../scim-errors.js"; const svc = new ScimUsersService(null as never); // toEmail touches no deps const org = (cfg: Record) => ({ id: "org_1", scimConfig: cfg }); describe("toEmail — userName → email mapping", () => { it("userName with @ → verbatim (lowercased)", () => { expect( svc.toEmail({ userName: "Jane@Acme.test" } as never, org({})) ).toBe("jane@acme.test"); }); it("emails[0].value wins over userName", () => { expect( svc.toEmail( { userName: "jane.doe", emails: [{ value: "JANE.DOE@elsewhere.io" }] } as never, org({ userEmailDomain: "acme.test" }) ) ).toBe("jane.doe@elsewhere.io"); }); it("@-less userName + userEmailDomain → @", () => { expect( svc.toEmail({ userName: "jane.doe" } as never, org({ userEmailDomain: "Acme.test" })) ).toBe("jane.doe@acme.test"); }); it("emails[0] present but userName is the fallback source", () => { expect( svc.toEmail( { userName: "jane", emails: [{ value: "jane@acme.test" }, { value: "alt@acme.test" }] } as never, org({}) ) ).toBe("jane@acme.test"); }); it("@-less userName + NO userEmailDomain → 400 invalidValue", () => { try { svc.toEmail({ userName: "jane.doe" } as never, org({})); expect.unreachable("should have thrown"); } catch (e) { expect(e).toBeInstanceOf(ScimError); expect((e as ScimError).status).toBe(400); expect((e as ScimError).scimType).toBe("invalidValue"); } }); });