forked from instructure/canvas-lms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPaginatedCollectionSpec.coffee
More file actions
155 lines (131 loc) · 6.61 KB
/
Copy pathPaginatedCollectionSpec.coffee
File metadata and controls
155 lines (131 loc) · 6.61 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
define [
'jquery'
'Backbone'
'compiled/collections/PaginatedCollection'
'helpers/getFakePage'
], ($, Backbone, PaginatedCollection, getFakePage) ->
QUnit.module 'PaginatedCollection',
setup: ->
@server = sinon.fakeServer.create()
@collection = new PaginatedCollection null,
params:
multi: ['foos', 'bars']
single: 1
@collection.url = '/test'
@collection.urlWithParams = -> @url + '?' + $.param(@options.params)
@collection.model = Backbone.Model.extend()
@server.sendPage = (page, url) ->
@respond 'GET', url, [200, {
'Content-Type': 'application/json'
'Link': page.header
}, JSON.stringify page.data]
teardown: ->
@server.restore()
test 'fetch maintains parent API', 6, ->
page = getFakePage()
dfd = @collection.fetch success: (self, response) =>
equal self, @collection, 'passes itself into success handler'
deepEqual response, page.data, 'passes response into success handler'
ok dfd.promise, 'returns a deferred object (quacks like a deferred)'
dfd.done (data, status, xhr) =>
deepEqual data, page.data, 'deferred is resolved with raw data'
equal status, 'success', 'text status is success'
ok xhr.abort 'function', 'jQuery xhr is passed in (quacks like a xhr)'
@server.sendPage page, @collection.urlWithParams()
test 'fetch maintains error handler API', 2, ->
@collection.fetch error: (self, xhr) =>
equal self, @collection, 'passes itself into fail handler'
deepEqual xhr.responseText, 'wah wah', 'passes response into fail handler'
@server.respond 'GET', @collection.urlWithParams(), [400, {'Content-Type': 'application/json'}, 'wah wah']
test 'fetch fires fetch event', 3, ->
page = getFakePage()
@collection.on 'fetch', (self, modelData) =>
ok true, 'triggers fetch'
deepEqual modelData, page.data, 'passes data in'
equal self, @collection, 'passes self in'
@collection.fetch()
@server.sendPage page, @collection.urlWithParams()
test 'fetches current page', 10, ->
page1 = getFakePage 1
@collection.fetch success: =>
equal @collection.models.length, 2, 'added models to collection'
equal @collection.models[0].get('id'), 1, 'added model to collection'
equal @collection.models[1].get('id'), 2, 'added model to collection'
equal @collection.urls.current, page1.urls.current, 'current url matches'
@server.sendPage page1, @collection.urlWithParams()
@collection.on 'fetch:current', (self, modelData) ->
ok true, 'triggers fetch:current event'
deepEqual modelData, page1.data, 'passes data in'
@collection.fetch page: 'current', success: =>
equal @collection.models.length, 2, 'added models to collection'
equal @collection.models[0].get('id'), 1, 'passed in model to current page handler'
equal @collection.models[1].get('id'), 2, 'passed in model to current page handler'
equal @collection.urls.current, page1.urls.current, 'current url matches'
@server.sendPage page1, @collection.urls.current
test 'fetches next page', 8, ->
page1 = getFakePage 1
page2 = getFakePage 2
@collection.fetch success: =>
equal @collection.models[0].get('id'), 1, 'added model to collection'
equal @collection.models[1].get('id'), 2, 'added model to collection'
equal @collection.urls.next, page1.urls.next, 'next url matches'
@server.sendPage page1, @collection.urlWithParams()
@collection.on 'fetch:next', (self, modelData) ->
ok true, 'triggers fetch:next event'
deepEqual modelData, page2.data, 'passes data in'
@collection.fetch page: 'next', success: =>
equal @collection.models[2].get('id'), 3, 'passed in model to next page handler'
equal @collection.models[3].get('id'), 4, 'passed in model to next page handler'
equal @collection.urls.next, page2.urls.next, 'next url matches'
@server.sendPage page2, @collection.urls.next
test 'fetches previous page', 8, ->
page1 = getFakePage 1
page2 = getFakePage 2
@collection.fetch success: =>
equal @collection.models[0].get('id'), 3, 'added model to collection'
equal @collection.models[1].get('id'), 4, 'added model to collection'
equal @collection.urls.prev, page2.urls.prev, 'prev url matches'
@server.sendPage page2, @collection.urlWithParams()
@collection.on 'fetch:prev', (self, modelData) ->
ok true, 'triggers fetch:prev event'
deepEqual modelData, page1.data, 'passes data in'
@collection.fetch page: 'prev', success: =>
equal @collection.models[2].get('id'), 1, 'passed in model to prev page handler'
equal @collection.models[3].get('id'), 2, 'passed in model to prev page handler'
equal @collection.urls.prev, undefined, 'prev url not set when there is not one'
@server.sendPage page1, @collection.urls.prev
test 'fetches current, prev, next, top and bottom pages', 8, ->
page1 = getFakePage 1
page2 = getFakePage 2
page3 = getFakePage 3
page4 = getFakePage 4
@collection.fetch success: =>
equal @collection.models[0].get('id'), 5, 'added model to collection'
expectedUrls = page3.urls
expectedUrls.top = page3.urls.prev
expectedUrls.bottom = page3.urls.next
deepEqual @collection.urls, expectedUrls, 'urls are as expected for fetch'
@server.sendPage page3, @collection.urlWithParams()
@collection.fetch page: 'current', success: =>
expectedUrls = page3.urls
expectedUrls.top = page3.urls.prev
expectedUrls.bottom = page3.urls.next
deepEqual @collection.urls, expectedUrls, 'urls are as expected for fetch current'
@server.sendPage page3, @collection.urlWithParams()
@collection.fetch page: 'prev', success: =>
equal @collection.models.length, 4, 'added models to collection'
expectedUrls = page2.urls
expectedUrls.top = page2.urls.prev
expectedUrls.bottom = page3.urls.next # shouldn't change
deepEqual @collection.urls, expectedUrls, 'urls are as expected fetch prev'
@server.sendPage page2, @collection.urls.prev
@collection.fetch page: 'top', success: =>
equal @collection.models.length, 6, 'added models to collection'
expectedUrls = page1.urls
expectedUrls.bottom = page3.urls.next # shouldn't change
deepEqual @collection.urls, expectedUrls, 'urls are as expected for fetch top'
@server.sendPage page1, @collection.urls.top
@collection.fetch page: 'bottom', success: =>
equal @collection.models.length, 8, 'added models to collection'
equal @collection.urls.bottom, page4.urls.next
@server.sendPage page4, @collection.urls.bottom