///
import { mount } from '@cypress/react'
import * as React from 'react'
import { library } from '@fortawesome/fontawesome-svg-core'
import { fab } from '@fortawesome/free-brands-svg-icons'
import { fas } from '@fortawesome/free-solid-svg-icons'
import { SpecList } from '@packages/runner-shared'
// Need to register these here.
// They are registered once per app, in this case in RunnerCt.
library.add(fas)
library.add(fab)
const specs: Cypress.Cypress['spec'][] = [
{
relative: 'foo/bar/foo.spec.js',
absolute: 'Users/code/foo/bar/foo.spec.js',
name: 'foo/bar/foo.spec.js',
},
{
relative: 'qux/dog.spec.tsx',
absolute: 'qux/dog.spec.tsx',
name: 'qux/dog.spec.tsx',
},
{
relative: 'merp/cat.spec.ts',
absolute: 'merp/cat.spec.ts',
name: 'merp/cat.spec.ts',
},
]
const styles = `
.fa-search {
width: 1em;
}
.fa-times {
width: 0.65em;
}
.specList {
height: 100%;
}
`
describe('SpecList', () => {
const createSpecList = (selectStub: typeof cy.stub): React.FC => {
return () => {
const [selectedFile, setSelectedFile] = React.useState()
const onFileClick = React.useCallback((path: string) => {
selectStub(path)
setSelectedFile(path)
}, [])
return (
)
}
}
it('renders and selects a file', () => {
const selectStub = cy.stub()
const Subject = createSpecList(selectStub)
mount(, { styles })
cy.get('div')
.contains('dog.spec.tsx')
.click()
.then(() => {
expect(selectStub).to.have.been.calledWith('qux/dog.spec.tsx')
})
})
it('closes a folder', () => {
const Subject = createSpecList(cy.stub())
mount(, { styles })
cy.get('div').contains('dog.spec.tsx').should('exist')
// qux folder contains dog.spec.tsx. If we close it, it should not exist anymore.
cy.get('div')
.contains('qux')
.click()
.then(() => {
cy.get('div').contains('dog.spec.tsx').should('not.exist')
})
})
it('navigates with arrow keys', () => {
const selectStub = cy.stub()
const Subject = createSpecList(selectStub)
mount(, { styles })
// close the "foo" directory
cy.get('div').contains('foo').click()
// navigate to "qux"
cy.realPress('ArrowDown')
cy.get('div').contains('dog.spec.tsx').should('exist')
// collapse "qux", hiding "dog.spec.tsx"
cy.realPress('{enter}')
cy.get('div').contains('dog.spec.tsx').should('not.exist')
// uncollapse "qux", revealing "dog.spec.tsx"
cy.realPress('{enter}')
cy.get('div').contains('dog.spec.tsx').should('exist')
// navigate to "dog.spec.tsx"
cy.realPress('ArrowDown')
cy.realPress('{enter}').then(() => {
expect(selectStub).to.have.been.calledWith('qux/dog.spec.tsx')
})
// navigate to "qux"
cy.realPress('ArrowUp')
// navigate to "foo"
cy.realPress('ArrowUp')
// navigate to root
cy.realPress('ArrowUp')
// pressing up on the first spec should focus the search input
cy.realPress('ArrowUp').then(() => {
cy.get('[data-cy="search-specs"]').should('be.focused')
})
})
it('does fuzzy seach and highlighting', () => {
const Subject = createSpecList(cy.stub())
mount(, { styles })
cy.get('[placeholder="Find spec..."]').click()
// all specs visible initially.
cy.get('div').contains('foo.spec.js').should('exist')
cy.get('div').contains('dog.spec.tsx').should('exist')
cy.get('div').contains('cat.spec.ts').should('exist')
// find via folder + file combination. rp from merp, cat.ts from cat.spec.ts.
cy.realType('rpcat.ts')
cy.get('div').contains('foo.spec.js').should('not.exist')
cy.get('div').contains('dog.spec.tsx').should('not.exist')
cy.get('div').contains('cat.spec.ts').should('exist')
cy.then(() => {
// the found folder characters, rp
['r', 'p'].forEach((char) => {
cy.get('[title="merp"] > div > span span').should('contain', char)
})
// the found file characters, ct.ts, should be bold via
;['c', 'a', 't', '.', 't', 's'].forEach((char) => {
cy.get('[title="merp/cat.spec.ts"] > span span').should('contain', char)
})
})
})
it('clears search input when clicking X', () => {
const Subject = createSpecList(cy.stub())
mount(, { styles })
cy.get('[placeholder="Find spec..."').click()
cy.get('input').should('not.have.value', 'spec')
cy.realType('spec')
cy.get('input').should('have.value', 'spec')
cy.get('[data-icon="times"]').click()
cy.get('input').should('not.have.value', 'spec')
})
})