import { test, expect, Page } from '@playwright/test' import { mock } from 'node:test'; const mockGuestsAPI = ({ page }: { page: Page }) => { page.route('*/**/api/default/guests', async route => { if (route.request().method() === 'GET') { const json = [ { "id": "f4a09c28-40ea-4553-90a5-96935a59cac6", "status": "tentative", "name": "Kristofer Rohan DVM", "group": { "id": "ee44ffb9-1147-4842-a378-9eaeb0f0871a", "name": "Pam's family", } }, { "id": "bd585c40-0937-4cde-960a-bb23acfd6f18", "status": "invited", "name": "Olevia Quigley Jr.", "group": { "id": "c8bda6ca-d8af-4bb8-b2bf-e6ec1c21b1e6", "name": "Pam's work", } }, ]; await route.fulfill({ json }) } else if (route.request().method() === 'POST') { const json = { "id": "ff58aa2d-643d-4c29-be9c-50e10ae6853c", "name": "John Snow", "status": "invited", "group": { "id": "c8bda6ca-d8af-4bb8-b2bf-e6ec1c21b1e6", "name": "Pam's work", } }; await route.fulfill({ json }); } }) page.route("*/**/api/default/guests/*", async route => { if (route.request().method() === 'PUT') { const json = { "id": "ff58aa2d-643d-4c29-be9c-50e10ae6853c", "name": "John Fire", "status": "declined", "group": { "id": "ee44ffb9-1147-4842-a378-9eaeb0f0871a", "name": "Pam's family", } } await route.fulfill({ json }); } else if (route.request().method() === 'DELETE') { const json = {} await route.fulfill({ json }); } }); } const mockGroupsAPI = ({ page }: { page: Page }) => { page.route('*/**/api/default/groups', async route => { const json = [ { "id": "ee44ffb9-1147-4842-a378-9eaeb0f0871a", "name": "Pam's family", "icon": "pi pi-users", "parent_id": null, "color": "#ff0000", "attendance": { "total": 3, "considered": 2, "invited": 1, "confirmed": 0, "declined": 0, "tentative": 0 } }, { "id": "c8bda6ca-d8af-4bb8-b2bf-e6ec1c21b1e6", "name": "Pam's work", "icon": "pi pi-desktop", "parent_id": null, "color": "#00ff00", "attendance": { "total": 2, "considered": 0, "invited": 0, "confirmed": 0, "declined": 0, "tentative": 2 } }, ]; await route.fulfill({ json }) }) } test('should allow CRUD on guests', async ({ page }) => { await mockGuestsAPI({ page }); await mockGroupsAPI({ page }); await page.goto('/default/dashboard/guests'); await expect(page.getByRole('button', { name: 'Add new' })).toBeVisible(); await expect(page.getByRole('tab', { name: 'Guests' })).toBeVisible(); await expect(page.getByRole('tab', { name: 'Groups' })).toBeVisible(); await expect(page.getByRole('tab', { name: 'Invitations' })).toBeVisible(); // List all guests await expect(page.getByText('There are 2 elements in the list')).toBeVisible(); await expect(page.getByRole('row')).toHaveCount(3); // 1 header row + 2 data rows await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Kristofer Rohan DVM' })).toBeVisible(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: "Pam's family" })).toBeVisible(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Tentative' })).toBeVisible(); await expect(page.getByRole('row').nth(1).locator('svg')).toHaveCount(2); await expect(page.getByRole('row').nth(2).getByRole('cell', { name: 'Olevia Quigley Jr.' })).toBeVisible(); await expect(page.getByRole('row').nth(2).getByRole('cell', { name: "Pam's work" })).toBeVisible(); await expect(page.getByRole('row').nth(2).getByRole('cell', { name: 'Invited' })).toBeVisible(); await expect(page.getByRole('row').nth(2).locator('svg')).toHaveCount(2); // Add a new guest await page.getByRole('button', { name: 'Add new' }).click(); await page.getByRole('dialog').getByLabel('Name').fill('John Snow'); await page.locator('#group').click(); await page.getByRole('option', { name: "Pam's work" }).click(); await page.locator('#status').click(); await page.getByRole('option', { name: 'Invited' }).click(); await page.getByRole('dialog').getByRole('button', { name: 'Create' }).click(); await expect(page.getByText('There are 3 elements in the list')).toBeVisible(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'John Snow' })).toBeVisible(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: "Pam\'s work" })).toBeVisible(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Invited' })).toBeVisible(); await expect(page.getByRole('row').nth(1).locator('svg')).toHaveCount(2); // Edit the just-added John Snow await page.getByRole('row').nth(1).locator('svg').nth(1).click(); // Click edit icon const dialog = page.getByRole('dialog'); await expect(dialog.getByLabel('Name')).toHaveValue('John Snow'); await dialog.getByLabel('Name').fill('John Fire'); await dialog.locator('#group').click(); await page.getByRole('option', { name: "Pam's family" }).click(); await dialog.locator('#status').click(); await page.getByRole('option', { name: 'Declined' }).click(); await dialog.getByRole('button', { name: 'Update' }).click(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'John Fire' })).toBeVisible(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Pam\'s Family' })).toBeVisible(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Declined' })).toBeVisible(); await expect(page.getByText('There are 3 elements in the list')).toBeVisible(); // Delete John Fire await page.getByRole('row').nth(1).locator('svg').nth(0).click(); // Click delete icon await expect(page.getByText('There are 2 elements in the list')).toBeVisible(); }); test('should display the list of groups', async ({ page }) => { await mockGroupsAPI({ page }); await page.goto('/default/dashboard/guests'); await page.getByRole('tab', { name: 'Groups' }).click(); await expect(page.getByRole('button', { name: 'Add new' })).toBeVisible(); await expect(page.getByRole('button', { name: 'Reset affinities' })).toBeVisible(); await expect(page.getByRole('row')).toHaveCount(3); // 1 header row + 2 data rows await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(0)).toHaveText('Name'); await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(1)).toHaveText('Color'); await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(2)).toHaveText('Confirmed'); await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(3)).toHaveText('Tentative'); await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(4)).toHaveText('Pending'); await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(5)).toHaveText('Declined'); await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(6)).toHaveText('Considered'); await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(7)).toHaveText('Total'); await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(8)).toHaveText('Actions'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toContainText('Pam\'s family'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('0'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('0'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(4)).toHaveText('1'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(5)).toHaveText('0'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(6)).toHaveText('2'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(7)).toHaveText('3'); await expect(page.getByRole('row').nth(1).locator('svg:visible')).toHaveCount(3); await expect(page.getByRole('row').nth(2).getByRole('cell').nth(0)).toContainText('Pam\'s work'); await expect(page.getByRole('row').nth(2).getByRole('cell').nth(2)).toHaveText('0'); await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('2'); await expect(page.getByRole('row').nth(2).getByRole('cell').nth(4)).toHaveText('0'); await expect(page.getByRole('row').nth(2).getByRole('cell').nth(5)).toHaveText('0'); await expect(page.getByRole('row').nth(2).getByRole('cell').nth(6)).toHaveText('0'); await expect(page.getByRole('row').nth(2).getByRole('cell').nth(7)).toHaveText('2'); await expect(page.getByRole('row').nth(2).locator('svg:visible')).toHaveCount(3); });