diff --git a/src/clients/workspace-users-client.test.ts b/src/clients/workspace-users-client.test.ts new file mode 100644 index 0000000..8d8393e --- /dev/null +++ b/src/clients/workspace-users-client.test.ts @@ -0,0 +1,62 @@ +import { http, HttpResponse } from 'msw' +import { beforeEach, describe, expect, it } from 'vitest' +import { apiUrl } from '../testUtils/msw-handlers' +import { server } from '../testUtils/msw-setup' +import { mockWorkspaceUser, TEST_API_TOKEN } from '../testUtils/test-defaults' +import { WorkspaceUsersClient } from './workspace-users-client' + +const removedWorkspaceUser = { + ...mockWorkspaceUser, + id: 2, + fullName: 'Removed User', + shortName: 'RU', + removed: true, +} + +describe('WorkspaceUsersClient', () => { + let client: WorkspaceUsersClient + + beforeEach(() => { + client = new WorkspaceUsersClient({ apiToken: TEST_API_TOKEN }) + }) + + describe('getWorkspaceUsers', () => { + it('excludes removed users by default and sends no server-side filter param', async () => { + server.use( + http.get(apiUrl('api/v1/workspace_users/get'), ({ request }) => { + const url = new URL(request.url) + expect(url.searchParams.get('id')).toBe('123') + expect(url.searchParams.has('include_removed')).toBe(false) + expect(url.searchParams.has('with_removed')).toBe(false) + return HttpResponse.json([mockWorkspaceUser, removedWorkspaceUser]) + }), + ) + + const result = await client.getWorkspaceUsers({ workspaceId: 123 }) + + expect(result).toHaveLength(1) + expect(result[0].id).toBe(mockWorkspaceUser.id) + expect(result.some((user) => user.removed)).toBe(false) + }) + + it('includes removed users when includeRemoved is true and sends no server-side filter param', async () => { + server.use( + http.get(apiUrl('api/v1/workspace_users/get'), ({ request }) => { + const url = new URL(request.url) + expect(url.searchParams.get('id')).toBe('123') + expect(url.searchParams.has('include_removed')).toBe(false) + expect(url.searchParams.has('with_removed')).toBe(false) + return HttpResponse.json([mockWorkspaceUser, removedWorkspaceUser]) + }), + ) + + const result = await client.getWorkspaceUsers({ + workspaceId: 123, + includeRemoved: true, + }) + + expect(result).toHaveLength(2) + expect(result.map((user) => user.id)).toEqual([1, 2]) + }) + }) +}) diff --git a/src/clients/workspace-users-client.ts b/src/clients/workspace-users-client.ts index 8b0c60e..b3908fd 100644 --- a/src/clients/workspace-users-client.ts +++ b/src/clients/workspace-users-client.ts @@ -18,9 +18,13 @@ export class WorkspaceUsersClient extends BaseClient { /** * Returns a list of workspace user objects for the given workspace id. * + * Removed users are excluded by default; set `args.includeRemoved` to `true` to include them. + * The Comms API always returns removed users, so the filtering happens client-side. + * * @param args - The arguments for getting workspace users. * @param args.workspaceId - The workspace ID. * @param args.archived - Optional flag to filter archived users. + * @param args.includeRemoved - Include users removed from the workspace. Defaults to `false`. * @returns An array of workspace user objects. * * @example @@ -30,6 +34,7 @@ export class WorkspaceUsersClient extends BaseClient { * ``` */ getWorkspaceUsers(args: GetWorkspaceUsersArgs): Promise { + const includeRemoved = args.includeRemoved ?? false return request({ httpMethod: 'GET', baseUri: this.getBaseUri(), @@ -37,7 +42,12 @@ export class WorkspaceUsersClient extends BaseClient { apiToken: this.apiToken, payload: { id: args.workspaceId, archived: args.archived }, customFetch: this.customFetch, - }).then((response) => response.data.map((user) => WorkspaceUserSchema.parse(user))) + }).then((response) => { + const rawUsers = includeRemoved + ? response.data + : response.data.filter((user) => !user.removed) + return rawUsers.map((user) => WorkspaceUserSchema.parse(user)) + }) } /** diff --git a/src/types/requests.ts b/src/types/requests.ts index ebd631b..2906f3a 100644 --- a/src/types/requests.ts +++ b/src/types/requests.ts @@ -396,6 +396,11 @@ export type RemoveGroupUsersArgs = { export type GetWorkspaceUsersArgs = { workspaceId: number archived?: boolean + /** + * Include users who have been removed from the workspace. Defaults to `false`. + * The Comms API always returns removed users, so the SDK filters them client-side. + */ + includeRemoved?: boolean } export type GetUserByIdArgs = {