auth-scim.test.ts61 lines · main
| 1 | import { describe, expect, test } from 'bun:test'; |
| 2 | |
| 3 | import { |
| 4 | ScimError, |
| 5 | parseScimEqFilter, |
| 6 | parseScimUserPayload, |
| 7 | scimGroupLocation, |
| 8 | scimUserLocation, |
| 9 | } from './auth-scim.js'; |
| 10 | |
| 11 | describe('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 | }); |