Skip to content

Commit a15c820

Browse files
committed
fix+test: HBS test parity + deterministic missing-attr order (Copilot review)
- Add HBS equivalents of the GJS case-insensitive and role-fallback tests so both parser paths exercise the same behaviours. - Sort missingRequiredAttributes alphabetically so report order is stable regardless of aria-query's requiredProps iteration order.
1 parent a180d27 commit a15c820

2 files changed

Lines changed: 31 additions & 3 deletions

File tree

lib/rules/template-require-mandatory-role-attributes.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ function getMissingRequiredAttributes(roleTokens, foundAriaAttributes) {
5050
continue;
5151
}
5252
const requiredAttributes = Object.keys(roleDefinition.requiredProps);
53-
const missingRequiredAttributes = requiredAttributes.filter(
54-
(requiredAttribute) => !foundAriaAttributes.includes(requiredAttribute)
55-
);
53+
const missingRequiredAttributes = requiredAttributes
54+
.filter((requiredAttribute) => !foundAriaAttributes.includes(requiredAttribute))
55+
// Sort for deterministic report order (aria-query's requiredProps
56+
// iteration order is not guaranteed stable across versions).
57+
.sort();
5658
return {
5759
role,
5860
missing: missingRequiredAttributes.length > 0 ? missingRequiredAttributes : null,

tests/lib/rules/template-require-mandatory-role-attributes.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ hbsRuleTester.run('template-require-mandatory-role-attributes', rule, {
131131
'{{foo-component role="button"}}',
132132
'{{foo-component role="unknown"}}',
133133
'{{foo-component role=role}}',
134+
135+
// Case-insensitive role matching — ARIA role tokens compare as ASCII-case-insensitive.
136+
'<div role="COMBOBOX" aria-expanded="false" aria-controls="ctrl" />',
137+
// Role fallback list — primary role's required attributes are satisfied.
138+
'<div role="combobox listbox" aria-expanded="false" aria-controls="ctrl" />',
134139
],
135140
invalid: [
136141
{
@@ -172,5 +177,26 @@ hbsRuleTester.run('template-require-mandatory-role-attributes', rule, {
172177
output: null,
173178
errors: [{ message: 'The attribute aria-checked is required by the role checkbox' }],
174179
},
180+
181+
// Case-insensitive role matching — uppercase role missing required props is flagged.
182+
{
183+
code: '<div role="COMBOBOX"></div>',
184+
output: null,
185+
errors: [
186+
{
187+
message: 'The attributes aria-controls, aria-expanded are required by the role combobox',
188+
},
189+
],
190+
},
191+
// Role-fallback list: when the primary role is missing required props, flag it.
192+
{
193+
code: '<div role="combobox listbox"></div>',
194+
output: null,
195+
errors: [
196+
{
197+
message: 'The attributes aria-controls, aria-expanded are required by the role combobox',
198+
},
199+
],
200+
},
175201
],
176202
});

0 commit comments

Comments
 (0)