forked from instructure/canvas-lms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCollectionViewSpec.coffee
More file actions
98 lines (83 loc) · 2.98 KB
/
Copy pathCollectionViewSpec.coffee
File metadata and controls
98 lines (83 loc) · 2.98 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
define [
'jquery'
'Backbone'
'compiled/views/CollectionView'
'helpers/fakeENV'
], ($, Backbone, CollectionView, fakeENV) ->
collection = null
view = null
class Collection extends Backbone.Collection
model: Backbone.Model
comparator: (a, b) ->
if a.get('id') < b.get('id') then 1 else -1
class ItemView extends Backbone.View
tagName: 'li'
template: ({name}) -> name
remove: ->
super
@constructor['testing removed'] ?= 0
@constructor['testing removed']++
QUnit.module 'CollectionView',
setup: ->
fakeENV.setup()
collection = new Collection [
{name: 'Jon', id: 24}
{name: 'Ryan', id: 56}
]
view = new CollectionView
collection: collection
emptyMessage: -> "No Results"
itemView: ItemView
view.$el.appendTo $('#fixtures')
view.render()
teardown: ->
fakeENV.teardown()
ItemView['testing removed'] = 0
view.remove()
# asserts match and order of rendered items
assertRenderedItems = (names=[]) ->
items = view.$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'
assertItemRendered = (name) ->
$match = view.$list.children().filter (i, el) -> el.innerHTML is name
ok $match.length, 'item found'
assertEmptyTemplateRendered = ->
ok view.$el.text().match(/No Results/), 'empty template rendered'
test 'renders added items', ->
collection.reset()
collection.add {name: 'Joe', id: 110}
assertRenderedItems ['Joe']
test 'renders empty template', ->
collection.reset()
assertRenderedItems()
assertEmptyTemplateRendered()
test 'renders empty template when last item is removed', ->
collection.remove collection.get 24
collection.remove collection.get 56
assertRenderedItems()
assertEmptyTemplateRendered()
test 'removes empty template on add', ->
collection.reset()
assertEmptyTemplateRendered()
collection.add {name: 'Joe', id: 110}
ok !view.$el.text().match(/No Results/), 'empty template removed'
assertItemRendered 'Joe'
test 'removes items and re-renders on collection reset', ->
collection.reset [{name: 'Joe', id: 110}]
equal ItemView['testing removed'], 2
assertRenderedItems ['Joe']
test 'items are removed from view when removed from collection', ->
collection.remove collection.get 24
assertRenderedItems ['Ryan']
test 'added items respect comparator', ->
collection.add {name: 'Joe', id: 110}
assertRenderedItems ['Joe', 'Ryan', 'Jon']
collection.add {name: 'Cam', id: 106}
assertRenderedItems ['Joe', 'Cam', 'Ryan', 'Jon']
collection.add {name: 'Brian', id: 1}
assertRenderedItems ['Joe', 'Cam', 'Ryan', 'Jon', 'Brian']