// Comprehensive Behavioral Tests for usa-combo-box
// Focus on dropdown visibility, filtering behavior, keyboard navigation, and selection
import './index.ts';
describe('USA Combo Box - Comprehensive Behavioral Tests', () => {
beforeEach(() => {
// Ignore script errors from USWDS JavaScript attempts
cy.on('uncaught:exception', (err, runnable) => {
if (err.message.includes('Script error')) {
return false;
}
});
});
const sampleOptions = [
'Alabama',
'Alaska',
'Arizona',
'Arkansas',
'California',
'Colorado',
'Connecticut',
'Delaware',
'Florida',
'Georgia',
];
describe('Dropdown Visibility and Display Verification', () => {
it('should verify dropdown is completely hidden when closed and fully visible when opened', () => {
cy.mount(`
`);
// Initially dropdown should be hidden
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
// Click toggle button to open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
// Dropdown should now be visible
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Options should be visible
cy.get('#test-combo .usa-combo-box__list-option').should('be.visible');
cy.get('#test-combo .usa-combo-box__list-option').should('have.length.greaterThan', 0);
});
it('should verify dropdown options have proper dimensions and are not collapsed', () => {
cy.mount(`
`);
// Open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Each option should have reasonable dimensions
cy.get('#test-combo .usa-combo-box__list-option').each(($option) => {
cy.wrap($option).then(($el) => {
const rect = $el[0].getBoundingClientRect();
expect(rect.width).to.be.greaterThan(50);
expect(rect.height).to.be.greaterThan(20);
});
});
// Options should contain text
cy.get('#test-combo .usa-combo-box__list-option').each(($option) => {
cy.wrap($option).should('contain.text', /[A-Za-z]/);
});
});
it('should verify dropdown positioning is correct and not off-screen', () => {
cy.mount(`
`);
// Open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Dropdown should be positioned correctly relative to input
cy.get('#test-combo .usa-combo-box__list').then(($list) => {
const rect = $list[0].getBoundingClientRect();
const viewportWidth = Cypress.config('viewportWidth');
const viewportHeight = Cypress.config('viewportHeight');
// Dropdown should be within viewport bounds
expect(rect.left).to.be.greaterThanOrEqual(0);
expect(rect.top).to.be.greaterThanOrEqual(0);
expect(rect.right).to.be.lessThanOrEqual(viewportWidth);
expect(rect.bottom).to.be.lessThanOrEqual(viewportHeight);
});
// Dropdown should be positioned below the input
cy.get('#test-combo .usa-combo-box__input').then(($input) => {
const inputRect = $input[0].getBoundingClientRect();
cy.get('#test-combo .usa-combo-box__list').then(($list) => {
const listRect = $list[0].getBoundingClientRect();
expect(listRect.top).to.be.greaterThanOrEqual(inputRect.bottom);
});
});
});
it('should verify dropdown closes when clicking outside', () => {
cy.mount(`
`);
// Open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Click outside
cy.get('#outside-area').click();
// Dropdown should close
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
});
it('should verify dropdown has proper z-index layering', () => {
cy.mount(`
`);
// Open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Dropdown should have appropriate z-index
cy.get('#test-combo .usa-combo-box__list').then(($list) => {
const zIndex = window.getComputedStyle($list[0]).zIndex;
expect(parseInt(zIndex) || 0).to.be.greaterThan(10);
});
});
});
describe('Keyboard Navigation and Interaction', () => {
it('should verify Arrow Down key opens dropdown from input', () => {
cy.mount(`
`);
// Focus input and press Arrow Down
cy.get('#test-combo .usa-combo-box__input').focus().type('{downarrow}');
// Dropdown should open
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
cy.get('#test-combo .usa-combo-box__list-option').should('be.visible');
});
it('should verify keyboard navigation within dropdown options', () => {
cy.mount(`
`);
// Open dropdown
cy.get('#test-combo .usa-combo-box__input').focus().type('{downarrow}');
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// First option should be highlighted
cy.get('#test-combo .usa-combo-box__list-option')
.first()
.should('have.class', 'usa-combo-box__list-option--focused');
// Arrow Down should move to next option
cy.get('#test-combo .usa-combo-box__input').type('{downarrow}');
cy.get('#test-combo .usa-combo-box__list-option')
.eq(1)
.should('have.class', 'usa-combo-box__list-option--focused');
// Arrow Up should move back
cy.get('#test-combo .usa-combo-box__input').type('{uparrow}');
cy.get('#test-combo .usa-combo-box__list-option')
.first()
.should('have.class', 'usa-combo-box__list-option--focused');
});
it('should verify Enter key selects focused option', () => {
cy.mount(`
`);
// Open dropdown and navigate to second option
cy.get('#test-combo .usa-combo-box__input').focus().type('{downarrow}{downarrow}');
cy.get('#test-combo .usa-combo-box__list-option')
.eq(1)
.should('have.class', 'usa-combo-box__list-option--focused');
// Press Enter to select
cy.get('#test-combo .usa-combo-box__input').type('{enter}');
// Dropdown should close and input should have selected value
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
cy.get('#test-combo .usa-combo-box__input').should('have.value', 'Alaska');
});
it('should verify Escape key closes dropdown without selection', () => {
cy.mount(`
`);
// Open dropdown and navigate
cy.get('#test-combo .usa-combo-box__input').focus().type('{downarrow}{downarrow}');
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Get initial input value
cy.get('#test-combo .usa-combo-box__input')
.invoke('val')
.then((initialValue) => {
// Press Escape
cy.get('#test-combo .usa-combo-box__input').type('{esc}');
// Dropdown should close without changing value
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
cy.get('#test-combo .usa-combo-box__input').should('have.value', initialValue);
});
});
it('should verify Tab key closes dropdown and moves to next element', () => {
cy.mount(`
`);
// Open dropdown
cy.get('#test-combo .usa-combo-box__input').focus().type('{downarrow}');
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Tab should close dropdown and move focus
cy.get('#test-combo .usa-combo-box__input').tab();
// Dropdown should close
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
// Focus should move to next element
cy.get('#next-element').should('be.focused');
});
});
describe('Filtering and Search Behavior', () => {
it('should verify typing filters options correctly', () => {
cy.mount(`
`);
// Type 'al' to filter
cy.get('#test-combo .usa-combo-box__input').focus().type('al');
// Dropdown should open with filtered results
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Should show options containing 'al'
cy.get('#test-combo .usa-combo-box__list-option').should('contain.text', 'Alabama');
cy.get('#test-combo .usa-combo-box__list-option').should('contain.text', 'Alaska');
// Should not show options that don't match
cy.get('#test-combo .usa-combo-box__list-option').should('not.contain.text', 'Arizona');
});
it('should verify filter results highlight matching text', () => {
cy.mount(`
`);
// Type 'cal' to filter
cy.get('#test-combo .usa-combo-box__input').focus().type('cal');
// Should show California with highlighted text
cy.get('#test-combo .usa-combo-box__list-option').should('contain.text', 'California');
// Check if highlighting is applied (depends on implementation)
cy.get('#test-combo .usa-combo-box__list-option')
.first()
.then(($option) => {
const text = $option.text();
expect(text.toLowerCase()).to.include('cal');
});
});
it('should verify clearing input shows all options again', () => {
cy.mount(`
`);
// Type to filter
cy.get('#test-combo .usa-combo-box__input').focus().type('cal');
cy.get('#test-combo .usa-combo-box__list-option').should('have.length', 1);
// Clear input
cy.get('#test-combo .usa-combo-box__input').clear();
// All options should be visible again
cy.get('#test-combo .usa-combo-box__list-option').should('have.length', sampleOptions.length);
});
it('should verify no results message when filter matches nothing', () => {
cy.mount(`
`);
// Type something that won't match any options
cy.get('#test-combo .usa-combo-box__input').focus().type('xyz');
// Should show no results or appropriate message
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
cy.get('#test-combo .usa-combo-box__list-option').should('have.length', 0);
});
});
describe('Click Selection and Mouse Interaction', () => {
it('should verify clicking an option selects it and closes dropdown', () => {
cy.mount(`
`);
// Open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Click on an option
cy.get('#test-combo .usa-combo-box__list-option').contains('California').click();
// Dropdown should close and input should have selected value
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
cy.get('#test-combo .usa-combo-box__input').should('have.value', 'California');
});
it('should verify toggle button opens and closes dropdown', () => {
cy.mount(`
`);
// Click toggle to open
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Click toggle again to close
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
});
it('should verify option hover states work correctly', () => {
cy.mount(`
`);
// Open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Hover over an option
cy.get('#test-combo .usa-combo-box__list-option').first().trigger('mouseover');
// Option should show hover state
cy.get('#test-combo .usa-combo-box__list-option')
.first()
.should('have.class', 'usa-combo-box__list-option--focused');
});
it("should verify rapid clicking doesn't break dropdown behavior", () => {
cy.mount(`
`);
// Rapidly click toggle button multiple times
for (let i = 0; i < 5; i++) {
cy.get('#test-combo .usa-combo-box__toggle-list').click();
}
// Dropdown should still work correctly
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
cy.get('#test-combo .usa-combo-box__list-option').should('be.visible');
// Should be able to select an option
cy.get('#test-combo .usa-combo-box__list-option').first().click();
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
});
});
describe('Value Management and Events', () => {
it('should verify selected value persists after dropdown interactions', () => {
cy.mount(`
`);
// Input should have initial value
cy.get('#test-combo .usa-combo-box__input').should('have.value', 'Florida');
// Open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
// Close without selecting
cy.get('#test-combo .usa-combo-box__input').type('{esc}');
// Value should be preserved
cy.get('#test-combo .usa-combo-box__input').should('have.value', 'Florida');
});
it('should verify custom events are dispatched on selection', () => {
let changeEventFired = false;
let selectionEventFired = false;
cy.mount(
`
`
).then(() => {
// Set up event listeners
cy.get('#test-combo').then(($combo) => {
$combo[0].addEventListener('change', () => {
changeEventFired = true;
});
$combo[0].addEventListener('combo-selection', () => {
selectionEventFired = true;
});
});
});
// Select an option
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list-option').first().click();
// Verify events were fired
cy.then(() => {
expect(changeEventFired).to.be.true;
});
});
it('should verify programmatic value setting works correctly', () => {
cy.mount(`
`);
// Set value programmatically
cy.get('#test-combo').then(($combo) => {
$combo[0].value = 'Georgia';
});
// Input should reflect the change
cy.get('#test-combo .usa-combo-box__input').should('have.value', 'Georgia');
});
});
describe('Error States and Edge Cases', () => {
it('should verify disabled state prevents dropdown interaction', () => {
cy.mount(`
`);
// Input and toggle should be disabled
cy.get('#test-combo .usa-combo-box__input').should('be.disabled');
cy.get('#test-combo .usa-combo-box__toggle-list').should('be.disabled');
// Clicking toggle should not open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click({ force: true });
cy.get('#test-combo .usa-combo-box__list').should('not.be.visible');
});
it('should verify error state styling is applied correctly', () => {
cy.mount(`
`);
// Should show error styling
cy.get('#test-combo .usa-combo-box__input').should('have.class', 'usa-input--error');
cy.get('#test-combo .usa-error-message')
.should('be.visible')
.and('contain.text', 'Please select a valid state');
// Dropdown should still function
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
});
it('should verify combo box with empty options array handles gracefully', () => {
cy.mount(`
`);
// Toggle button should still be clickable
cy.get('#test-combo .usa-combo-box__toggle-list').click();
// Dropdown should open but show no options
cy.get('#test-combo .usa-combo-box__list').should('be.visible');
cy.get('#test-combo .usa-combo-box__list-option').should('have.length', 0);
});
});
describe('Performance and Responsiveness', () => {
it('should verify dropdown opens quickly without delay', () => {
cy.mount(`
`);
const startTime = Date.now();
// Click to open dropdown
cy.get('#test-combo .usa-combo-box__toggle-list').click();
cy.get('#test-combo .usa-combo-box__list')
.should('be.visible')
.then(() => {
const endTime = Date.now();
const duration = endTime - startTime;
expect(duration).to.be.lessThan(300); // Should open within 300ms
});
});
it('should verify filtering large option lists remains responsive', () => {
const largeOptionList = Array.from({ length: 1000 }, (_, i) => `Option ${i + 1}`);
cy.mount(`
`);
const startTime = Date.now();
// Type to filter
cy.get('#test-combo .usa-combo-box__input').focus().type('50');
cy.get('#test-combo .usa-combo-box__list')
.should('be.visible')
.then(() => {
const endTime = Date.now();
const duration = endTime - startTime;
expect(duration).to.be.lessThan(500); // Filtering should be responsive
});
// Should show filtered results
cy.get('#test-combo .usa-combo-box__list-option').should('have.length.lessThan', 100);
});
});
});