import { beVisible, beHidden, haveAttribute, haveClasses, notHaveClasses, haveText, html, notBeVisible, notHaveAttribute, notExist, haveFocus, test, ensureNoConsoleWarns} from '../../../utils'
test('it works with x-model',
[html`
`],
({ get }) => {
get('ul').should(notBeVisible())
get('button')
.should(haveText('Select Person'))
.click()
get('ul').should(beVisible())
get('button').click()
get('ul').should(notBeVisible())
get('button').click()
get('[option="2"]').click()
get('ul').should(notBeVisible())
get('button').should(haveText('Arlene Mccoy'))
},
)
test('it works with internal state',
[html`
`],
({ get }) => {
get('ul').should(notBeVisible())
get('button')
.should(haveText('Select Person'))
.click()
get('ul').should(beVisible())
get('button').click()
get('ul').should(notBeVisible())
get('button').click()
get('[option="2"]').click()
get('ul').should(notBeVisible())
get('button').should(haveText('Arlene Mccoy'))
},
)
test('$listbox/$listboxOption',
[html`
`],
({ get }) => {
get('article').should(haveText(''))
get('[option="5"]').should(haveClasses(['disabled']))
get('button')
.should(haveText('Select Person'))
.click()
get('article').should(haveText('Wade Cooper'))
get('[option="1"]').should(haveClasses(['active']))
get('ul').type('{downarrow}')
get('article').should(haveText('Arlene Mccoy'))
get('[option="2"]').should(haveClasses(['active']))
get('button').should(haveText('Select Person'))
get('[option="2"]').click()
get('button').should(haveText('Arlene Mccoy'))
get('[option="2"]').should(haveClasses(['selected']))
},
)
test('"name" prop',
[html`
`],
({ get }) => {
get('input').should(haveAttribute('value', 'null'))
get('button').click()
get('input').should(haveAttribute('value', 'null'))
get('[option="2"]').click()
get('input').should(beHidden())
.should(haveAttribute('name', 'person'))
.should(haveAttribute('value', '2'))
.should(haveAttribute('type', 'hidden'))
get('button').click()
get('[option="4"]').click()
get('input').should(beHidden())
.should(haveAttribute('name', 'person'))
.should(haveAttribute('value', '4'))
.should(haveAttribute('type', 'hidden'))
},
);
test('"name" prop with object value',
[html`
`],
({ get }) => {
get('input[name="person"]').should(haveAttribute('value', 'null'))
get('button').click()
get('[name="person[id]"]').should(notExist())
get('[option="2"]').click()
get('input[name="person"]').should(notExist())
get('[name="person[id]"]').should(beHidden())
.should(haveAttribute('value', '2'))
.should(haveAttribute('type', 'hidden'))
get('[name="person[name]"]').should(beHidden())
.should(haveAttribute('value', 'Arlene Mccoy'))
.should(haveAttribute('type', 'hidden'))
get('button').click()
get('[option="4"]').click()
get('[name="person[id]"]').should(beHidden())
.should(haveAttribute('value', '4'))
.should(haveAttribute('type', 'hidden'))
get('[name="person[name]"]').should(beHidden())
.should(haveAttribute('value', 'Tom Cook'))
.should(haveAttribute('type', 'hidden'))
},
);
test('"default-value" prop',
[html`
`],
({ get }) => {
get('input').should(beHidden())
.should(haveAttribute('name', 'person'))
.should(haveAttribute('value', '2'))
.should(haveAttribute('type', 'hidden'))
},
);
test('"multiple" prop',
[html`
`],
({ get }) => {
get('button').click()
get('[option="2"]').click()
get('ul').should(beVisible())
get('button').should(haveText('2'))
get('[option="4"]').click()
get('button').should(haveText('2,4'))
get('ul').should(beVisible())
get('[option="4"]').click()
get('button').should(haveText('2'))
get('ul').should(beVisible())
},
);
test('"multiple" and "name" props together',
[html`
`],
({ get }) => {
get('input[name="people"]').should(notExist())
get('button').click()
get('[name="people[0][id]"]').should(notExist())
get('[option="2"]').click()
get('ul').should(beVisible())
get('button').should(haveText('2'))
get('input[name="people"]').should(notExist())
get('[name="people[0][id]"]').should(beHidden())
.should(haveAttribute('value', '2'))
.should(haveAttribute('type', 'hidden'))
get('[name="people[0][name]"]').should(beHidden())
.should(haveAttribute('value', 'Arlene Mccoy'))
.should(haveAttribute('type', 'hidden'))
get('[option="4"]').click()
get('[name="people[0][id]"]').should(beHidden())
.should(haveAttribute('value', '2'))
.should(haveAttribute('type', 'hidden'))
get('[name="people[0][name]"]').should(beHidden())
.should(haveAttribute('value', 'Arlene Mccoy'))
.should(haveAttribute('type', 'hidden'))
get('[name="people[1][id]"]').should(beHidden())
.should(haveAttribute('value', '4'))
.should(haveAttribute('type', 'hidden'))
get('[name="people[1][name]"]').should(beHidden())
.should(haveAttribute('value', 'Tom Cook'))
.should(haveAttribute('type', 'hidden'))
get('button').should(haveText('2,4'))
get('ul').should(beVisible())
get('[option="4"]').click()
get('[name="people[0][id]"]').should(beHidden())
.should(haveAttribute('value', '2'))
.should(haveAttribute('type', 'hidden'))
get('[name="people[0][name]"]').should(beHidden())
.should(haveAttribute('value', 'Arlene Mccoy'))
.should(haveAttribute('type', 'hidden'))
get('[name="people[1][id]"]').should(notExist())
get('[name="people[1][name]"]').should(notExist())
get('button').should(haveText('2'))
get('ul').should(beVisible())
},
);
test('keyboard controls',
[html`
`],
({ get }) => {
get('.active').should(notExist())
get('button').focus().type(' ')
get('[options]')
.should(beVisible())
.should(haveFocus())
get('[option="1"]')
.should(haveClasses(['active']))
get('[options]')
.type('{downarrow}')
get('[option="2"]')
.should(haveClasses(['active']))
get('[options]')
.type('{downarrow}')
get('[option="4"]')
.should(haveClasses(['active']))
get('[options]')
.type('{uparrow}')
get('[option="2"]')
.should(haveClasses(['active']))
get('[options]')
.type('{home}')
get('[option="1"]')
.should(haveClasses(['active']))
get('[options]')
.type('{end}')
get('[option="10"]')
.should(haveClasses(['active']))
get('[options]')
.type('{pageUp}')
get('[option="1"]')
.should(haveClasses(['active']))
get('[options]')
.type('{pageDown}')
get('[option="10"]')
.should(haveClasses(['active']))
get('[options]')
.tab()
.should(haveFocus())
.should(beVisible())
.tab({ shift: true })
.should(haveFocus())
.should(beVisible())
.type('{esc}')
.should(notBeVisible())
},
)
test('"horizontal" keyboard controls',
[html`
`],
({ get }) => {
get('.active').should(notExist())
get('button').focus().type(' ')
get('[options]')
.should(haveAttribute('aria-orientation', 'horizontal'))
.should(beVisible())
.should(haveFocus())
get('[option="1"]')
.should(haveClasses(['active']))
get('[options]')
.type('{rightarrow}')
get('[option="2"]')
.should(haveClasses(['active']))
get('[options]')
.type('{rightarrow}')
get('[option="4"]')
.should(haveClasses(['active']))
get('[options]')
.type('{leftarrow}')
get('[option="2"]')
.should(haveClasses(['active']))
},
)
test('"by" prop with string value',
[html`
`],
({ get }) => {
get('ul').should(notBeVisible())
get('button')
.should(haveText('Select Person'))
.click()
get('ul').should(beVisible())
get('button').click()
get('ul').should(notBeVisible())
get('button').click()
get('[option="2"]').click()
get('ul').should(notBeVisible())
get('button').should(haveText('Arlene Mccoy'))
},
)
test('search',
[html`
`],
({ get, wait }) => {
get('.active').should(notExist())
get('button').click()
get('[options]')
.type('ar')
get('[option="2"]')
.should(haveClasses(['active']))
wait(500)
get('[options]')
.type('ma')
get('[option="8"]')
.should(haveClasses(['active']))
},
)
test('changing value manually changes internal state',
[html`
`],
({ get }) => {
get('[select-tim]').click()
get('[option="4"]').should(haveClasses(['selected']))
get('[option="1"]').should(notHaveClasses(['selected']))
get('[toggle]').should(haveText('4'))
},
)
test('has accessibility attributes',
[html`
`],
({ get }) => {
get('button')
.should(haveAttribute('aria-haspopup', 'true'))
.should(haveAttribute('aria-labelledby', 'alpine-listbox-label-1'))
.should(haveAttribute('aria-expanded', 'false'))
.should(notHaveAttribute('aria-controls'))
.should(haveAttribute('id', 'alpine-listbox-button-1'))
.click()
.should(haveAttribute('aria-expanded', 'true'))
.should(haveAttribute('aria-controls', 'alpine-listbox-options-1'))
get('[options]')
.should(haveAttribute('aria-orientation', 'vertical'))
.should(haveAttribute('role', 'listbox'))
.should(haveAttribute('id', 'alpine-listbox-options-1'))
.should(haveAttribute('aria-labelledby', 'alpine-listbox-button-1'))
.should(notHaveAttribute('aria-activedescendant'))
.should(haveAttribute('tabindex', '0'))
.should(haveAttribute('aria-activedescendant', 'alpine-listbox-option-1'))
get('[option="1"]')
.should(haveAttribute('role', 'option'))
.should(haveAttribute('id', 'alpine-listbox-option-1'))
.should(haveAttribute('tabindex', '-1'))
.should(haveAttribute('aria-selected', 'false'))
get('[option="2"]')
.should(haveAttribute('role', 'option'))
.should(haveAttribute('id', 'alpine-listbox-option-2'))
.should(haveAttribute('tabindex', '-1'))
.should(haveAttribute('aria-selected', 'false'))
get('[options]')
.type('{downarrow}')
.should(haveAttribute('aria-activedescendant', 'alpine-listbox-option-2'))
get('[option="2"]')
.click()
.should(haveAttribute('aria-selected', 'true'))
},
)
test('"static" prop',
[html`
`],
({ get }) => {
get('ul').should(notBeVisible())
get('[normal-toggle]')
.should(haveText('Select Person'))
.click()
get('ul').should(notBeVisible())
get('[real-toggle]').click()
get('ul').should(beVisible())
get('[option="2"]').click()
get('ul').should(beVisible())
get('[normal-toggle]').should(haveText('Arlene Mccoy'))
},
)
test('works with morph',
[html`
`],
({ get }, reload, window, document) => {
let toHtml = html`
Selected:
`
ensureNoConsoleWarns()
get('div').then(([el]) => window.Alpine.morph(el, toHtml))
get('button').should(haveText('Select Framework (updated)'))
},
)
test('boolean option values',
[html`
`],
({ get }) => {
get('ul').should(notBeVisible())
get('button')
.should(haveText('Select boolean'))
.click()
get('ul').should(beVisible())
get('[option="boolean-true"]').should(notHaveClasses(['selected']))
get('[option="boolean-false"]').should(notHaveClasses(['selected']))
get('[option="boolean-true"]').click()
get('ul').should(notBeVisible())
get('button').should(haveText('true'))
get('button').click()
get('ul').should(beVisible())
get('[option="boolean-true"]').should(haveClasses(['selected']))
get('[option="boolean-false"]').should(notHaveClasses(['selected']))
get('[option="boolean-false"]').click()
get('ul').should(notBeVisible())
get('button').should(haveText('false'))
get('button').click()
get('ul').should(beVisible())
get('[option="boolean-true"]').should(notHaveClasses(['selected']))
get('[option="boolean-false"]').should(haveClasses(['selected']))
},
)
test('integer option values',
[html`
`],
({ get }) => {
get('ul').should(notBeVisible())
get('button')
.should(haveText('Select number'))
.click()
get('ul').should(beVisible())
get('[option="0"]').should(notHaveClasses(['selected']))
get('[option="1"]').should(notHaveClasses(['selected']))
get('[option="2"]').should(notHaveClasses(['selected']))
get('[option="1"]').click()
get('ul').should(notBeVisible())
get('button').should(haveText('1'))
get('button').click()
get('ul').should(beVisible())
get('[option="0"]').should(notHaveClasses(['selected']))
get('[option="1"]').should(haveClasses(['selected']))
get('[option="2"]').should(notHaveClasses(['selected']))
get('[option="0"]').click()
get('ul').should(notBeVisible())
get('button').should(haveText('0'))
get('button').click()
get('ul').should(beVisible())
get('[option="0"]').should(haveClasses(['selected']))
get('[option="1"]').should(notHaveClasses(['selected']))
get('[option="2"]').should(notHaveClasses(['selected']))
get('[option="2"]').click()
get('ul').should(notBeVisible())
get('button').should(haveText('2'))
get('button').click()
get('ul').should(beVisible())
get('[option="0"]').should(notHaveClasses(['selected']))
get('[option="1"]').should(notHaveClasses(['selected']))
get('[option="2"]').should(haveClasses(['selected']))
},
)
// test "by" attribute