Skip to content

Commit a76906c

Browse files
test(select): initial select tests
1 parent e07573b commit a76906c

File tree

13 files changed

+120
-60
lines changed

13 files changed

+120
-60
lines changed

apps/website/e2e/example.spec.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

apps/website/e2e/select.spec.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { test, expect, Locator, Page } from '@playwright/test';
2+
3+
export function selectTestDriver<T extends DriverLocator>(locator: T) {
4+
const getRoot = () => {
5+
return locator.getByRole('combobox');
6+
};
7+
8+
return {
9+
...locator,
10+
locator,
11+
getRoot,
12+
getListbox() {
13+
return getRoot().getByRole('listbox');
14+
},
15+
getTrigger() {
16+
return getRoot().getByRole('button');
17+
},
18+
// get all options
19+
getOptions() {
20+
return getRoot().locator('[role="option"]');
21+
},
22+
};
23+
}
24+
25+
export type DriverLocator = Locator | Page;
26+
27+
// Just to make sure we're on the right docs page.
28+
test(`GIVEN a new page
29+
WHEN navigating to the select page in the docs
30+
THEN the h1 text should be "Select"`, async ({ page }) => {
31+
await page.goto('/docs/headless/select');
32+
33+
expect(await page.locator('h1').innerText()).toContain('Select');
34+
});
35+
36+
test(`GIVEN a basic select
37+
WHEN clicking on the trigger
38+
THEN open up the listbox`, async ({ page }) => {
39+
await page.goto('/docs/headless/select');
40+
41+
const testDriver = selectTestDriver(page.getByTestId('select-hero-test'));
42+
43+
const { getListbox, getTrigger } = testDriver;
44+
45+
await getTrigger().click();
46+
47+
await expect(getListbox()).toBeVisible();
48+
});
49+
50+
test(`GIVEN a basic select
51+
WHEN focusing the trigger and hitting enter
52+
THEN open up the listbox`, async ({ page }) => {
53+
await page.goto('/docs/headless/select');
54+
55+
const testDriver = selectTestDriver(page.getByTestId('select-hero-test'));
56+
57+
const { getListbox, getTrigger } = testDriver;
58+
59+
await getTrigger().focus();
60+
await page.keyboard.press('Enter');
61+
62+
await expect(getListbox()).toBeVisible();
63+
});

apps/website/playwright.config.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ export default defineConfig({
3737
use: { ...devices['Desktop Chrome'] },
3838
},
3939

40-
{
41-
name: 'firefox',
42-
use: { ...devices['Desktop Firefox'] },
43-
},
40+
// {
41+
// name: 'firefox',
42+
// use: { ...devices['Desktop Firefox'] },
43+
// },
4444

45-
{
46-
name: 'webkit',
47-
use: { ...devices['Desktop Safari'] },
48-
},
45+
// {
46+
// name: 'webkit',
47+
// use: { ...devices['Desktop Safari'] },
48+
// },
4949

5050
// Uncomment for mobile browsers support
5151
/* {
Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,21 @@
1-
import { $, component$, useSignal, useTask$ } from '@builder.io/qwik';
1+
import { component$, useSignal } from '@builder.io/qwik';
22
import { Select, SelectListbox, SelectOption, SelectTrigger } from '@qwik-ui/headless';
33

44
export default component$(() => {
5-
const mockUsers = ['Tim', 'Ryan', 'Jim'];
6-
const moreUsers = ['Carla', 'Rachel', 'Monica', 'Jessie', 'Abby'];
7-
8-
const usersSig = useSignal<string[]>([]);
9-
10-
useTask$(async () => {
11-
usersSig.value = mockUsers;
12-
});
13-
14-
const handleClick$ = $(() => {
15-
usersSig.value = [...usersSig.value, ...moreUsers];
16-
});
5+
const usersSig = useSignal<string[]>(['Tim', 'Ryan', 'Jim', 'Jessie', 'Abby']);
176

187
return (
19-
<div>
20-
<Select>
21-
<SelectTrigger>Trigger</SelectTrigger>
22-
<SelectListbox style={{ padding: '0px', margin: '0px', listStyle: 'none' }}>
23-
<SelectOption disabled>My option</SelectOption>
24-
{usersSig.value.map((user) => (
25-
<SelectOption key={user}>{user}</SelectOption>
26-
))}
27-
</SelectListbox>
28-
</Select>
29-
{/* somehow this adds more js on page load? / wakes up the framework? */}
30-
<button onClick$={handleClick$}>Add more!</button>
31-
</div>
8+
<Select>
9+
<SelectTrigger>Trigger</SelectTrigger>
10+
<SelectListbox
11+
class="hidden"
12+
style={{ padding: '0px', margin: '0px', listStyle: 'none' }}
13+
>
14+
<SelectOption disabled>My option</SelectOption>
15+
{usersSig.value.map((user) => (
16+
<SelectOption key={user}>{user}</SelectOption>
17+
))}
18+
</SelectListbox>
19+
</Select>
3220
);
3321
});

apps/website/src/routes/docs/headless/select/index.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import { statusByComponent } from '~/_state/component-statuses';
1010

1111
This element is used to create a drop-down list, it's often used in a form, to collect user input.
1212

13-
<Showcase name="hero" />
13+
<div data-testid="select-hero-test">
14+
<Showcase name="hero" />
15+
</div>
1416

1517
## Building blocks
1618

apps/website/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@
2626
"path": "./tsconfig.spec.json"
2727
}
2828
],
29-
"include": ["src"]
29+
"include": ["src", "e2e/select.spec.ts"]
3030
}

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
"@nx/vite": "17.1.3",
6262
"@nx/workspace": "17.1.3",
6363
"@oddbird/popover-polyfill": "0.3.7",
64-
"@playwright/test": "^1.36.0",
64+
"@playwright/test": "^1.41.2",
6565
"@storybook/addon-a11y": "7.6.0",
6666
"@storybook/addon-coverage": "^0.0.9",
6767
"@storybook/addon-essentials": "7.6.0",
@@ -104,7 +104,7 @@
104104
"eslint": "^8.48.0",
105105
"eslint-config-prettier": "9.0.0",
106106
"eslint-plugin-cypress": "^2.14.0",
107-
"eslint-plugin-playwright": "^0.15.3",
107+
"eslint-plugin-playwright": "^1.3.0",
108108
"eslint-plugin-qwik": "^1.4.0",
109109
"eslint-plugin-storybook": "^0.6.13",
110110
"focus-trap": "7.5.3",

packages/kit-headless/src/components/select/select-listbox.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
import { component$, Slot, type PropsOf, useContext } from '@builder.io/qwik';
1+
import { component$, useStyles$, Slot, type PropsOf, useContext } from '@builder.io/qwik';
22
import SelectContextId from './select-context';
3+
import styles from './select.css?inline';
34

45
type SelectListboxProps = PropsOf<'ul'>;
56

67
export const SelectListbox = component$<SelectListboxProps>((props) => {
8+
useStyles$(styles);
9+
710
const context = useContext(SelectContextId);
811
return (
912
<ul
1013
{...props}
11-
hidden={!context.isListboxOpenSig.value}
14+
role="listbox"
1215
ref={context.listboxRef}
13-
data-state={context.isListboxOpenSig.value ? 'open' : 'closed'}
16+
data-open={context.isListboxOpenSig.value ? '' : undefined}
17+
data-closed={!context.isListboxOpenSig.value ? '' : undefined}
1418
>
1519
<Slot />
1620
</ul>

packages/kit-headless/src/components/select/select-option.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ export const SelectOption = component$<SelectOptionProps>((props) => {
5656
ref={optionRef}
5757
tabIndex={-1}
5858
aria-selected={isSelected}
59-
data-selected={isSelected}
60-
data-highlighted={isHighlighted}
61-
data-disabled={disabled}
59+
data-selected={isSelected ? '' : undefined}
60+
data-highlighted={isHighlighted ? '' : undefined}
61+
data-disabled={disabled ? '' : undefined}
6262
role="option"
6363
>
6464
<Slot />

packages/kit-headless/src/components/select/select-trigger.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ export const SelectTrigger = component$<SelectTriggerProps>((props) => {
166166
onClick$={[handleClick$, props.onClick$]}
167167
aria-expanded={context.isListboxOpenSig.value}
168168
onKeyDown$={[handleKeyDownSync$, handleKeyDown$, props.onKeyDown$]}
169-
data-state={context.isListboxOpenSig.value ? 'open' : 'closed'}
169+
data-open={context.isListboxOpenSig.value ? '' : undefined}
170+
data-closed={!context.isListboxOpenSig.value ? '' : undefined}
170171
class="bg-slate-800 p-2 text-white"
171172
>
172173
<Slot />

0 commit comments

Comments
 (0)