@conveyal/commute
Version:
Commute analysis
197 lines (162 loc) • 5.31 kB
JavaScript
/* global describe, expect, it */
import {mount} from 'enzyme'
import {mountToJson} from 'enzyme-to-json'
import React from 'react'
import {Provider} from 'react-redux'
import {makeGenericModelActionsExpectations} from '../../test-utils/actions'
import {timeoutPromise} from '../../test-utils/common'
import {
genGeocodedEntity,
makeMockStore,
mockGeocodeResponse,
mockSite,
mockStores
} from '../../test-utils/mock-data'
import Leaflet from '../../test-utils/mock-leaflet'
import EditSite from '../../../client/containers/edit-site'
const polygonExpectations = makeGenericModelActionsExpectations({
pluralName: 'polygons',
singularName: 'polygon'
})
const siteExpectations = makeGenericModelActionsExpectations({
pluralName: 'sites',
singularName: 'site'
})
describe('Container > EditSite', () => {
it('Create/Edit Site View loads (create or edit mode)', () => {
const mockStore = makeMockStore(mockStores.init)
// mount component
mount(
<Provider store={mockStore}>
<EditSite />
</Provider>
, {
attachTo: document.getElementById('test')
})
})
it('Create/Edit Site View loads in create mode', () => {
const mockStore = makeMockStore(mockStores.init)
// mount component
const tree = mount(
<Provider store={mockStore}>
<EditSite />
</Provider>
, {
attachTo: document.getElementById('test')
})
expect(mountToJson(tree.find('.site-header'))).toMatchSnapshot()
expect(mountToJson(tree.find('.site-form'))).toMatchSnapshot()
// no marker should be added initially in create mode
expect(Leaflet.marker).not.toBeCalled()
})
it('Create/Edit Site View loads in edit mode', () => {
const mockStore = makeMockStore(mockStores.withSite)
// mount component
const tree = mount(
<Provider store={mockStore}>
<EditSite
params={{siteId: 'site-2'}}
/>
</Provider>
, {
attachTo: document.getElementById('test')
})
expect(mountToJson(tree.find('.site-header'))).toMatchSnapshot()
expect(mountToJson(tree.find('.site-form'))).toMatchSnapshot()
// marker should be added initially in edit mode
expect(Leaflet.marker).toBeCalled()
expect(Leaflet.marker.mock.calls[0][0]).toMatchSnapshot()
})
it('Create site', async () => {
const mockStore = makeMockStore(mockStores.init)
// mount component
const tree = mount(
<Provider store={mockStore}>
<EditSite />
</Provider>
, {
attachTo: document.getElementById('test')
})
// give each text field some input
// name
tree.find('input').first().simulate('change', {target: {value: 'Mock Site'}})
// address
tree.find('.site-form').find('Geocoder').at(1).props().onChange(mockGeocodeResponse)
// submit form
tree.find('form').find('button').first().simulate('click')
// react-formal submit is asyncrhonous, so wait a bit
await timeoutPromise(100)
// expect create action
siteExpectations.expectCreateAction({
action: mockStore.getActions()[0],
newEntity: genGeocodedEntity({
calculationStatus: 'calculating',
name: 'Mock Site',
travelTimeIsochrones: {}
})
})
})
it('Update site', async () => {
const mockStore = makeMockStore(mockStores.withSite)
// mount component
const tree = mount(
<Provider store={mockStore}>
<EditSite
params={{siteId: 'site-2'}}
/>
</Provider>
, {
attachTo: document.getElementById('test')
})
// clear all loading actions
mockStore.clearActions()
// give each text field some input
// name
tree.find('input').first().simulate('change', {target: {value: 'Different Name'}})
// address
tree.find('.site-form').find('Geocoder').at(1).props().onChange(mockGeocodeResponse)
// submit form
tree.find('form').find('button').first().simulate('click')
// react-formal submit is asyncrhonous, so wait a bit
await timeoutPromise(1000)
const actions = mockStore.getActions()
polygonExpectations.expectDeleteManyAction({
action: actions.slice(0, 2),
queryParams: { siteId: 'site-2' }
})
siteExpectations.expectUpdateAction({
action: actions[2],
entity: genGeocodedEntity({
_id: 'site-2',
calculationStatus: 'calculating',
commuters: ['commuter-2'],
name: 'Different Name',
travelTimeIsochrones: {}
})
})
})
it('Delete Site', () => {
const mockStore = makeMockStore(mockStores.withSite)
window.confirm = () => true
// Given a logged-in user is viewing the Create/Edit Site View
// mount component
const tree = mount(
<Provider store={mockStore}>
<EditSite
params={{siteId: 'site-2'}}
/>
</Provider>
, {
attachTo: document.getElementById('test')
})
// clear all loading actions
mockStore.clearActions()
// When the user clicks the delete button
// And the user confirms the Confirm Deletion dialog
tree.find('.site-form').find('button').last().simulate('click')
siteExpectations.expectDeleteAction({
action: mockStore.getActions()[0],
entity: mockSite
})
})
})