influxdb/ui/test/shared/components/MeasurementList.test.tsx

202 lines
6.1 KiB
TypeScript

import {shallow} from 'enzyme'
import React from 'react'
import MeasurementList from 'src/shared/components/MeasurementList'
import MeasurementListFilter from 'src/shared/components/MeasurementListFilter'
import MeasurementListItem from 'src/shared/components/MeasurementListItem'
import {query, source} from 'test/resources'
const setup = (override = {}) => {
const props = {
onChooseMeasurement: () => {},
onChooseTag: () => {},
onGroupByTag: () => {},
onToggleTagAcceptance: () => {},
query,
querySource: source,
isQuerySupportedByExplorer: true,
...override,
}
MeasurementList.prototype.getMeasurements = jest.fn(() => Promise.resolve())
const wrapper = shallow(<MeasurementList {...props} />, {
context: {source},
})
const instance = wrapper.instance() as MeasurementList
return {
instance,
props,
wrapper,
}
}
describe('Shared.Components.MeasurementList', () => {
describe('rendering', () => {
it('renders to the page', () => {
const {wrapper} = setup()
expect(wrapper.exists()).toBe(true)
})
describe('<MeasurementListItem/>', () => {
it('renders <MeasurementListItem/>`s to the page', () => {
const {wrapper} = setup()
wrapper.setState({filtered: ['foo', 'bar']})
const items = wrapper.find(MeasurementListItem)
const first = items.first()
const last = items.last()
expect(items.length).toBe(2)
expect(first.dive().text()).toContain('foo')
expect(last.dive().text()).toContain('bar')
})
it('renders <MeasurementListFilter/> to the page', () => {
const {wrapper} = setup()
const filter = wrapper.find(MeasurementListFilter)
expect(filter.exists()).toBe(true)
})
})
})
describe('user interactions', () => {
it('can filter the measurement list', () => {
const {wrapper} = setup()
const measurements = ['foo', 'bar']
const event = {target: {value: 'f'}, stopPropagation: () => {}}
wrapper.setState({filtered: measurements, measurements})
const filter = wrapper.find(MeasurementListFilter)
const input = filter.dive().find('input')
input.simulate('change', event)
wrapper.update()
const items = wrapper.find(MeasurementListItem)
expect(items.length).toBe(1)
expect(items.dive().text()).toBe('foo')
})
})
describe('lifecycle methods', () => {
describe('componentDidMount', () => {
it('does not fire getMeasurements if there is no database', () => {
const getMeasurements = jest.fn()
const {instance} = setup({query: {...query, database: ''}})
instance.getMeasurements = getMeasurements
instance.componentDidMount()
expect(getMeasurements).not.toHaveBeenCalled()
})
it('does fire getMeasurements if there is a database', () => {
const getMeasurements = jest.fn()
const {instance} = setup()
instance.getMeasurements = getMeasurements
instance.componentDidMount()
expect(getMeasurements).toHaveBeenCalled()
})
})
describe('componentDidUpdate', () => {
it('does not fire getMeasurements if there is no database', () => {
const getMeasurements = jest.fn()
const {instance, props} = setup({query: {...query, database: ''}})
instance.getMeasurements = getMeasurements
instance.componentDidUpdate(props)
expect(getMeasurements).not.toHaveBeenCalled()
})
it('does not fire getMeasurements if the database does not change and the sources are equal', () => {
const getMeasurements = jest.fn()
const {instance, props} = setup()
instance.getMeasurements = getMeasurements
instance.componentDidUpdate(props)
expect(getMeasurements).not.toHaveBeenCalled()
})
it('it fires getMeasurements if there is a change in database', () => {
const getMeasurements = jest.fn()
const {instance, props} = setup()
instance.getMeasurements = getMeasurements
instance.componentDidUpdate({
...props,
query: {...query, database: 'diffDb'},
})
expect(getMeasurements).toHaveBeenCalled()
})
it('it calls getMeasurements if there is a change in source', () => {
const getMeasurements = jest.fn()
const {instance, props} = setup()
instance.getMeasurements = getMeasurements
instance.componentDidUpdate({
...props,
querySource: {...source, id: 'newSource'},
})
expect(getMeasurements).toHaveBeenCalled()
})
})
})
describe('instance methods', () => {
describe('handleFilterText', () => {
it('sets the filterText state to the event targets value', () => {
const {instance} = setup()
const value = 'spectacs'
const stopPropagation = () => {}
const event = {target: {value}, stopPropagation}
instance.handleFilterText(event)
expect(instance.state.filterText).toBe(value)
})
})
describe('handleEscape', () => {
it('resets fiterText when escape is pressed', () => {
const {instance} = setup()
const key = 'Escape'
const stopPropagation = () => {}
const event = {key, stopPropagation}
instance.setState({filterText: 'foo'})
expect(instance.state.filterText).toBe('foo')
instance.handleEscape(event)
expect(instance.state.filterText).toBe('')
})
it('does not reset fiterText when escape is pressed', () => {
const {instance} = setup()
const key = 'Enter'
const stopPropagation = () => {}
const event = {key, stopPropagation}
instance.setState({filterText: 'foo'})
instance.handleEscape(event)
expect(instance.state.filterText).toBe('foo')
})
})
describe('handleAcceptReject', () => {
it('it calls onToggleTagAcceptance', () => {
const onToggleTagAcceptance = jest.fn()
const {instance} = setup({onToggleTagAcceptance})
instance.handleAcceptReject()
expect(onToggleTagAcceptance).toHaveBeenCalledTimes(1)
})
})
})
})