react-conventions
Version:
An open source set of React components that implement Ambassador's Design and UX patterns.
155 lines (123 loc) • 5.59 kB
JavaScript
import React from 'react'
import TestUtils from 'react-addons-test-utils'
import { shallow, mount } from 'enzyme'
import WrappedDropdown, { Dropdown } from '../src/components/Dropdown'
import Immutable from 'immutable'
describe('Dropdown', () => {
let wrapper, trigger
it('should display a dropdown', () => {
wrapper = shallow(<WrappedDropdown trigger='Test'>This is a test.</WrappedDropdown>)
expect(wrapper.props().trigger).to.equal('Test')
expect(wrapper.props().isOpened).to.be.false
expect(wrapper.childAt(0).text()).to.equal('This is a test.')
expect(wrapper.childAt(1).childAt(0).hasClass('list-wrapper')).to.equal(false)
expect(wrapper.childAt(1).find('ul').length).to.equal(0)
expect(wrapper.childAt(1).find('li').length).to.equal(0)
})
it('should open when clicked', () => {
wrapper = mount(<WrappedDropdown trigger='Test'>This is a test.</WrappedDropdown>)
trigger = wrapper.childAt(0)
expect(trigger.hasClass('trigger')).to.equal(true)
expect(wrapper.find('.dropdown-component').hasClass('dropdown-component')).to.equal(true)
trigger.simulate('click')
expect(wrapper.find('.dropdown-component').hasClass('dropdown-component')).to.equal(true)
expect(wrapper.find('.dropdown-component').hasClass('is-opened')).to.equal(true)
})
it('should be opened by default', () => {
wrapper = mount(<WrappedDropdown isOpened={true} trigger='Test'>This is a test.</WrappedDropdown>)
expect(wrapper.find('.dropdown-component').hasClass('dropdown-component')).to.equal(true)
expect(wrapper.find('.dropdown-component').hasClass('is-opened')).to.equal(true)
})
it('should take an optional CSS class', () => {
wrapper = mount(<WrappedDropdown optClass='test' trigger='Test'>This is a test.</WrappedDropdown>)
expect(wrapper.find('.dropdown-component').hasClass('dropdown-component')).to.equal(true)
expect(wrapper.find('.dropdown-component').hasClass('test')).to.equal(true)
})
it('displays a modified state upon changing props', function () {
var TestParent = React.createFactory(React.createClass({
getInitialState() {
return {isOpened: false}
},
render() {
return <WrappedDropdown ref='dropdown' trigger='Test' isOpened={this.state.isOpened}>This is a test.</WrappedDropdown>
}
}))
var parent = TestUtils.renderIntoDocument(TestParent())
expect(parent.refs.dropdown.props.isOpened).to.be.false
parent.setState({
isOpened: true
})
expect(parent.refs.dropdown.props.isOpened).to.be.true
})
it('should call changeCallback function', () => {
const spy = sinon.spy()
wrapper = mount(<WrappedDropdown optClass='test' trigger='Test' changeCallback={spy}>This is a test.</WrappedDropdown>)
trigger = wrapper.childAt(0)
trigger.simulate('click')
expect(spy.calledOnce).to.be.true
expect(spy.calledWith(true)).to.be.true
})
it('should display list', () => {
const listItems = [
{name: 'test1'},
{name: 'test2'},
{name: 'test3'}
]
wrapper = mount(<WrappedDropdown optClass='test' listItems={listItems}>This is a test.</WrappedDropdown>)
expect(wrapper.childAt(1).childAt(0).hasClass('list-wrapper')).to.equal(true)
expect(wrapper.childAt(1).find('ul').length).to.equal(1)
expect(wrapper.childAt(1).childAt(0).find('li').length).to.equal(3)
})
it('should display a confirmation overlay when an item is clicked', () => {
const listItems = [
{name: 'test1'},
{name: 'test2'},
{name: 'test3', callbackConfirmation: true}
]
wrapper = shallow(<Dropdown optClass='test' listItems={listItems}>This is a test.</Dropdown>)
wrapper.instance().handleItemClick(listItems[0])
expect(wrapper.state().confirmationOverlayOpen).to.be.false
expect(wrapper.state().clickedItem).to.be.null
wrapper.instance().handleItemClick(listItems[2])
expect(wrapper.state().confirmationOverlayOpen).to.be.true
expect(wrapper.state().clickedItem).to.deep.equal(listItems[2])
})
it('should close the confirmation overlay when action buttons are clicked', () => {
const listItems = [
{name: 'test1'},
{name: 'test2'},
{name: 'test3', callbackConfirmation: true}
]
wrapper = shallow(<Dropdown optClass='test' listItems={listItems} isOpened={true}>This is a test.</Dropdown>)
wrapper.instance().handleItemClick(listItems[2])
wrapper.instance().handleConfirmation(false)
expect(wrapper.state().isOpened).to.be.true
expect(wrapper.state().confirmationOverlayOpen).to.be.false
expect(wrapper.state().clickedItem).to.be.null
wrapper.instance().handleItemClick(listItems[2])
wrapper.instance().handleConfirmation(true)
expect(wrapper.state().isOpened).to.be.false
expect(wrapper.state().confirmationOverlayOpen).to.be.false
expect(wrapper.state().clickedItem).to.be.null
})
it('should set state to nextProps receiving a list that differs from current state', () => {
const listItemsInit = [
{name: 'test1'},
{name: 'test2'},
{name: 'test3', callbackConfirmation: true}
]
const listItems = [
{name: 'test1'},
{name: 'test2'},
{name: 'test3'},
{name: 'test4'},
{name: 'test5'}
]
const nextProps = {
listItems
}
wrapper = shallow(<Dropdown listItems={listItemsInit} isOpened={true}>This is a test.</Dropdown>)
wrapper.instance().componentWillReceiveProps(nextProps)
expect(wrapper.state().listItems).to.deep.equal(Immutable.fromJS(listItems))
})
})