import { Email } from './Email' import { getRandomIndex, getRandomInt } from '../cypress/support/component' import domains from '../src/domains.json' it('Should pass ARIA axe tests', () => { cy.log('Axe not supported on Firefox or Webkit') cy.mount() cy.withinRoot(() => { cy.get('input').type('myuser') }) cy.downArrow(2) cy.injectAxe() cy.checkA11y('.Root', { runOnly: ['cat.aria'], }) }) it('Should display coherent baseList suggestions according to input change', () => { const baseList = ['gmail.com', 'yahoo.com', 'hotmail.com', 'aol.com'] cy.mount() cy.withinRoot(() => { cy.get('input').type('myusern') cy.get('li').each((li, index) => { expect(li.text()).to.contain(`myusern@${baseList[index]}`) }) }) }) it('Should display coherent refineList suggestions according to input change', () => { cy.mount() const user = 'myusername' cy.withinRoot(() => { cy.get('input').type(`${user}@g`) cy.get('li').each((li) => { expect(li.text()).to.contain(`${user}@g`) }) cy.get('input').type('m') cy.get('li').each((li) => { expect(li.text()).to.contain(`${user}@gm`) }) cy.get('input').type('x') cy.get('li').each((li) => { expect(li.text()).to.contain(`${user}@gmx`) }) }) }) it('Should hide baseList suggestions once users press @', () => { const baseList = ['gmail.com', 'yahoo.com', 'hotmail.com', 'aol.com'] cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername') cy.get('li').should('have.length', baseList.length) cy.get('input').type('@') cy.get('ul').should('not.exist') }) }) it('Should hide suggestions if no match', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('ul').should('exist') cy.get('input').type('xsdasdsad') cy.get('ul').should('not.exist') }) }) it('Should hide suggestions if clearing', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('ul').should('exist') cy.get('input').clear() cy.get('ul').should('not.exist') }) }) it('Should hide suggestions if exact match', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('li').should('exist') cy.get('input').clear().type('myusername@gmail.com') cy.get('ul').should('not.exist') cy.get('input').type('{backspace}') cy.get('ul').should('exist') }) }) it('Should hide suggestions if clicking outside', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('ul').should('exist') }) cy.get('body').trigger('click') cy.get('.dropdownClass').should('not.exist') }) it('Should hide suggestions if pressing escape key', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('ul').should('exist') }) cy.realType('{esc}') cy.get('.dropdownClass').should('not.exist') }) it('Should hide refineList suggestions if multiple @ in domain', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@gm@') cy.get('ul').should('not.exist') }) }) it('Should hide refineList suggestions if deleting username', () => { cy.mount() const username = 'username' const domain = '@gmail' cy.withinRoot(() => { cy.get('input').type(`${username}${domain}`) cy.get('ul').should('exist') cy.get('input').type('{leftArrow}'.repeat(domain.length)).type('{backspace}'.repeat(username.length)) cy.get('ul').should('not.exist') }) }) it('Should update suggestions username on username change', () => { const initialUsername = 'myusername' it('Username', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type(`${initialUsername}@g`) cy.get('span:first-of-type').each((span) => { expect(span.text()).to.be.eq(initialUsername) }) cy.get('input').type(`{leftArrow}{leftArrow}`) const charsToDel = getRandomInt(1, initialUsername.length) cy.get('input').type(`${'{backspace}'.repeat(charsToDel)}`) cy.get('span:first-of-type').each((span) => { expect(span.text()).to.be.eq(initialUsername.slice(0, -charsToDel)) }) }) }) }) it('Should update input value on suggestion click', () => { cy.mount() for (let i = 0; i < 10; i++) { cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('li').then((list) => { const randomIndex = getRandomIndex(list.length) list.eq(randomIndex).trigger('click') cy.get('input').should('have.value', list[randomIndex].textContent).clear() }) }) } }) it('Should update input value on suggestion keydown', () => { cy.mount() for (let i = 0; i < 10; i++) { cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('li').then((list) => { const randomIndex = getRandomIndex(list.length) cy.downArrow(randomIndex + 1) cy.get('li').eq(randomIndex).should('have.focus').type('{enter}') cy.get('input').should('have.value', list[randomIndex].textContent).clear() }) }) } }) it('Should keyboard-navigate trough suggestions and input', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('li').then((list) => { const randomIndex = getRandomIndex(list.length) cy.downArrow(randomIndex + 1) cy.get('li').eq(randomIndex).should('have.focus') cy.upArrow(randomIndex + 1) cy.get('input').should('have.focus') }) }) }) it('Should set previous focused suggestion by resuming from hovered one', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('li').then((list) => { let randomIndex = getRandomIndex(list.length) // Force to not get the first suggestion index if (randomIndex === 0) { randomIndex = 1 } cy.get('li').eq(randomIndex).realMouseMove(10, 10) cy.get('input').type('{upArrow}') cy.get('li') .eq(randomIndex - 1) .should('have.focus') }) }) }) it('Should update focused suggestion by resuming from hovered one', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.downArrow(1) // Focus 1st suggestion cy.get('li').eq(0).should('have.focus') cy.get('li').eq(3).realMouseMove(10, 10) // Hover 4th suggestion cy.upArrow(1) cy.get('li').eq(2).should('have.focus') }) }) it('Should focus first suggestion if pressing arrow down on last one', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.downArrow(1) cy.get('li').then((list) => { cy.downArrow(list.length) cy.get('li').eq(0).should('have.focus') }) }) }) it('Should focus and update input value if pressing alphanumeric chars from a suggestion', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('li').then((list) => { cy.downArrow(getRandomIndex(list.length)) cy.realType('mail') cy.get('input').should('have.focus').and('have.value', 'myusername@gmail') }) }) }) it('Should focus and update input value if pressing @ from a suggestion', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusern') cy.get('li').then((list) => { cy.downArrow(getRandomIndex(list.length)) cy.realType('@gm') cy.get('input').should('have.focus').and('have.value', 'myusern@gm') }) }) }) it('Should focus and update input value if pressing . from a suggestion', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusern') cy.get('li').then((list) => { cy.downArrow(getRandomIndex(list.length)) cy.realType('.') cy.get('input').should('have.focus').and('have.value', 'myusern.') }) }) }) it('Should focus and update input value if pressing backspace on a suggestion', () => { cy.mount() const initialValue = 'myusername@g' const charsToDel = 2 cy.withinRoot(() => { cy.get('input').type(initialValue) cy.get('li').then((list) => { cy.downArrow(list.length) cy.realType('{backspace}'.repeat(charsToDel)) cy.get('input').should('have.focus').and('have.value', initialValue.slice(0, -charsToDel)) }) }) }) it('Should open dropdown only after minChars is reached', () => { cy.mount() const charsArr = 'myus'.split('') cy.withinRoot(() => { charsArr.forEach((char, index) => { cy.get('input').type(char) if (index === charsArr.length - 1) { cy.get('ul').should('exist') } else { cy.get('ul').should('not.exist') } }) }) }) it('Should display maximum user-defined result number', () => { cy.mount() cy.withinRoot(() => { cy.get('input').type('myusername@g') cy.get('li').should('have.length', 3) }) }) it('Should trigger user onBlur/onFocus only if related target is not a suggestion', () => { cy.mount() cy.withinRoot(() => { cy.get('input').focus().type('myusername@g') cy.get('li').then((list) => { const randomIndex = getRandomIndex(list.length) for (let i = 0; i < 10; i++) { cy.downArrow(randomIndex + 1) cy.upArrow(randomIndex + 1) } cy.get('input').should('have.focus').blur() }) }) cy.get('#CyFocusData').should('have.attr', 'data-cy-focus', '1').and('have.attr', 'data-cy-blur', '1') }) it('Should forward HTML attributes to input element', () => { const name = 'MyName' const placeholder = 'MyPlaceholder' const pattern = '^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$' cy.mount() cy.withinRoot(() => { cy.get('input') .should('have.attr', 'name', name) .and('have.attr', 'placeholder', placeholder) .and('have.attr', 'pattern', pattern) .and('be.disabled') .and('have.attr', 'readonly', 'readonly') .and('have.attr', 'required', 'required') }) }) it('Should forward props to dropdown', () => { cy.mount() cy.get('input').type('myusername') cy.withinRoot(() => { cy.get('ul').should('have.attr', 'aria-label', 'foo') }) }) it('Should set custom active data attribute', () => { cy.mount() cy.get('input').type('myusername') cy.downArrow(1) cy.withinRoot(() => { cy.get('li').eq(0).should('have.attr', 'data-custom', 'true') }) }) describe('Classnames', () => { const classes = { wrapper: 'WC', input: 'IC', username: 'UC', domain: 'DC', } it('Should add a custom wrapper class', () => { cy.mount() cy.get('.customWrapperClass').should('exist') }) it('Should add custom classes', () => { cy.mount( ) cy.withinRoot(() => { cy.get('input').should('have.class', 'IC').type('myusername') cy.get('ul').should('have.class', 'DPC') cy.get('li').should('have.class', 'SC') cy.get('span:first-of-type').should('have.class', 'UC') cy.get('span:last-of-type').should('have.class', 'DC') }) }) it('Should add only defined classes', () => { cy.mount() cy.withinRoot(() => { cy.get('input').should('have.class', 'IC').type('myusername') cy.get('ul').should('not.have.class', 'DPC') cy.get('li').should('not.have.class', 'SC') cy.get('span:first-of-type').should('have.class', 'UC') cy.get('span:last-of-type').should('have.class', 'DC') }) }) it('Should add both wrapper classes', () => { cy.mount() cy.get('.wrapperClass').should('have.class', 'WC') }) })