Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 0 additions & 101 deletions src/authz-module/data/api.test.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
import { mockHttpClient } from '@src/setupTest';
import {
getTeamMembers,
getUserAssignedRoles,
assignTeamMembersRole,
revokeUserRoles,
getPermissionsByRole,
getLibrary,
getOrgs,
getScopes,
} from './api';
Expand All @@ -31,57 +28,6 @@ describe('API functions', () => {
jest.clearAllMocks();
});

describe('getTeamMembers', () => {
it('should fetch team members successfully', async () => {
const mockResponse = {
data: {
results: [
{ username: 'user1', email: 'user1@example.com' },
],
count: 1,
},
};

mockHttpClient().mockReturnValue({
get: jest.fn().mockResolvedValue(mockResponse),
});

const result = await getTeamMembers('lib:123', mockQuerySettings);

expect(result.results).toHaveLength(1);
expect(result.count).toBe(1);
expect(getAuthenticatedHttpClient).toHaveBeenCalled();
});

it('should handle all query parameters', async () => {
const mockResponse = { data: { results: [], count: 0 } };
const mockGet = jest.fn().mockResolvedValue(mockResponse);
mockHttpClient().mockReturnValue({
get: mockGet,
});

const queryWithAllParams = {
roles: 'admin,editor',
search: 'test user',
sortBy: 'username',
order: 'desc' as const,
scopes: null,
organizations: null,
pageSize: 20,
pageIndex: 2,
};

await getTeamMembers('lib:123', queryWithAllParams);

expect(mockGet).toHaveBeenCalled();
const calledUrl = mockGet.mock.calls[0][0];
expect(calledUrl.toString()).toContain('roles=admin%2Ceditor');
expect(calledUrl.toString()).toContain('search=test+user');
expect(calledUrl.toString()).toContain('sort_by=username');
expect(calledUrl.toString()).toContain('order=desc');
});
});

describe('getUserAssignedRoles', () => {
it('should fetch user assignments successfully', async () => {
const mockResponse = {
Expand Down Expand Up @@ -188,53 +134,6 @@ describe('API functions', () => {
});
});

describe('getPermissionsByRole', () => {
it('should fetch permissions by role successfully', async () => {
const mockResponse = {
data: {
results: [
{ role: 'admin', permissions: ['read', 'write'], userCount: 5 },
],
},
};

mockHttpClient().mockReturnValue({
get: jest.fn().mockResolvedValue(mockResponse),
});

const result = await getPermissionsByRole('lib:123');

expect(result).toHaveLength(1);
expect(result[0].role).toBe('admin');
expect(getAuthenticatedHttpClient).toHaveBeenCalled();
});
});

describe('getLibrary', () => {
it('should fetch library successfully', async () => {
const mockResponse = {
data: {
id: 'lib:123',
org: 'test-org',
title: 'Test Library',
slug: 'test-library',
allow_public_read: false,
},
};

mockHttpClient().mockReturnValue({
get: jest.fn().mockResolvedValue(mockResponse),
});

const result = await getLibrary('lib:123');

expect(result.id).toBe('lib:123');
expect(result.title).toBe('Test Library');
expect(result.allowPublicRead).toBe(false);
expect(getAuthenticatedHttpClient).toHaveBeenCalled();
});
});

describe('getOrgs', () => {
it('should fetch organizations successfully', async () => {
const mockResponse = {
Expand Down
56 changes: 2 additions & 54 deletions src/authz-module/data/api.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
import {
LibraryMetadata, Org, Scope, TeamMember,
UserRole,
} from '@src/types';
import { Org, Scope, UserRole } from '@src/types';
import { camelCaseObject } from '@edx/frontend-platform';
import { getApiUrl, getStudioApiUrl } from '@src/data/utils';
import { getApiUrl } from '@src/data/utils';

export interface QuerySettings {
roles: string | null;
Expand All @@ -17,11 +14,6 @@ export interface QuerySettings {
pageIndex: number;
}

export interface GetTeamMembersResponse {
results: TeamMember[];
count: number;
}

export interface GetUserAssignmentsResponse {
results: UserRole[];
count: number;
Expand All @@ -47,11 +39,6 @@ export interface DeleteRevokeUserRolesResponse {
}[],
}

export type PermissionsByRole = {
role: string;
permissions: string[];
userCount: number;
};
export interface PutAssignTeamMembersRoleResponse {
completed: { userIdentifier: string; status: string }[];
errors: { userIdentifier: string; scope: string; error: string }[];
Expand Down Expand Up @@ -106,26 +93,6 @@ export interface GetScopesParams {
managementPermissionOnly?: boolean;
}

export const getTeamMembers = async (object: string, querySettings: QuerySettings): Promise<GetTeamMembersResponse> => {
const url = new URL(getApiUrl(`/api/authz/v1/roles/users/?scope=${object}`));

if (querySettings.roles) {
url.searchParams.set('roles', querySettings.roles);
}
if (querySettings.search) {
url.searchParams.set('search', querySettings.search);
}
if (querySettings.sortBy && querySettings.order) {
url.searchParams.set('sort_by', querySettings.sortBy);
url.searchParams.set('order', querySettings.order);
}
url.searchParams.set('page_size', querySettings.pageSize.toString());
url.searchParams.set('page', (querySettings.pageIndex + 1).toString());

const { data } = await getAuthenticatedHttpClient().get(url);
return camelCaseObject(data);
};

export const assignTeamMembersRole = async (
data: AssignTeamMembersRoleRequest,
): Promise<PutAssignTeamMembersRoleResponse> => {
Expand All @@ -143,25 +110,6 @@ export const validateUsers = async (
return camelCaseObject(res.data);
};

// TODO: this should be replaced in the future with Console API
export const getLibrary = async (libraryId: string): Promise<LibraryMetadata> => {
const { data } = await getAuthenticatedHttpClient().get(getStudioApiUrl(`/api/libraries/v2/${libraryId}/`));
return {
id: data.id,
org: data.org,
title: data.title,
slug: data.slug,
allowPublicRead: data.allow_public_read,
};
};

export const getPermissionsByRole = async (scope: string): Promise<PermissionsByRole[]> => {
const url = new URL(getApiUrl('/api/authz/v1/roles/'));
url.searchParams.append('scope', scope);
const { data } = await getAuthenticatedHttpClient().get(url);
return camelCaseObject(data.results);
};

export const revokeUserRoles = async (
data: RevokeUserRolesRequest,
): Promise<DeleteRevokeUserRolesResponse> => {
Expand Down
Loading