Skip to content

Commit e9b2a98

Browse files
authored
Merge pull request #2595 from navikt/ny/meldinger-e2e
Litt accessibility & e2e test for meldinger
2 parents 11a4c4c + e741a86 commit e9b2a98

File tree

8 files changed

+88
-12
lines changed

8 files changed

+88
-12
lines changed

e2e/meldinger.spec.ts

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { expect, test } from '@playwright/test';
2+
3+
test('Select melding', async ({ page }) => {
4+
await page.goto('/new/person/meldinger');
5+
6+
const meldingerList = page.getByRole('region', { name: 'Tråder' });
7+
await expect(meldingerList).toBeVisible();
8+
const meldingerCards = meldingerList.getByTestId('traaditem');
9+
expect((await meldingerCards.all()).length).toBeGreaterThan(5);
10+
11+
await meldingerCards.first().getByRole('button').click();
12+
13+
const meldingerDetails = page.getByRole('region', { name: 'Dialogdetaljer' });
14+
15+
await expect(meldingerDetails).toBeVisible();
16+
});
17+
18+
test('Send melding i tråd', async ({ page }) => {
19+
await page.goto('/new/person/meldinger');
20+
const traadToClick = page.getByTestId('traaditem').nth(2);
21+
await expect(traadToClick).toBeVisible();
22+
await traadToClick.getByRole('button').click();
23+
24+
await page.getByRole('button', { name: 'Svar' }).click();
25+
26+
await page.getByRole('textbox').fill('playwright test melding');
27+
await page.getByRole('button', { name: 'Send til Aremark' }).click();
28+
29+
const meldingerList = page.getByLabel('Dialogdetaljer').getByLabel('Meldinger');
30+
const newMelding = meldingerList.getByText('playwright test melding');
31+
32+
await expect(newMelding).toBeVisible();
33+
});
34+
35+
test('Send ny melding', async ({ page }) => {
36+
await page.goto('/new/person/meldinger');
37+
38+
await page.getByRole('textbox').fill('playwright new melding');
39+
await page.getByLabel('Temagruppe').selectOption('Pensjon');
40+
await page.getByRole('button', { name: 'Send til Aremark' }).click();
41+
42+
const newTraad = page.getByTestId('traaditem').first();
43+
await expect(newTraad).toContainText('Referat');
44+
await expect(newTraad).toContainText('Tema:Pensjon');
45+
46+
await newTraad.getByRole('button').click();
47+
48+
const meldingerDetails = page.getByRole('region', { name: 'Dialogdetaljer' });
49+
await expect(meldingerDetails.getByRole('heading').first()).toHaveText('Referat - Pensjon');
50+
51+
const meldingerList = page.getByLabel('Dialogdetaljer').getByLabel('Meldinger');
52+
const meldinger = meldingerList.getByRole('list');
53+
await expect(meldinger).toHaveCount(1);
54+
await expect(meldinger.first().getByRole('paragraph').first()).toHaveText('playwright new melding');
55+
});

e2e/smoketest.spec.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@ import { expect, test } from '@playwright/test';
33
test('smoketest', async ({ page }) => {
44
await page.goto('/');
55

6-
// Expect a title "to contain" a substring.
76
await expect(page).toHaveTitle(/Modia Personoversikt/);
87
});
98

109
test('User pages', async ({ page }) => {
1110
await page.goto('/person/oversikt');
1211

1312
const personLoaded = page.getByTestId('visittkort:person');
14-
await expect(personLoaded).toHaveText(/Aremark Testfamilien/i, { timeout: 10000 });
13+
await expect(personLoaded).toHaveText(/Aremark Testfamilien/i);
1514
});

playwright.config.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ export default defineConfig({
3131
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
3232
trace: 'on-first-retry'
3333
},
34+
expect: {
35+
timeout: process.env.CI ? 15000 : 8000
36+
},
3437

3538
/* Configure projects for major browsers */
3639
projects: [
@@ -43,7 +46,8 @@ export default defineConfig({
4346
/* Run your local dev server before starting the tests */
4447
webServer: {
4548
env: {
46-
VITE_E2E: 'true'
49+
VITE_E2E: 'true',
50+
VITE_MOCK_ENABLED: 'true'
4751
},
4852
timeout: 3 * 60 * 1000,
4953
command: 'pnpm run start',

src/components/Meldinger/Detail/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ const TraadDetailContent = ({ traadId }: { traadId: string }) => {
8282

8383
return (
8484
<Card as={VStack} padding="2" minHeight="0">
85-
<VStack minHeight="0" gap="2">
85+
<VStack minHeight="0" gap="2" as="section" aria-label="Dialogdetaljer">
8686
<TraadMeta traad={traad} />
8787
<HStack gap="4">
8888
<Button variant="secondary-neutral" size="small">
@@ -156,7 +156,7 @@ const Meldinger = ({ meldinger }: { meldinger: Traad['meldinger'] }) => {
156156
const { search } = useAtomValue(meldingerFilterAtom);
157157
const highlightRule = useMemo(() => createDynamicHighlightingRule((search ?? '').split(' ')), [search]);
158158
return (
159-
<VStack gap="10" align="baseline" paddingBlock="0 16">
159+
<VStack gap="10" align="baseline" paddingBlock="0 16" as="section" aria-label="Meldinger">
160160
{meldinger.map((m) => {
161161
const erFraNav = erMeldingFraNav(m.meldingstype);
162162
return (

src/components/Meldinger/List/TraadItem.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export const TraadItem = ({
8181

8282
return (
8383
<Card
84+
data-testid="traaditem"
8485
padding="2"
8586
className={twMerge(
8687
'cursor-pointer hover:bg-[var(--ax-bg-neutral-moderate-hover)] group',
@@ -114,8 +115,13 @@ export const TraadItem = ({
114115
<Button
115116
variant="tertiary-neutral"
116117
size="small"
118+
name="Åpne"
119+
aria-label="Åpne"
117120
icon={
118-
<ChevronRightIcon className="translate-x-0 group-hover:translate-x-1 transition-transform" />
121+
<ChevronRightIcon
122+
aria-hidden
123+
className="translate-x-0 group-hover:translate-x-1 transition-transform"
124+
/>
119125
}
120126
/>
121127
</VStack>

src/components/Meldinger/List/index.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const Traader = () => {
3939
[traader]
4040
);
4141
const filteredMeldinger = useFilterMeldinger(sortedTraader, filters);
42-
const navigate = useNavigate({ from: '/person/meldinger' });
42+
const navigate = useNavigate({ from: '/new/person/meldinger' });
4343

4444
const handleClick = useCallback(
4545
(traadId: string) => {
@@ -64,6 +64,12 @@ const Traader = () => {
6464
return (
6565
<>
6666
<PaginatedList
67+
paginationSrHeading={{
68+
tag: 'h3',
69+
text: 'Trådlistepaginering'
70+
}}
71+
aria-label="Tråder"
72+
as="section"
6773
selectedKey={traadId}
6874
items={filteredMeldinger}
6975
keyExtractor={(item) => item.traadId}

src/components/Meldinger/index.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { TraadList } from './List';
66

77
export const MeldingerPage = () => {
88
return (
9-
<HStack gap="4" minHeight="0" flexGrow="1" paddingBlock="0 2">
9+
<HStack gap="4" minHeight="0" flexGrow="1" paddingBlock="0 2" wrap={false}>
1010
<VStack height="100%" minWidth="16em">
1111
<HStack justify="space-between">
1212
<Heading size="xsmall">Innboks</Heading>

src/components/PaginatedList/index.tsx

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
import { Pagination, VStack } from '@navikt/ds-react';
22
import { chunk } from 'lodash';
3-
import { type JSX, useEffect, useMemo, useState } from 'react';
3+
import { type ComponentProps, type ComponentPropsWithRef, type JSX, useEffect, useMemo, useState } from 'react';
44

5-
type Props<T, KeyType> = {
5+
type Props<T, KeyType> = Omit<ComponentPropsWithRef<typeof VStack>, 'as'> & {
66
items: T[];
77
pageSize?: number;
88
renderItem: ({ item }: { item: T }) => JSX.Element;
99
keyExtractor: (item: T) => KeyType;
1010
selectedKey?: KeyType;
11+
as?: ComponentPropsWithRef<typeof VStack>['as'];
12+
paginationSrHeading?: ComponentProps<typeof Pagination>['srHeading'];
1113
};
1214

1315
export const PaginatedList = <T, KeyType extends string | number>({
1416
items,
1517
pageSize = 10,
1618
renderItem: RenderComp,
1719
keyExtractor,
18-
selectedKey
20+
selectedKey,
21+
as,
22+
paginationSrHeading,
23+
...rest
1924
}: Props<T, KeyType>) => {
2025
const [page, setPage] = useState(0);
2126
const pages = useMemo(() => chunk(items, pageSize), [items, pageSize]);
@@ -34,13 +39,14 @@ export const PaginatedList = <T, KeyType extends string | number>({
3439
}, [selectedKey, pages, keyExtractor]);
3540

3641
return (
37-
<VStack gap="2" justify="space-between" flexGrow="1" minHeight="0">
42+
<VStack as={as ?? 'div'} gap="2" justify="space-between" flexGrow="1" minHeight="0" {...rest}>
3843
<VStack gap="2" paddingInline="0 2" overflowY="scroll">
3944
{renderItems?.map((item) => (
4045
<RenderComp item={item} key={keyExtractor(item)} />
4146
))}
4247
</VStack>
4348
<Pagination
49+
srHeading={paginationSrHeading}
4450
size="small"
4551
page={page + 1}
4652
siblingCount={0}

0 commit comments

Comments
 (0)