Skip to content

Commit b7c7cb9

Browse files
committed
test: add progress headless first tests
1 parent 22feaf0 commit b7c7cb9

File tree

5 files changed

+86
-13
lines changed

5 files changed

+86
-13
lines changed

packages/kit-headless/src/components/progress/progress-indicator.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,17 @@ import { getProgressState } from './util';
33
import { ProgressContext } from './progress-context';
44

55
type ProgressIndicatorElement = PropsOf<'div'>;
6-
export const Indicator = component$<ProgressIndicatorElement>((props) => {
6+
export const ProgressIndicator = component$<ProgressIndicatorElement>((props) => {
77
const { ...indicatorProps } = props;
88

99
const { max, value } = useContext(ProgressContext);
1010
const translateX = value ? `translateX(-${100 - value}%)` : undefined;
1111

1212
return (
1313
<div
14-
style={{
15-
transform: translateX,
16-
transition: 'transform 0.3s',
17-
}}
18-
data-state={getProgressState(value, max)}
14+
style={{ transform: translateX }}
15+
title="progress_indicator"
16+
data-progress={getProgressState(value, max)}
1917
data-value={value ?? undefined}
2018
data-max={max}
2119
{...indicatorProps}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { type Locator, type Page } from '@playwright/test';
2+
export type DriverLocator = Locator | Page;
3+
4+
export function createTestDriver<T extends DriverLocator>(rootLocator: T) {
5+
const getRoot = () => {
6+
return rootLocator;
7+
};
8+
9+
const getProgressIndicator = () => {
10+
return getRoot().getByTitle('progress_indicator');
11+
};
12+
13+
const getProgressState = () => {
14+
return getProgressIndicator().getAttribute('data-progress');
15+
};
16+
17+
const getProgressValue = () => {
18+
return getProgressIndicator().getAttribute('data-value');
19+
};
20+
21+
return {
22+
...rootLocator,
23+
getRoot,
24+
getProgressIndicator,
25+
getProgressState,
26+
getProgressValue,
27+
};
28+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { expect, test, type Page } from '@playwright/test';
2+
import { createTestDriver } from './progress.driver';
3+
4+
async function setup(page: Page, exampleName: string) {
5+
await page.goto(`/headless/progress/${exampleName}`);
6+
7+
const driver = createTestDriver(page.getByRole('progressbar'));
8+
const { getRoot, getProgressState, getProgressValue, getProgressIndicator } = driver;
9+
10+
return { driver, getRoot, getProgressState, getProgressValue, getProgressIndicator };
11+
}
12+
13+
test.describe('Progress Bar usaged', () => {
14+
test(`should have root and indicator`, async ({ page }) => {
15+
const { driver: d } = await setup(page, 'hero');
16+
17+
await expect(d.getRoot()).toBeVisible();
18+
await expect(d.getProgressIndicator()).toBeVisible();
19+
});
20+
21+
test(`should have progress state loading if is not completed`, async ({ page }) => {
22+
const { driver: d } = await setup(page, 'hero');
23+
24+
expect(d.getProgressIndicator()).toBeVisible();
25+
expect(await d.getProgressState()).toBe('loading');
26+
expect(await d.getProgressValue()).toBe('30');
27+
});
28+
29+
test(`should have aria attributes`, async ({ page }) => {
30+
const { driver: d } = await setup(page, 'hero');
31+
await expect(d.getRoot()).toHaveAttribute('aria-valuemin', '0');
32+
await expect(d.getRoot()).toHaveAttribute('aria-valuemax', '100');
33+
await expect(d.getRoot()).toHaveAttribute('aria-valuenow', '30');
34+
await expect(d.getRoot()).toHaveAttribute('aria-valuetext', '30%');
35+
});
36+
});

packages/kit-headless/src/components/progress/progress.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,22 @@ import {
99
import { ProgressContext } from './progress-context';
1010

1111
type ProgressProps = {
12+
/** Maximum value of the progress bar.**/
1213
max?: number;
14+
15+
/** Current value of the progress bar. **/
1316
value?: number;
17+
18+
/** Callback to get the label for the current value. **/
1419
getValueLabel?(value: number, max: number): string;
1520
};
1621

1722
type ProgressElement = PropsOf<'div'>;
23+
24+
/** Default max value for progress bar **/
1825
const DEFAULT_MAX = 100;
1926

20-
export const Root = component$<ProgressProps & ProgressElement>((props) => {
27+
export const Progress = component$<ProgressProps & ProgressElement>((props) => {
2128
const {
2229
max: mapProp,
2330
value: valueProp,
@@ -38,7 +45,8 @@ export const Root = component$<ProgressProps & ProgressElement>((props) => {
3845
aria-valuenow={isNumber(value) ? value : undefined}
3946
aria-valuetext={valueLabel}
4047
role="progressbar"
41-
data-state={getProgressState(value, max)}
48+
title="progress-bar"
49+
data-progress={getProgressState(value, max)}
4250
data-value={value ?? undefined}
4351
data-max={max}
4452
{...progressProps}
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import { cn } from '@qwik-ui/utils';
2-
import * as ProgressPrimitive from '@qwik-ui/headless';
2+
import {
3+
Progress as QwikUIProgress,
4+
ProgressIndicator as QwikUIProgressIndicator,
5+
} from '@qwik-ui/headless';
36
import { PropsOf, component$ } from '@builder.io/qwik';
47

5-
export const Progress = component$<PropsOf<typeof ProgressPrimitive.Root>>((props) => {
8+
export const Progress = component$<PropsOf<typeof QwikUIProgress>>((props) => {
69
return (
7-
<ProgressPrimitive.Root
10+
<QwikUIProgress
811
class={cn('bg-secondary relative h-4 w-full overflow-hidden rounded', props?.class)}
912
>
10-
<ProgressPrimitive.Indicator
13+
<QwikUIProgressIndicator
1114
class="bg-primary h-full w-full flex-1 transition-all"
1215
style={{ transform: `translateX(-${100 - (props.value || 0)}%)` }}
1316
/>
14-
</ProgressPrimitive.Root>
17+
</QwikUIProgress>
1518
);
1619
});

0 commit comments

Comments
 (0)