mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-19 00:11:49 +03:00
9bfbd5b3b9
refs. https://github.com/TryGhost/Product/issues/3710 --------- Co-authored-by: Jono Mingard <reason.koan@gmail.com>
203 lines
8.2 KiB
TypeScript
203 lines
8.2 KiB
TypeScript
import {expect, test} from '@playwright/test';
|
|
import {globalDataRequests, mockApi, responseFixtures} from '../../../utils/e2e';
|
|
|
|
test.describe('User actions', async () => {
|
|
test('Supports suspending a user', async ({page}) => {
|
|
const userToEdit = responseFixtures.users.users.find(user => user.email === 'author@test.com')!;
|
|
|
|
const {lastApiRequests} = await mockApi({page, requests: {
|
|
...globalDataRequests,
|
|
browseUsers: {method: 'GET', path: '/users/?limit=all&include=roles', response: responseFixtures.users},
|
|
editUser: {method: 'PUT', path: `/users/${userToEdit.id}/?include=roles`, response: {
|
|
users: [{
|
|
...userToEdit,
|
|
status: 'inactive'
|
|
}]
|
|
}}
|
|
}});
|
|
|
|
await page.goto('/');
|
|
|
|
const section = page.getByTestId('users');
|
|
const activeTab = section.locator('[role=tabpanel]:not(.hidden)');
|
|
|
|
await section.getByRole('tab', {name: 'Authors'}).click();
|
|
|
|
const listItem = activeTab.getByTestId('user-list-item').last();
|
|
await listItem.hover();
|
|
await listItem.getByRole('button', {name: 'Edit'}).click();
|
|
|
|
const modal = page.getByTestId('user-detail-modal');
|
|
|
|
await modal.getByRole('button', {name: 'Actions'}).click();
|
|
await page.getByTestId('popover-content').getByRole('button', {name: 'Suspend user'}).click();
|
|
|
|
const confirmation = page.getByTestId('confirmation-modal');
|
|
await confirmation.getByRole('button', {name: 'Suspend'}).click();
|
|
|
|
await expect(modal).toHaveText(/Suspended/);
|
|
|
|
expect(lastApiRequests.editUser?.body).toMatchObject({
|
|
users: [{
|
|
email: 'author@test.com',
|
|
status: 'inactive'
|
|
}]
|
|
});
|
|
});
|
|
|
|
test('Supports un-suspending a user', async ({page}) => {
|
|
const userToEdit = responseFixtures.users.users.find(user => user.email === 'author@test.com')!;
|
|
|
|
const {lastApiRequests} = await mockApi({page, requests: {
|
|
...globalDataRequests,
|
|
browseUsers: {method: 'GET', path: '/users/?limit=all&include=roles', response: {
|
|
users: [
|
|
...responseFixtures.users.users.filter(user => user.email !== 'author@test.com'),
|
|
{
|
|
...userToEdit,
|
|
status: 'inactive'
|
|
}
|
|
]
|
|
}},
|
|
editUser: {method: 'PUT', path: `/users/${userToEdit.id}/?include=roles`, response: {
|
|
users: [{
|
|
...userToEdit,
|
|
status: 'active'
|
|
}]
|
|
}}
|
|
}});
|
|
|
|
await page.goto('/');
|
|
|
|
const section = page.getByTestId('users');
|
|
const activeTab = section.locator('[role=tabpanel]:not(.hidden)');
|
|
|
|
await section.getByRole('tab', {name: 'Authors'}).click();
|
|
|
|
const listItem = activeTab.getByTestId('user-list-item').last();
|
|
await listItem.hover();
|
|
await listItem.getByRole('button', {name: 'Edit'}).click();
|
|
|
|
const modal = page.getByTestId('user-detail-modal');
|
|
|
|
await expect(modal).toHaveText(/Suspended/);
|
|
|
|
await modal.getByRole('button', {name: 'Actions'}).click();
|
|
await page.getByTestId('popover-content').getByRole('button', {name: 'Un-suspend user'}).click();
|
|
|
|
const confirmation = page.getByTestId('confirmation-modal');
|
|
await confirmation.getByRole('button', {name: 'Un-suspend'}).click();
|
|
|
|
await expect(modal).not.toHaveText(/Suspended/);
|
|
|
|
expect(lastApiRequests.editUser?.body).toMatchObject({
|
|
users: [{
|
|
email: 'author@test.com',
|
|
status: 'active'
|
|
}]
|
|
});
|
|
});
|
|
|
|
test('Supports deleting a user', async ({page}) => {
|
|
const authorUser = responseFixtures.users.users.find(user => user.email === 'author@test.com')!;
|
|
|
|
const {lastApiRequests} = await mockApi({page, requests: {
|
|
...globalDataRequests,
|
|
browseUsers: {method: 'GET', path: '/users/?limit=all&include=roles', response: responseFixtures.users},
|
|
deleteUser: {method: 'DELETE', path: `/users/${authorUser.id}/`, response: {}}
|
|
}});
|
|
|
|
await page.goto('/');
|
|
|
|
const section = page.getByTestId('users');
|
|
const activeTab = section.locator('[role=tabpanel]:not(.hidden)');
|
|
|
|
await section.getByRole('tab', {name: 'Authors'}).click();
|
|
|
|
const listItem = activeTab.getByTestId('user-list-item').last();
|
|
await listItem.hover();
|
|
await listItem.getByRole('button', {name: 'Edit'}).click();
|
|
|
|
const modal = page.getByTestId('user-detail-modal');
|
|
|
|
await modal.getByRole('button', {name: 'Actions'}).click();
|
|
await page.getByTestId('popover-content').getByRole('button', {name: 'Delete user'}).click();
|
|
|
|
const confirmation = page.getByTestId('confirmation-modal');
|
|
await confirmation.getByRole('button', {name: 'Delete user'}).click();
|
|
|
|
await expect(page.getByTestId('toast')).toHaveText(/User deleted/);
|
|
await expect(activeTab.getByTestId('user-list-item')).toHaveCount(0);
|
|
|
|
expect(lastApiRequests.deleteUser?.url).toMatch(new RegExp(`/users/${authorUser.id}`));
|
|
});
|
|
|
|
test('Supports transferring ownership to an administrator', async ({page}) => {
|
|
const administrator = responseFixtures.users.users.find(user => user.email === 'administrator@test.com')!;
|
|
|
|
const makeOwnerResponse = {
|
|
users: [
|
|
...responseFixtures.users.users.filter(user => user.email !== 'administrator@test.com' && user.email !== 'owner@test.com'),
|
|
{
|
|
...administrator,
|
|
roles: [responseFixtures.roles.roles.find(role => role.name === 'Owner')!]
|
|
},
|
|
{
|
|
...responseFixtures.users.users.find(user => user.email === 'owner@test.com')!,
|
|
roles: [responseFixtures.roles.roles.find(role => role.name === 'Administrator')!]
|
|
}
|
|
]
|
|
};
|
|
|
|
const {lastApiRequests} = await mockApi({page, requests: {
|
|
...globalDataRequests,
|
|
browseUsers: {method: 'GET', path: '/users/?limit=all&include=roles', response: responseFixtures.users},
|
|
editUser: {method: 'PUT', path: /^\/users\/\w{24}\/\?include=roles$/, response: responseFixtures.users},
|
|
makeOwner: {method: 'PUT', path: '/users/owner/', response: makeOwnerResponse}
|
|
}});
|
|
|
|
await page.goto('/');
|
|
|
|
const section = page.getByTestId('users');
|
|
const activeTab = section.locator('[role=tabpanel]:not(.hidden)');
|
|
const listItem = activeTab.getByTestId('user-list-item').last();
|
|
const modal = page.getByTestId('user-detail-modal');
|
|
|
|
// Can't transfer to a role other than administrator
|
|
|
|
await section.getByRole('tab', {name: 'Editors'}).click();
|
|
|
|
await listItem.hover();
|
|
await listItem.getByRole('button', {name: 'Edit'}).click();
|
|
|
|
await modal.getByRole('button', {name: 'Actions'}).click();
|
|
await expect(page.getByTestId('popover-content').getByRole('button', {name: 'Make owner'})).toHaveCount(0);
|
|
await page.getByTestId('popover-overlay').click();
|
|
|
|
await modal.getByRole('button', {name: 'Close'}).click();
|
|
|
|
// Can transfer to an administrator
|
|
|
|
await section.getByRole('tab', {name: 'Administrators'}).click();
|
|
|
|
await listItem.hover();
|
|
await listItem.getByRole('button', {name: 'Edit'}).click();
|
|
|
|
await modal.getByRole('button', {name: 'Actions'}).click();
|
|
await page.getByTestId('popover-content').getByRole('button', {name: 'Make owner'}).click();
|
|
|
|
const confirmation = page.getByTestId('confirmation-modal');
|
|
await confirmation.getByRole('button', {name: 'Yep — I\'m sure'}).click();
|
|
|
|
await expect(page.getByTestId('toast')).toHaveText(/Ownership transferred/);
|
|
|
|
await expect(section.getByTestId('owner-user')).toHaveText(/administrator@test\.com/);
|
|
|
|
expect(lastApiRequests.makeOwner?.body).toMatchObject({
|
|
owner: [{
|
|
id: administrator.id
|
|
}]
|
|
});
|
|
});
|
|
});
|