forked from instructure/canvas-lms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSearchViewSpec.coffee
More file actions
109 lines (95 loc) · 3.44 KB
/
Copy pathSearchViewSpec.coffee
File metadata and controls
109 lines (95 loc) · 3.44 KB
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
#
# Copyright (C) 2013 - present Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
define [
'jquery'
'Backbone'
'compiled/views/SearchView'
'compiled/views/InputFilterView'
'compiled/views/CollectionView'
'helpers/jquery.simulate'
], ($, Backbone, SearchView, InputFilterView, CollectionView) ->
view = null
collection = null
clock = null
server = null
searchView = null
class TestCollection extends Backbone.Collection
url: '/test'
class TestItemView extends Backbone.View
template: ({name}) -> name
QUnit.module 'SearchView',
setup: ->
collection = new TestCollection
inputFilterView = new InputFilterView
collectionView = new CollectionView
collection: collection
itemView: TestItemView
searchView = new SearchView
inputFilterView: inputFilterView
collectionView: collectionView
searchView.$el.appendTo $('#fixtures')
searchView.render()
clock = sinon.useFakeTimers()
server = sinon.fakeServer.create()
window.searchView = searchView
window.collection = collection
teardown: ->
clock.restore()
server.restore()
searchView.remove()
$("#fixtures").empty()
# asserts match and order of rendered items
assertRenderedItems = (names=[]) ->
items = searchView.collectionView.$list.children()
equal items.length, names.length, 'items length matches'
joinedItems = (el.innerHTML for el in items).join ' '
joinedNames = names.join ' '
joinedModels = collection.map((item) -> item.get('name')).join ' '
equal joinedModels, joinedNames, 'collection order matches'
equal joinedItems, joinedNames, 'dom order matches'
setSearchTo = (term) ->
searchView.inputFilterView.el.value = term
simulateKeyup = (opts={}) ->
searchView.inputFilterView.$el.simulate 'keyup', opts
sendResponse = (url, json) ->
server.respond 'GET', url, [200, {
'Content-Type': 'application/json'
}, JSON.stringify(json)]
sendSearchResponse = (json) ->
clock.tick searchView.inputFilterView.options.onInputDelay
search = searchView.inputFilterView.el.value
url = "#{collection.url}?search_term=#{search}"
sendResponse url, json
test 'renders results on input', ->
setSearchTo 'ryan'
simulateKeyup()
sendSearchResponse [{name: 'ryanf'}, {name: 'ryanh'}]
assertRenderedItems ['ryanf', 'ryanh']
test 'renders results on enter', ->
setSearchTo 'ryan'
simulateKeyup keyCode: 13
sendSearchResponse [{name: 'ryanf'}, {name: 'ryanh'}]
assertRenderedItems ['ryanf', 'ryanh']
test 'replaces old results', ->
setSearchTo 'ryan'
simulateKeyup()
sendSearchResponse [{name: 'ryanf'}, {name: 'ryanh'}]
assertRenderedItems ['ryanf', 'ryanh']
setSearchTo 'jon'
simulateKeyup()
sendSearchResponse [{name: 'jon'}, {name: 'jonw'}]
assertRenderedItems ['jon', 'jonw']