1
4import { describe, expect, it } from "vitest";
5import { ScimUsersService } from "../users.service.js";
6import { ScimError } from "../scim-errors.js";
7
8const svc = new ScimUsersService(null as never);
9
10const org = (cfg: Record<string, unknown>) => ({ id: "org_1", scimConfig: cfg });
11
12describe("toEmail — userName → email mapping", () => {
13 it("userName with @ → verbatim (lowercased)", () => {
14 expect(
15 svc.toEmail({ userName: "Jane@Acme.test" } as never, org({}))
16 ).toBe("jane@acme.test");
17 });
18
19 it("emails[0].value wins over userName", () => {
20 expect(
21 svc.toEmail(
22 {
23 userName: "jane.doe",
24 emails: [{ value: "JANE.DOE@elsewhere.io" }]
25 } as never,
26 org({ userEmailDomain: "acme.test" })
27 )
28 ).toBe("jane.doe@elsewhere.io");
29 });
30
31 it("@-less userName + userEmailDomain → <userName>@<domain>", () => {
32 expect(
33 svc.toEmail({ userName: "jane.doe" } as never, org({ userEmailDomain: "Acme.test" }))
34 ).toBe("jane.doe@acme.test");
35 });
36
37 it("emails[0] present but userName is the fallback source", () => {
38 expect(
39 svc.toEmail(
40 {
41 userName: "jane",
42 emails: [{ value: "jane@acme.test" }, { value: "alt@acme.test" }]
43 } as never,
44 org({})
45 )
46 ).toBe("jane@acme.test");
47 });
48
49 it("@-less userName + NO userEmailDomain → 400 invalidValue", () => {
50 try {
51 svc.toEmail({ userName: "jane.doe" } as never, org({}));
52 expect.unreachable("should have thrown");
53 } catch (e) {
54 expect(e).toBeInstanceOf(ScimError);
55 expect((e as ScimError).status).toBe(400);
56 expect((e as ScimError).scimType).toBe("invalidValue");
57 }
58 });
59});
60