File tree 4 files changed +26
-11
lines changed
4 files changed +26
-11
lines changed Original file line number Diff line number Diff line change 1
1
import { screen , waitFor } from '@testing-library/dom' ;
2
2
import user from '@testing-library/user-event' ;
3
- import { AllDescriptor , RoleDescriptor } from './roles/types' ;
3
+ import { AllDescriptor , RoleDescriptor , optional } from './roles/types' ;
4
4
5
5
export type DescriptorResult < T > = T extends RoleDescriptor & AllDescriptor
6
6
? Array < HTMLElement >
@@ -33,6 +33,9 @@ export function resolverFor(
33
33
if ( 'all' in descriptor && descriptor . all === true ) {
34
34
const { name } = descriptor ;
35
35
return source . queryAllByRole ( descriptor . role , { name } ) as any ;
36
+ } else if ( optional in descriptor ) {
37
+ const { name, isSelected : selected } = descriptor ;
38
+ return source . queryByRole ( descriptor . role , { name, selected } ) as any ;
36
39
} else {
37
40
const { name, isSelected : selected } = descriptor ;
38
41
return source . getByRole ( descriptor . role , { name, selected } ) ;
Original file line number Diff line number Diff line change @@ -19,6 +19,10 @@ describe('Combobox', () => {
19
19
expect ( screenTest ( Combobox ( ) ) ) . toBeVisible ( ) ;
20
20
} ) ;
21
21
22
+ it ( 'hides listbox' , ( ) => {
23
+ expect ( screenTest ( Combobox . PopupListbox ( ) . optional ) ) . toBeNull ( ) ;
24
+ } ) ;
25
+
22
26
it ( 'renders named combobox' , ( ) => {
23
27
expect ( screenTest ( Combobox ( 'Person' ) ) ) . toBeVisible ( ) ;
24
28
} ) ;
Original file line number Diff line number Diff line change 1
1
import { prettyDOM } from '@testing-library/dom' ;
2
- import type { AllDescriptor , RoleDescriptor } from './types' ;
2
+ import { optional , type AllDescriptor , type RoleDescriptor } from './types' ;
3
3
4
- export type RoleObject < SupportedEvent extends { click ?: true } > = {
5
- role : string ;
4
+ export type RoleObject <
5
+ Role extends string ,
6
+ SupportedEvent extends { click ?: true }
7
+ > = {
8
+ role : Role ;
6
9
name ?: string | RegExp ;
10
+ optional : RoleObject < Role , SupportedEvent > ;
7
11
all : RoleDescriptor & AllDescriptor ;
8
12
} & ( SupportedEvent [ 'click' ] extends true
9
13
? {
10
14
click : RoleDescriptor ;
11
15
}
12
16
: { } ) ;
13
17
14
- export function role < SupportedEvent extends { click ?: true } > (
15
- role : string ,
16
- name ?: string | RegExp
17
- ) : RoleObject < SupportedEvent > {
18
+ export function role <
19
+ Role extends string ,
20
+ SupportedEvent extends { click ?: true }
21
+ > ( role : Role , name ?: string | RegExp ) : RoleObject < Role , SupportedEvent > {
18
22
return Object . freeze ( {
19
23
role,
20
24
name,
21
25
get all ( ) : RoleDescriptor & AllDescriptor {
22
26
return Object . create ( this , { all : { value : true } } ) ;
23
27
} ,
28
+ get optional ( ) {
29
+ return Object . create ( this , { [ optional ] : { value : true } } ) ;
30
+ } ,
24
31
get click ( ) : RoleDescriptor {
25
32
return Object . create ( this , { event : { value : 'click' } } ) ;
26
33
} ,
Original file line number Diff line number Diff line change 1
1
import { queries , BoundFunctions , Queries } from '@testing-library/dom' ;
2
2
3
+ const all = Symbol ( 'all' ) ;
4
+ export const optional = Symbol ( 'optional' ) ;
5
+
3
6
export interface RoleDescriptor {
4
7
readonly role : string ;
5
8
readonly name ?: string | RegExp ;
9
+ readonly [ optional ] ?: true ;
6
10
readonly isSelected ?: boolean ;
7
- // readonly all?: true;
8
11
readonly event ?: 'click' ;
9
12
}
10
13
11
14
export interface AllDescriptor {
12
15
readonly all : true ;
13
16
}
14
17
15
- export interface AllRoleDescription extends RoleDescriptor , AllDescriptor { }
16
-
17
18
export interface SingleDescriptor < Q extends Queries = typeof queries > {
18
19
get ( source : BoundFunctions < Q > ) : HTMLElement ;
19
20
}
You can’t perform that action at this time.
0 commit comments