Compare commits

...

4 Commits

Author SHA1 Message Date
ukrocks007 dd256bbaea lint fixes 2024-05-06 18:53:50 +05:30
ukrocks007 eefba3a921 feat: e2e tests 2024-05-06 18:52:13 +05:30
ukrocks007 7e363e8231 lint fixes 2024-05-06 15:26:08 +05:30
ukrocks007 ab52092548 feat: Add getDirectoryByProduct function for retrieving a directory by product 2024-05-06 15:22:25 +05:30
5 changed files with 252 additions and 1 deletions

View File

@ -1,4 +1,5 @@
import { expect, type APIRequestContext } from '@playwright/test';
import { Directory } from 'npm/src';
const directoryBase = {
tenant: 'api-boxyhq',
@ -25,6 +26,18 @@ export const directoryExpected = {
webhook: { endpoint: 'https://example.com', secret: 'secret' },
};
export const updateDirectory = async (request: APIRequestContext, directory: Directory, data: any) => {
const response = await request.patch(`/api/v1/dsync/${directory.id}`, {
data,
});
expect(response.ok()).toBe(true);
expect(response.status()).toBe(200);
const { data: updatedDirectory } = await response.json();
return updatedDirectory;
};
export const createDirectory = async (request: APIRequestContext, payload: typeof directoryPayload) => {
const response = await request.post('/api/v1/dsync', {
data: {
@ -59,6 +72,21 @@ export const getDirectory = async (
return data;
};
export const getDirectoryByProduct = async (request: APIRequestContext, { product }: { product: string }) => {
const response = await request.get('/api/v1/dsync/product', {
params: {
product,
},
});
expect(response.ok()).toBe(true);
expect(response.status()).toBe(200);
const { data } = await response.json();
return data;
};
export const deleteDirectory = async (request: APIRequestContext, directoryId: string) => {
const response = await request.delete(`/api/v1/dsync/${directoryId}`);

View File

@ -1,5 +1,5 @@
import { expect, type APIRequestContext } from '@playwright/test';
import type { Directory } from '@boxyhq/saml-jackson';
import type { Directory, Group } from '@boxyhq/saml-jackson';
export const createGroup = async (request: APIRequestContext, directory: Directory, group: any) => {
const response = await request.post(`${directory.scim.path}/Groups`, {
@ -15,6 +15,38 @@ export const createGroup = async (request: APIRequestContext, directory: Directo
return await response.json();
};
export const addGroupMember = async (
request: APIRequestContext,
directory: Directory,
group: Group,
member: string
) => {
const response = await request.patch(`${directory.scim.path}/Groups/${group.id}`, {
data: {
Operations: [
{
action: 'addGroupMember',
op: 'add',
path: 'members',
value: [
{
value: member,
},
],
},
],
},
headers: {
Authorization: `Bearer ${directory.scim.secret}`,
},
});
expect(response.ok()).toBe(true);
expect(response.status()).toBe(200);
return await response.json();
};
export const getGroupByDisplayName = async (
request: APIRequestContext,
directory: Directory,
@ -47,3 +79,17 @@ export const getGroupById = async (request: APIRequestContext, directory: Direct
return await response.json();
};
export const getGroupsByDirectoryId = async (request: APIRequestContext, directory: Directory) => {
const response = await request.get(`${directory.scim.path}/Groups`, {
headers: {
Authorization: `Bearer ${directory.scim.secret}`,
},
});
expect(response.ok()).toBe(true);
expect(response.status()).toBe(200);
const data = await response.json();
return data.Resources;
};

View File

@ -5,6 +5,7 @@ import {
directoryExpected,
directoryPayload,
getDirectory,
getDirectoryByProduct,
} from '../../helpers/directories';
import { options } from '../../helpers/api';
@ -21,6 +22,9 @@ test.beforeAll(async ({ request }) => {
test.afterAll(async ({ request }) => {
const [directory] = await getDirectory(request, { tenant, product });
if (!directory) {
return;
}
await deleteDirectory(request, directory.id);
});
@ -153,3 +157,15 @@ test.describe('PATCH /api/v1/dsync/{directoryId}', () => {
});
});
});
test.describe('GET /api/v1/dsync/product', () => {
test('should be able to get a directory by product', async ({ request }) => {
let directories = await getDirectoryByProduct(request, { product });
expect(directories.length).toBe(1);
await deleteDirectory(request, directories[0].id);
directories = await getDirectoryByProduct(request, { product });
expect(directories.length).toBe(0);
});
});

View File

@ -0,0 +1,110 @@
import { test, expect } from '@playwright/test';
import {
createDirectory,
deleteDirectory,
directoryPayload,
getDirectory,
updateDirectory,
} from '../../helpers/directories';
import groups from '@boxyhq/saml-jackson/test/dsync/data/groups';
import { addGroupMember, createGroup } from '../../helpers/groups';
import { options } from '../../helpers/api';
test.use(options);
const { tenant, product } = { ...directoryPayload, tenant: 'api-boxyhq-3' };
const memberId = 'member1';
test.beforeAll(async ({ request }) => {
let directory = await createDirectory(request, {
...directoryPayload,
tenant,
});
directory = await updateDirectory(request, directory, {
log_webhook_events: true,
});
const group = await createGroup(request, directory, groups[0]);
await addGroupMember(request, directory, group, memberId);
});
test.afterAll(async ({ request }) => {
const [directory] = await getDirectory(request, { tenant, product });
await deleteDirectory(request, directory.id);
});
test.describe('GET /api/v1/dsync/events', () => {
test('should be able to get list of events from a directory', async ({ request }) => {
const [directory] = await getDirectory(request, { tenant, product });
const response = await request.get(`/api/v1/dsync/events`, {
params: {
tenant,
product,
directoryId: directory.id,
},
});
const { data: events } = await response.json();
expect(response.ok()).toBe(true);
expect(response.status()).toBe(200);
expect(events.length).toBe(2);
});
});
test.describe('GET /api/v1/dsync/events/:event', () => {
test('should be able to delete all the events from directory', async ({ request }) => {
const [directory] = await getDirectory(request, { tenant, product });
let response = await request.get(`/api/v1/dsync/events`, {
params: {
directoryId: directory.id,
},
});
const { data: events } = await response.json();
response = await request.get(`/api/v1/dsync/events/${events[0].id}`, {
params: {
tenant,
product,
directoryId: directory.id,
},
});
const { data: event } = await response.json();
expect(response.ok()).toBe(true);
expect(response.status()).toBe(200);
expect(event.status_code).toBe(200);
});
});
test.describe('DELETE /api/v1/dsync/events', () => {
test('should be able to delete all the events from directory', async ({ request }) => {
const [directory] = await getDirectory(request, { tenant, product });
let response = await request.delete(`/api/v1/dsync/events`, {
params: {
directoryId: directory.id,
},
});
response = await request.get(`/api/v1/dsync/events`, {
params: {
tenant,
product,
directoryId: directory.id,
},
});
const { data: events } = await response.json();
expect(response.ok()).toBe(true);
expect(response.status()).toBe(200);
expect(events.length).toBe(0);
});
});

View File

@ -0,0 +1,51 @@
import { test, expect } from '@playwright/test';
import { createDirectory, deleteDirectory, directoryPayload, getDirectory } from '../../helpers/directories';
import groups from '@boxyhq/saml-jackson/test/dsync/data/groups';
import { addGroupMember, createGroup, getGroupsByDirectoryId } from '../../helpers/groups';
import { options } from '../../helpers/api';
test.use(options);
const { tenant, product } = { ...directoryPayload, tenant: 'api-boxyhq-3' };
const memberId = 'member1';
test.beforeAll(async ({ request }) => {
const directory = await createDirectory(request, {
...directoryPayload,
tenant,
});
const group = await createGroup(request, directory, groups[0]);
await addGroupMember(request, directory, group, memberId);
});
test.afterAll(async ({ request }) => {
const [directory] = await getDirectory(request, { tenant, product });
await deleteDirectory(request, directory.id);
});
test.describe('GET /api/v1/dsync/groups/:id/members', () => {
test('should be able to get a group members from a directory', async ({ request }) => {
const [directory] = await getDirectory(request, { tenant, product });
const groups = await getGroupsByDirectoryId(request, directory);
const response = await request.get(`/api/v1/dsync/groups/${groups[0].id}/members`, {
params: {
tenant,
product,
},
});
const { data: directoryMembers } = await response.json();
expect(response.ok()).toBe(true);
expect(response.status()).toBe(200);
expect(directoryMembers.length).toBe(1);
expect(directoryMembers).toMatchObject([
{
user_id: memberId,
},
]);
});
});