Ghost/apps/admin-x-settings/test/acceptance/general/users/invite.test.ts
Ronald Langeveld a596b3aaca
Renamed e2e tests to acceptance tests in Admin X (#18439)
ref https://www.notion.so/AdminX-testing-plan-99b2dab27e794fc893767ccd01c84a63?d=26612fc2b9d84e65bbb269fa3bc5079e&pvs=4#f0089cd4d9f24e93bd7f8e2868987bf6

This pull request renames the end-to-end tests to acceptance tests in
the `apps/admin-x-settings` folder. It updates the `ci.yml` file, the
`package.json` file, the `playwright.config.ts` file, and the test files
to reflect the new naming convention. This change aims to better reflect
the purpose and scope of the tests.
2023-10-03 16:20:40 +07:00

160 lines
6.5 KiB
TypeScript

import {expect, test} from '@playwright/test';
import {globalDataRequests, limitRequests, mockApi, responseFixtures} from '../../../utils/acceptance';
test.describe('User invitations', async () => {
test('Supports inviting a user', async ({page}) => {
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 1);
const {lastApiRequests} = await mockApi({page, requests: {
...globalDataRequests,
browseUsers: {method: 'GET', path: '/users/?limit=100&include=roles', response: responseFixtures.users},
browseInvites: {method: 'GET', path: '/invites/', response: responseFixtures.invites},
browseRoles: {method: 'GET', path: '/roles/?limit=all', response: responseFixtures.roles},
browseAssignableRoles: {method: 'GET', path: '/roles/?limit=all&permissions=assign', response: responseFixtures.roles},
addInvite: {method: 'POST', path: '/invites/', response: {
invites: [
{
id: 'new-invite-id',
role_id: '645453f3d254799990dd0e18',
status: 'sent',
email: 'newuser@test.com',
expires: futureDate.getTime(),
created_at: new Date().toISOString(),
updated_at: new Date().toISOString()
}
]
}}
}});
await page.goto('/');
const section = page.getByTestId('users');
await section.getByRole('button', {name: 'Invite people'}).click();
const modal = page.getByTestId('invite-user-modal');
await modal.getByLabel('Email address').fill('newuser@test.com');
await modal.locator('input[value=author]').check();
await modal.getByRole('button', {name: 'Send invitation now'}).click();
await expect(page.getByTestId('toast-success')).toHaveText(/Invitation successfully sent to newuser@test\.com/);
await section.getByRole('tab', {name: 'Invited'}).click();
const listItem = section.getByTestId('user-invite').last();
await expect(listItem.getByText('newuser@test.com')).toBeVisible();
await expect(listItem.getByText('Author')).toBeVisible();
expect(lastApiRequests.addInvite?.body).toEqual({
invites: [{
email: 'newuser@test.com',
expires: null,
role_id: '645453f3d254799990dd0e18',
status: null,
token: null
}]
});
});
test('Supports resending invitations', async ({page}) => {
const {lastApiRequests} = await mockApi({page, requests: {
...globalDataRequests,
browseUsers: {method: 'GET', path: '/users/?limit=100&include=roles', response: responseFixtures.users},
browseInvites: {method: 'GET', path: '/invites/', response: responseFixtures.invites},
deleteInvite: {method: 'DELETE', path: `/invites/${responseFixtures.invites.invites[0].id}/`, response: {}},
addInvite: {method: 'POST', path: '/invites/', response: responseFixtures.invites}
}});
await page.goto('/');
const section = page.getByTestId('users');
await section.getByRole('tab', {name: 'Invited'}).click();
const listItem = section.getByTestId('user-invite');
await listItem.hover();
await listItem.getByRole('button', {name: 'Resend'}).click();
await expect(page.getByTestId('toast-success')).toHaveText(/Invitation resent! \(invitee@test\.com\)/);
// Resending works by deleting and re-adding the invite
expect(lastApiRequests.deleteInvite?.url).toMatch(new RegExp(`/invites/${responseFixtures.invites.invites[0].id}`));
expect(lastApiRequests.addInvite?.body).toEqual({
invites: [{
email: 'invitee@test.com',
expires: null,
role_id: '645453f3d254799990dd0e18',
status: null,
token: null
}]
});
});
test('Supports revoking invitations', async ({page}) => {
const {lastApiRequests} = await mockApi({page, requests: {
...globalDataRequests,
browseUsers: {method: 'GET', path: '/users/?limit=100&include=roles', response: responseFixtures.users},
browseInvites: {method: 'GET', path: '/invites/', response: responseFixtures.invites},
deleteInvite: {method: 'DELETE', path: `/invites/${responseFixtures.invites.invites[0].id}/`, response: {}}
}});
await page.goto('/');
const section = page.getByTestId('users');
await section.getByRole('tab', {name: 'Invited'}).click();
const listItem = section.getByTestId('user-invite');
await listItem.hover();
await listItem.getByRole('button', {name: 'Revoke'}).click();
await expect(page.getByTestId('toast-success')).toHaveText(/Invitation revoked \(invitee@test\.com\)/);
expect(lastApiRequests.deleteInvite?.url).toMatch(new RegExp(`/invites/${responseFixtures.invites.invites[0].id}`));
});
test('Limits inviting too many staff users', async ({page}) => {
await mockApi({page, requests: {
...globalDataRequests,
...limitRequests,
browseAssignableRoles: {method: 'GET', path: '/roles/?limit=all&permissions=assign', response: responseFixtures.roles},
browseConfig: {
...globalDataRequests.browseConfig,
response: {
config: {
...responseFixtures.config.config,
hostSettings: {
limits: {
staff: {
max: 1,
error: 'Your plan does not support more staff'
}
}
}
}
}
}
}});
await page.goto('/');
const section = page.getByTestId('users');
await section.getByRole('button', {name: 'Invite people'}).click();
const modal = page.getByTestId('invite-user-modal');
await modal.locator('input[value=author]').check();
await expect(modal).toHaveText(/Your plan does not support more staff/);
await modal.locator('input[value=contributor]').check();
await expect(modal).not.toHaveText(/Your plan does not support more staff/);
});
});