|
@@ -0,0 +1,513 @@
|
|
|
+import { haveAttribute, haveFocus, html, haveClasses, notHaveClasses, test, haveText, notExist, beHidden, } from '../../../utils'
|
|
|
+
|
|
|
+test('it works using x-model',
|
|
|
+ [html`
|
|
|
+ <main x-data="{ active: null, access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]}">
|
|
|
+ <div x-radio x-model="active">
|
|
|
+ <fieldset>
|
|
|
+ <legend>
|
|
|
+ <h2 x-radio:label>Privacy setting</h2>
|
|
|
+ </legend>
|
|
|
+
|
|
|
+ <div>
|
|
|
+ <template x-for="({ id, name, description, disabled }, i) in access" :key="id">
|
|
|
+ <div :option="id" x-radio:option :value="id" :disabled="disabled">
|
|
|
+ <span x-radio:label x-text="name"></span>
|
|
|
+ <span x-radio:description x-text="description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </fieldset>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <input x-model="active" type="hidden">
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('input').should(haveAttribute('value', ''))
|
|
|
+ get('[option="access-2"]').click()
|
|
|
+ get('input').should(haveAttribute('value', 'access-2'))
|
|
|
+ get('[option="access-4"]').click()
|
|
|
+ get('input').should(haveAttribute('value', 'access-4'))
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+test('it works without x-model/with default-value',
|
|
|
+ [html`
|
|
|
+ <main x-data="{ access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]}">
|
|
|
+ <div x-radio default-value="access-4">
|
|
|
+ <fieldset>
|
|
|
+ <legend>
|
|
|
+ <h2 x-radio:label>Privacy setting</h2>
|
|
|
+ </legend>
|
|
|
+
|
|
|
+ <div>
|
|
|
+ <template x-for="({ id, name, description, disabled }, i) in access" :key="id">
|
|
|
+ <div :option="id" x-radio:option :value="id" :disabled="disabled">
|
|
|
+ <span x-radio:label x-text="name"></span>
|
|
|
+ <span x-radio:description x-text="description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </fieldset>
|
|
|
+ </div>
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('[option="access-4"]').should(haveAttribute('aria-checked', 'true'))
|
|
|
+ get('[option="access-2"]').click()
|
|
|
+ get('[option="access-2"]').should(haveAttribute('aria-checked', 'true'))
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+test('cannot select any option when the group is disabled',
|
|
|
+ [html`
|
|
|
+ <main x-data="{ active: null, access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]}">
|
|
|
+ <div x-radio x-model="active" disabled>
|
|
|
+ <template x-for="({ id, name, description, disabled }, i) in access" :key="id">
|
|
|
+ <div :option="id" x-radio:option :value="id" :disabled="disabled">
|
|
|
+ <span x-radio:label x-text="name"></span>
|
|
|
+ <span x-radio:description x-text="description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <input x-model="active" type="hidden">
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('input').should(haveAttribute('value', ''))
|
|
|
+ get('[option="access-1"]').click()
|
|
|
+ get('input').should(haveAttribute('value', ''))
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+test('cannot select a disabled option',
|
|
|
+ [html`
|
|
|
+ <main x-data="{ active: null, access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]}">
|
|
|
+ <div x-radio x-model="active">
|
|
|
+ <template x-for="({ id, name, description, disabled }, i) in access" :key="id">
|
|
|
+ <div :option="id" x-radio:option :value="id" :disabled="disabled">
|
|
|
+ <span x-radio:label x-text="name"></span>
|
|
|
+ <span x-radio:description x-text="description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <input x-model="active" type="hidden">
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('input').should(haveAttribute('value', ''))
|
|
|
+ get('[option="access-3"]').click()
|
|
|
+ get('input').should(haveAttribute('value', ''))
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+test('keyboard navigation works',
|
|
|
+ [html`
|
|
|
+ <main x-data="{ active: null, access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]}">
|
|
|
+ <div x-radio x-model="active">
|
|
|
+ <template x-for="({ id, name, description, disabled }, i) in access" :key="id">
|
|
|
+ <div :option="id" x-radio:option :value="id" :disabled="disabled">
|
|
|
+ <span x-radio:label x-text="name"></span>
|
|
|
+ <span x-radio:description x-text="description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <input x-model="active" type="hidden">
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('input').should(haveAttribute('value', ''))
|
|
|
+ get('[option="access-1"]').focus().type('{downarrow}')
|
|
|
+ get('[option="access-2"]').should(haveFocus()).type('{downarrow}')
|
|
|
+ get('[option="access-4"]').should(haveFocus()).type('{downarrow}')
|
|
|
+ get('[option="access-1"]').should(haveFocus())
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+test('has accessibility attributes',
|
|
|
+ [html`
|
|
|
+ <main x-data="{ active: null, access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]}">
|
|
|
+ <div x-radio group x-model="active">
|
|
|
+ <fieldset>
|
|
|
+ <legend>
|
|
|
+ <h2 x-radio:label>Privacy setting</h2>
|
|
|
+ <p x-radio:description>Some description</p>
|
|
|
+ </legend>
|
|
|
+
|
|
|
+ <div>
|
|
|
+ <template x-for="({ id, name, description, disabled }, i) in access" :key="id">
|
|
|
+ <div :option="id" x-radio:option :value="id" :disabled="disabled">
|
|
|
+ <span :label="id" x-radio:label x-text="name"></span>
|
|
|
+ <span :description="id" x-radio:description x-text="description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </fieldset>
|
|
|
+ </div>
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('[group]').should(haveAttribute('role', 'radiogroup'))
|
|
|
+ .should(haveAttribute('aria-labelledby', 'alpine-radio-label-1'))
|
|
|
+ .should(haveAttribute('aria-describedby', 'alpine-radio-description-1'))
|
|
|
+ get('h2').should(haveAttribute('id', 'alpine-radio-label-1'))
|
|
|
+ get('p').should(haveAttribute('id', 'alpine-radio-description-1'))
|
|
|
+
|
|
|
+ get('[option="access-1"]')
|
|
|
+ .should(haveAttribute('tabindex', 0))
|
|
|
+
|
|
|
+ for (i in 4) {
|
|
|
+ get(`[option="access-${i}"]`)
|
|
|
+ .should(haveAttribute('role', 'radio'))
|
|
|
+ .should(haveAttribute('aria-disabled', 'false'))
|
|
|
+ .should(haveAttribute('aria-labelledby', `alpine-radio-label-${i + 1}`))
|
|
|
+ .should(haveAttribute('aria-describedby', `alpine-radio-description-${i + 1}`))
|
|
|
+ get(`[label="access-${i}"]`)
|
|
|
+ .should(haveAttribute('id', `alpine-radio-label-${i + 1}`))
|
|
|
+ get(`[description="access-${i}"]`)
|
|
|
+ .should(haveAttribute('id', `alpine-radio-description-${i + 1}`))
|
|
|
+ }
|
|
|
+
|
|
|
+ get('[option="access-1"]')
|
|
|
+ .click()
|
|
|
+ .should(haveAttribute('aria-checked', 'true'))
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+test('$radioOption.isActive, $radioOption.isChecked, $radioOption.isDisabled work',
|
|
|
+ [html`
|
|
|
+ <main x-data="{ access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]}">
|
|
|
+ <div x-radio group>
|
|
|
+ <template x-for="({ id, name, description, disabled }, i) in access" :key="id">
|
|
|
+ <div
|
|
|
+ :option="id"
|
|
|
+ x-radio:option
|
|
|
+ :value="id"
|
|
|
+ :disabled="disabled"
|
|
|
+ :class="{
|
|
|
+ 'active': $radioOption.isActive,
|
|
|
+ 'checked': $radioOption.isChecked,
|
|
|
+ 'disabled': $radioOption.isDisabled,
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <span :label="id" x-radio:label x-text="name"></span>
|
|
|
+ <span :description="id" x-radio:description x-text="description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('[option="access-1"]')
|
|
|
+ .should(notHaveClasses(['active', 'checked', 'disabled']))
|
|
|
+ .focus()
|
|
|
+ .should(haveClasses(['active']))
|
|
|
+ .should(notHaveClasses(['checked']))
|
|
|
+ .type(' ')
|
|
|
+ .should(haveClasses(['active', 'checked']))
|
|
|
+ .type('{downarrow}')
|
|
|
+ get('[option="access-2"]')
|
|
|
+ .should(haveClasses(['active', 'checked']))
|
|
|
+ get('[option="access-3"]')
|
|
|
+ .should(haveClasses(['disabled']))
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+test('can bind objects to the value',
|
|
|
+ [html`
|
|
|
+ <main x-data="{ active: null, access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]}">
|
|
|
+ <div x-radio group x-model="active">
|
|
|
+ <template x-for="(option, i) in access" :key="option.id">
|
|
|
+ <div
|
|
|
+ :option="option.id"
|
|
|
+ x-radio:option
|
|
|
+ :value="option"
|
|
|
+ :disabled="option.disabled"
|
|
|
+ >
|
|
|
+ <span :label="option.id" x-radio:label x-text="option.name"></span>
|
|
|
+ <span :description="option.id" x-radio:description x-text="option.description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <article x-text="JSON.stringify(active)"></article>
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('[option="access-2"]').click()
|
|
|
+ get('article')
|
|
|
+ .should(haveText(JSON.stringify({
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ })))
|
|
|
+ },
|
|
|
+)
|
|
|
+
|
|
|
+test('name prop',
|
|
|
+ [html`
|
|
|
+ <main
|
|
|
+ x-data="{
|
|
|
+ active: null,
|
|
|
+ access: [
|
|
|
+ {
|
|
|
+ id: 'access-1',
|
|
|
+ name: 'Public access',
|
|
|
+ description: 'This project would be available to anyone who has the link',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-2',
|
|
|
+ name: 'Private to Project Members',
|
|
|
+ description: 'Only members of this project would be able to access',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-3',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'access-4',
|
|
|
+ name: 'Private to you',
|
|
|
+ description: 'You are the only one able to access this project',
|
|
|
+ disabled: false,
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ">
|
|
|
+ <div x-radio group x-model="active" name="access">
|
|
|
+ <template x-for="({ id, name, description, disabled }, i) in access" :key="id">
|
|
|
+ <div
|
|
|
+ :option="id"
|
|
|
+ x-radio:option
|
|
|
+ :value="id"
|
|
|
+ :disabled="disabled"
|
|
|
+ >
|
|
|
+ <span :label="id" x-radio:label x-text="name"></span>
|
|
|
+ <span :description="id" x-radio:description x-text="description"></span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </main>
|
|
|
+ `],
|
|
|
+ ({ get }) => {
|
|
|
+ get('input').should(notExist())
|
|
|
+ get('[option="access-2"]').click()
|
|
|
+ get('input').should(beHidden())
|
|
|
+ .should(haveAttribute('name', 'access'))
|
|
|
+ .should(haveAttribute('value', 'access-2'))
|
|
|
+ .should(haveAttribute('type', 'hidden'))
|
|
|
+ get('[option="access-4"]').click()
|
|
|
+ get('input').should(beHidden())
|
|
|
+ .should(haveAttribute('name', 'access'))
|
|
|
+ .should(haveAttribute('value', 'access-4'))
|
|
|
+ .should(haveAttribute('type', 'hidden'))
|
|
|
+ },
|
|
|
+)
|