Skip to content

Commit 33d6193

Browse files
authored
fix: improve accessibility of UI elements (#1034)
1 parent 9938f6e commit 33d6193

File tree

6 files changed

+21
-19
lines changed

6 files changed

+21
-19
lines changed

app/components/user-dropdown.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ export function UserDropdown() {
2525
// this is for progressive enhancement
2626
onClick={(e) => e.preventDefault()}
2727
className="flex items-center gap-2"
28+
aria-label="User menu"
2829
>
2930
<Img
3031
className="size-8 rounded-full object-cover"
3132
alt={user.name ?? user.username}
3233
src={getUserImgSrc(user.image?.objectKey)}
3334
width={256}
3435
height={256}
36+
aria-hidden="true"
3537
/>
3638
<span className="text-body-sm font-bold">
3739
{user.name ?? user.username}

app/routes/users+/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export default function UsersRoute({ loaderData }: Route.ComponentProps) {
4545
<Link
4646
to={user.username}
4747
className="bg-muted flex h-36 w-44 flex-col items-center justify-center rounded-lg px-5 py-3"
48+
aria-label={`${user.name || user.username} profile`}
4849
>
4950
<Img
5051
alt={user.name ?? user.username}

tests/e2e/2fa.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ test('Users can add 2FA to their account and use it when logging in', async ({
3737
await expect(main).toHaveText(/You have enabled two-factor authentication./i)
3838
await expect(main.getByRole('link', { name: /disable 2fa/i })).toBeVisible()
3939

40-
await page.getByRole('link', { name: user.name ?? user.username }).click()
40+
await page.getByRole('link', { name: 'User menu' }).click()
4141
await page.getByRole('menuitem', { name: /logout/i }).click()
4242
await expect(page).toHaveURL(`/`)
4343

@@ -59,7 +59,5 @@ test('Users can add 2FA to their account and use it when logging in', async ({
5959

6060
await page.getByRole('button', { name: /submit/i }).click()
6161

62-
await expect(
63-
page.getByRole('link', { name: user.name ?? user.username }),
64-
).toBeVisible()
62+
await expect(page.getByRole('link', { name: 'User menu' })).toBeVisible()
6563
})

tests/e2e/onboarding.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,12 @@ test('onboarding with link', async ({ page, navigate, getOnboardingData }) => {
104104

105105
await expect(page).toHaveURL(`/`)
106106

107-
await page.getByRole('link', { name: onboardingData.name }).click()
107+
await page.getByRole('link', { name: 'User menu' }).click()
108108
await page.getByRole('menuitem', { name: /profile/i }).click()
109109

110110
await expect(page).toHaveURL(`/users/${onboardingData.username}`)
111111

112-
await page.getByRole('link', { name: onboardingData.name }).click()
112+
await page.getByRole('link', { name: 'User menu' }).click()
113113
await page.getByRole('menuitem', { name: /logout/i }).click()
114114
await expect(page).toHaveURL(`/`)
115115
})
@@ -344,7 +344,7 @@ test('login as existing user', async ({ page, navigate, insertNewUser }) => {
344344
await page.getByRole('button', { name: /log in/i }).click()
345345
await expect(page).toHaveURL(`/`)
346346

347-
await expect(page.getByRole('link', { name: user.name })).toBeVisible()
347+
await expect(page.getByRole('link', { name: 'User menu' })).toBeVisible()
348348
})
349349

350350
test('reset password with a link', async ({
@@ -402,7 +402,7 @@ test('reset password with a link', async ({
402402

403403
await expect(page).toHaveURL(`/`)
404404

405-
await expect(page.getByRole('link', { name: user.name })).toBeVisible()
405+
await expect(page.getByRole('link', { name: 'User menu' })).toBeVisible()
406406
})
407407

408408
test('reset password with a short code', async ({

tests/e2e/passkey.test.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ test('Users can register and use passkeys', async ({
5858
).toHaveLength(1)
5959

6060
// Logout
61-
await page.getByRole('link', { name: user.name ?? user.username }).click()
61+
await page.getByRole('link', { name: 'User menu' }).click()
6262
await page.getByRole('menuitem', { name: /logout/i }).click()
6363
await expect(page).toHaveURL(`/`)
6464

@@ -81,9 +81,7 @@ test('Users can register and use passkeys', async ({
8181
await Promise.race([passkeyAssertedPromise, errorPromise])
8282

8383
// Verify successful login
84-
await expect(
85-
page.getByRole('link', { name: user.name ?? user.username }),
86-
).toBeVisible()
84+
await expect(page.getByRole('link', { name: 'User menu' })).toBeVisible()
8785

8886
// Verify the sign count increased
8987
const afterLoginCredentials = await client.send('WebAuthn.getCredentials', {
@@ -109,7 +107,7 @@ test('Users can register and use passkeys', async ({
109107
expect(afterDeletionCredentials.credentials).toHaveLength(1)
110108

111109
// Logout again to test deleted passkey
112-
await page.getByRole('link', { name: user.name ?? user.username }).click()
110+
await page.getByRole('link', { name: 'User menu' }).click()
113111
await page.getByRole('menuitem', { name: /logout/i }).click()
114112
await expect(page).toHaveURL(`/`)
115113

tests/e2e/search.test.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
1-
import { invariant } from '@epic-web/invariant'
21
import { expect, test } from '#tests/playwright-utils.ts'
32

43
test('Search from home page', async ({ page, navigate, insertNewUser }) => {
54
const newUser = await insertNewUser()
65
await navigate('/')
76

7+
// Search for an existing user.
88
await page.getByRole('searchbox', { name: /search/i }).fill(newUser.username)
99
await page.getByRole('button', { name: /search/i }).click()
1010

11-
await page.waitForURL(
12-
`/users?${new URLSearchParams({ search: newUser.username })}`,
13-
)
1411
await expect(page.getByText('Epic Notes Users')).toBeVisible()
1512
const userList = page.getByRole('main').getByRole('list')
1613
await expect(userList.getByRole('listitem')).toHaveCount(1)
17-
invariant(newUser.name, 'User name not found')
18-
await expect(page.getByAltText(newUser.name)).toBeVisible()
14+
await expect(
15+
userList
16+
.getByRole('listitem')
17+
.getByRole('link', {
18+
name: `${newUser.name || newUser.username} profile`,
19+
}),
20+
).toBeVisible()
1921

22+
// Search for a non-existing user.
2023
await page.getByRole('searchbox', { name: /search/i }).fill('__nonexistent__')
2124
await page.getByRole('button', { name: /search/i }).click()
2225
await page.waitForURL(`/users?search=__nonexistent__`)

0 commit comments

Comments
 (0)