auth-scim.test.ts61 lines · main
1import { describe, expect, test } from 'bun:test';
2
3import {
4 ScimError,
5 parseScimEqFilter,
6 parseScimUserPayload,
7 scimGroupLocation,
8 scimUserLocation,
9} from './auth-scim.js';
10
11describe('auth-scim pure helpers (Phase 9)', () => {
12 test('parseScimUserPayload requires userName and email', () => {
13 expect(() => parseScimUserPayload({})).toThrow(ScimError);
14 expect(() => parseScimUserPayload({ userName: 'not-an-email' })).toThrow(ScimError);
15 });
16
17 test('parseScimUserPayload accepts userName as email', () => {
18 const p = parseScimUserPayload({
19 userName: 'alice@acme.com',
20 displayName: 'Alice',
21 active: true,
22 });
23 expect(p.email).toBe('alice@acme.com');
24 expect(p.userName).toBe('alice@acme.com');
25 expect(p.displayName).toBe('Alice');
26 expect(p.active).toBe(true);
27 });
28
29 test('parseScimUserPayload prefers emails[].value', () => {
30 const p = parseScimUserPayload({
31 userName: 'alice',
32 emails: [{ value: 'alice@corp.io', primary: true }],
33 name: { givenName: 'Alice', familyName: 'A' },
34 });
35 expect(p.email).toBe('alice@corp.io');
36 expect(p.displayName).toBe('Alice A');
37 });
38
39 test('parseScimUserPayload active defaults true; false when set', () => {
40 expect(parseScimUserPayload({ userName: 'a@b.co' }).active).toBe(true);
41 expect(parseScimUserPayload({ userName: 'a@b.co', active: false }).active).toBe(false);
42 });
43
44 test('parseScimEqFilter supports attr eq "value"', () => {
45 expect(parseScimEqFilter(undefined)).toBeNull();
46 expect(parseScimEqFilter('userName eq "alice@acme.com"')).toEqual({
47 attr: 'username',
48 value: 'alice@acme.com',
49 });
50 expect(() => parseScimEqFilter('userName co "x"')).toThrow(ScimError);
51 });
52
53 test('scim locations are project-scoped', () => {
54 expect(scimUserLocation('p_abc', 'scimu_1', 'https://api.briven.tech')).toBe(
55 'https://api.briven.tech/v1/projects/p_abc/scim/v2/Users/scimu_1',
56 );
57 expect(scimGroupLocation('p_abc', 'scimg_1', 'https://api.briven.tech/')).toBe(
58 'https://api.briven.tech/v1/projects/p_abc/scim/v2/Groups/scimg_1',
59 );
60 });
61});