/
CharitySearchModal-test.js
117 lines (91 loc) · 3.93 KB
/
CharitySearchModal-test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
jest.disableAutomock()
jest.mock('../../../../api/frolCharities')
jest.useFakeTimers('modern')
import charities from '../../../../api/frolCharities'
const charity = {
uid: 'xy-12',
slug: 'foo',
name: 'Foo',
description: 'Fooy',
country_code: 'xy',
url: 'http://foo.com/'
}
const searchResponse = {
charities: [charity],
meta: {
pagination: {
count: 1,
current_page: 1,
total_pages: 2
}
}
}
charities.search.mockReturnValue(searchResponse)
import React from 'react'
import TestUtils from 'react-addons-test-utils'
import CharitySearchModal from '../'
import SearchModal from '../../SearchModal'
const findByClass = TestUtils.findRenderedDOMComponentWithClass
const findByType = TestUtils.findRenderedComponentWithType
const scryByClass = TestUtils.scryRenderedDOMComponentsWithClass
const findByTag = TestUtils.findRenderedDOMComponentWithTag
describe('CharitySearchModal', function () {
beforeEach(function () {
charities.search.mockClear()
})
it('renders a SearchModal', function () {
let charitySearchModal = <CharitySearchModal autoFocus={false} />
let element = TestUtils.renderIntoDocument(charitySearchModal)
let searchModal = findByType(element, SearchModal)
expect(searchModal).toBeDefined()
})
it('renders search results', function () {
charities.search.mockImplementation(function (query, callback) { callback(searchResponse) })
let charitySearchModal = <CharitySearchModal autoFocus={false} />
let element = TestUtils.renderIntoDocument(charitySearchModal)
let resultElements = scryByClass(element, 'SearchResult')
expect(resultElements.length).toEqual(1)
expect(resultElements[0].textContent).toContain(charity.name)
expect(resultElements[0].textContent).toContain(charity.description)
})
it('searches for charities on input change', function () {
let query = { searchTerm: 'foo', page: 1, pageSize: 10 }
let charitySearchModal = <CharitySearchModal autoFocus={false} country='xy' />
let element = TestUtils.renderIntoDocument(charitySearchModal)
let input = findByTag(element, 'input')
TestUtils.Simulate.change(input, { target: { value: 'foo' } })
jest.runAllTimers()
expect(charities.search.mock.calls.length).toEqual(2)
expect(charities.search).lastCalledWith(query, element.updateResults)
})
it('searches for more charities on page change', function () {
charities.search.mockImplementation(function (query, callback) { callback(searchResponse) })
let query = { searchTerm: '', page: 2, pageSize: 10 }
let charitySearchModal = <CharitySearchModal autoFocus={false} country='xy' />
let element = TestUtils.renderIntoDocument(charitySearchModal)
let nextPageButton = findByClass(element, 'SearchPagination__button--right')
TestUtils.Simulate.click(nextPageButton)
expect(charities.search.mock.calls.length).toEqual(2)
expect(charities.search).lastCalledWith(query, element.updateResults)
})
it('updates isSearching accordingly', function () {
let charitySearchModal = <CharitySearchModal autoFocus={false} country='xy' />
let element = TestUtils.renderIntoDocument(charitySearchModal)
expect(element.state.isSearching).toBeTruthy()
let searchCallback = charities.search.mock.calls[0][1]
searchCallback(searchResponse)
expect(element.state.isSearching).toBeFalsy()
let input = findByTag(element, 'input')
TestUtils.Simulate.change(input, { target: { value: 'foo' } })
jest.runAllTimers()
expect(element.state.isSearching).toBeTruthy()
})
it('links to charity url for default visit action', function () {
let onClose = jest.fn(() => {})
let charitySearchModal = <CharitySearchModal autoFocus={false} onClose={onClose} />
let element = TestUtils.renderIntoDocument(charitySearchModal)
element.setState({ results: [charity] })
let resultElements = scryByClass(element, 'SearchResult')
expect(resultElements[0].href).toBe(charity.url)
})
})