Skip to content

Commit 8156aa1

Browse files
committed
Hold the parity ledger to real tests, and cover more daily flows
Only rows that quote a test or name a test file stay Done; the other 156 are Unverified with what stands in the way. Adds the Zone section and flows.spec.
1 parent 375b538 commit 8156aa1

3 files changed

Lines changed: 412 additions & 220 deletions

File tree

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
import { expect, type Page, test } from '@playwright/test'
2+
import { adminEmail, signIn, signInAsAdmin } from '@/platform/checks/live/session'
3+
4+
/** What a member does day to day beyond each section's own spec, against the real API. */
5+
const chats = (page: Page) => page.getByRole('region', { name: 'Chats', exact: true })
6+
const workspaces = (page: Page) => page.getByRole('region', { name: 'Workspaces', exact: true })
7+
8+
test('a chat pins and marks unread, and both survive a reload', async ({ page }) => {
9+
await signInAsAdmin(page, '/org/settings/members')
10+
await page.goto('/org/home')
11+
const list = chats(page)
12+
await list.getByRole('button', { name: 'Actions for Quarterly review' }).click()
13+
await page.getByRole('menuitem', { name: 'Pin', exact: true }).click()
14+
await page.reload()
15+
await list.getByRole('link', { name: 'Quarterly review' }).hover()
16+
await list.getByRole('button', { name: 'Actions for Quarterly review' }).click()
17+
await expect(page.getByRole('menuitem', { name: 'Unpin', exact: true })).toBeVisible()
18+
await page.getByRole('menuitem', { name: 'Mark as unread', exact: true }).click()
19+
await expect(
20+
page
21+
.getByRole('region', { name: 'Needs your attention', exact: true })
22+
.getByText('Quarterly review')
23+
).toBeVisible()
24+
await page.reload()
25+
await list.getByRole('button', { name: 'Actions for Quarterly review' }).click()
26+
await page.getByRole('menuitem', { name: 'Mark as read', exact: true }).click()
27+
await list.getByRole('button', { name: 'Actions for Quarterly review' }).click()
28+
await page.getByRole('menuitem', { name: 'Unpin', exact: true }).click()
29+
})
30+
31+
test('a workspace pins and renames through its row menu', async ({ page }) => {
32+
await signInAsAdmin(page, '/org/home')
33+
const list = workspaces(page)
34+
await list.getByRole('button', { name: 'Actions for Marketing' }).click()
35+
await page.getByRole('menuitem', { name: 'Pin', exact: true }).click()
36+
await page.reload()
37+
await list.getByRole('button', { name: 'Actions for Marketing' }).click()
38+
await expect(page.getByRole('menuitem', { name: 'Unpin', exact: true })).toBeVisible()
39+
await page.getByRole('menuitem', { name: 'Rename', exact: true }).click()
40+
const dialog = page.getByRole('dialog')
41+
await dialog.getByRole('textbox').fill('Growth')
42+
await dialog.getByRole('button', { name: 'Save', exact: true }).click()
43+
await expect(list.getByRole('link', { name: 'Growth', exact: true })).toBeVisible()
44+
await page.reload()
45+
await expect(list.getByRole('link', { name: 'Growth', exact: true })).toBeVisible()
46+
})
47+
48+
test('Mod+B collapses the sidebar, the choice survives a reload, and Expand restores it', async ({
49+
page,
50+
}) => {
51+
await signInAsAdmin(page, '/org/home')
52+
const sidebar = page.getByRole('complementary', { name: 'Platform sidebar' })
53+
await expect(sidebar).toBeVisible()
54+
await page.keyboard.press('ControlOrMeta+b')
55+
await expect(sidebar).toBeHidden()
56+
await page.reload()
57+
await expect(sidebar).toBeHidden()
58+
await page.getByRole('button', { name: 'Expand sidebar' }).click()
59+
await expect(sidebar).toBeVisible()
60+
await page.reload()
61+
await expect(sidebar).toBeVisible()
62+
})
63+
64+
test('Mod+K opens the palette, which finds a real workspace and a chat', async ({ page }) => {
65+
await signInAsAdmin(page, '/org/home')
66+
await page.keyboard.press('ControlOrMeta+k')
67+
const palette = page.getByRole('dialog', { name: 'Search' })
68+
await expect(palette).toBeVisible()
69+
const field = palette.getByRole('textbox', { name: 'Search the platform' })
70+
await field.fill('Operations')
71+
await expect(palette.getByText('Operations')).toBeVisible()
72+
await field.fill('Vendor')
73+
await expect(palette.getByText('Vendor renewals')).toBeVisible()
74+
await page.keyboard.press('Escape')
75+
await expect(palette).toBeHidden()
76+
})
77+
78+
test('a deleted chat restores from Recently deleted back into the sidebar', async ({ page }) => {
79+
await signInAsAdmin(page, '/org/settings/recently-deleted')
80+
await page.getByRole('button', { name: 'Restore', exact: true }).first().click()
81+
await expect(page.getByText('Retired plan')).toHaveCount(0, { timeout: 15_000 })
82+
await page.goto('/org/home')
83+
await expect(chats(page).getByRole('link', { name: 'Retired plan' })).toBeVisible()
84+
})
85+
86+
test('a pending invite resends and revokes from its row', async ({ page }) => {
87+
await signInAsAdmin(page, '/org/settings/members')
88+
const email = `platform-live-revoke-${Date.now()}@example.test`
89+
await page.getByRole('button', { name: 'Invite', exact: true }).click()
90+
const dialog = page.getByRole('dialog', { name: 'Invite people' })
91+
await dialog.getByLabel('Email addresses').fill(`${email},`)
92+
await dialog.getByRole('button', { name: 'Send invites' }).click()
93+
await expect(dialog).toBeHidden()
94+
await page.reload()
95+
const row = page
96+
.getByText(email)
97+
.first()
98+
.locator('xpath=ancestor::div[.//button[starts-with(@aria-label, "Actions for")]][1]')
99+
await row.getByRole('button', { name: /^Actions for/ }).click()
100+
await page.getByRole('menuitem', { name: 'Resend invite' }).click()
101+
await expect(page.getByRole('menuitem', { name: 'Resend invite' })).toHaveCount(0)
102+
await row.getByRole('button', { name: /^Actions for/ }).click()
103+
await page.getByRole('menuitem', { name: 'Revoke invite' }).click()
104+
await expect(page.getByText(email)).toHaveCount(0)
105+
await page.reload()
106+
await expect(page.getByRole('heading', { name: 'Members', level: 1 })).toBeVisible()
107+
await expect(page.getByText(email)).toHaveCount(0)
108+
})
109+
110+
test('member search lives in the URL and narrows the roster', async ({ page }) => {
111+
await signInAsAdmin(page, '/org/settings/members')
112+
await page.getByRole('searchbox', { name: /Search members/ }).fill(adminEmail())
113+
await expect(page).toHaveURL(/search=/)
114+
await expect(page.getByText(adminEmail()).first()).toBeVisible()
115+
await expect(page.getByText(process.env.PLATFORM_LIVE_OWNER_EMAIL as string)).toHaveCount(0)
116+
await page.reload()
117+
await expect(page.getByRole('searchbox', { name: /Search members/ })).toHaveValue(adminEmail())
118+
await expect(page.getByText(process.env.PLATFORM_LIVE_OWNER_EMAIL as string)).toHaveCount(0)
119+
})
120+
121+
test('a notification preference writes and survives a reload', async ({ page }) => {
122+
await signInAsAdmin(page, '/org/settings/notifications')
123+
const toggle = page.getByRole('switch', { name: 'Canvas error notifications' })
124+
const before = await toggle.isChecked()
125+
await toggle.click()
126+
await expect
127+
.poll(async () => {
128+
await page.reload()
129+
return toggle.isChecked()
130+
})
131+
.toBe(!before)
132+
await toggle.click()
133+
})
134+
135+
test('Search mode on Home offers Get started with its real steps', async ({ page }) => {
136+
await signInAsAdmin(page, '/org/home')
137+
await page.getByRole('radio', { name: 'Search' }).click()
138+
const started = page.getByRole('region', { name: 'Get started', exact: true })
139+
await expect(started).toBeVisible()
140+
await expect(started.getByText('Connect an integration')).toBeVisible()
141+
await page.getByRole('radio', { name: 'Build' }).click()
142+
})
143+
144+
test('a permission group created in the form opens, saves its name and deletes', async ({
145+
page,
146+
}) => {
147+
await signInAsAdmin(page, '/org/settings/access-control')
148+
const name = `Form group ${Date.now()}`
149+
await page.getByRole('button', { name: 'Create group' }).click()
150+
const dialog = page.getByRole('dialog', { name: 'Create permission group' })
151+
await dialog.getByRole('textbox', { name: 'Name' }).fill(name)
152+
await dialog.getByText('Make this the organization default group').click()
153+
await dialog.getByRole('button', { name: 'Create', exact: true }).click()
154+
await expect(dialog).toBeHidden()
155+
await expect(page).toHaveURL(/group=/)
156+
await page.reload()
157+
await expect(page.getByRole('textbox', { name: 'Name' })).toHaveValue(name)
158+
await page.getByRole('button', { name: 'Delete', exact: true }).first().click()
159+
await page.getByRole('dialog').getByRole('button', { name: 'Delete', exact: true }).click()
160+
await expect(page).not.toHaveURL(/group=/)
161+
await expect(page.getByText(name)).toHaveCount(0)
162+
})
163+
164+
test('Requests opens for an administrator and switches views in the URL', async ({ page }) => {
165+
await signInAsAdmin(page, '/org/settings/requests')
166+
await expect(page.getByRole('heading', { name: 'Requests', level: 1 })).toBeVisible()
167+
await page.getByRole('radio', { name: 'My requests' }).click()
168+
await expect(page).toHaveURL(/view=/)
169+
await page.reload()
170+
await expect(page.getByRole('radio', { name: 'My requests' })).toBeChecked()
171+
})
172+
173+
test('an unknown settings section is not found, inside the shell', async ({ page }) => {
174+
await signIn(page, adminEmail(), '/org/settings/not-a-section')
175+
await expect(page.getByRole('heading', { name: 'Page not found' })).toBeVisible()
176+
})

0 commit comments

Comments
 (0)