qa 5.7.0 → 5.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,682 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Qa::PaginationService do
4
+ let(:results) do
5
+ results = []
6
+ 1.upto(36) { |i| results << { "id": i.to_s, "label": "term #{i}" } }
7
+ results
8
+ end
9
+ let(:request) { instance_double(ActionDispatch::Request) }
10
+ let(:requested_format) { :json }
11
+ let(:params) do
12
+ {
13
+ "q" => "n",
14
+ "controller" => "qa/terms",
15
+ "action" => "search",
16
+ "vocab" => "local",
17
+ "subauthority" => "my_terms"
18
+ }.with_indifferent_access
19
+ end
20
+ let(:query_params) do
21
+ { "q" => "term" }.with_indifferent_access
22
+ end
23
+
24
+ let(:service) do
25
+ described_class.new(request: request,
26
+ results: results,
27
+ format: requested_format)
28
+ end
29
+ let(:base_url) { 'http://example.com' }
30
+ let(:url_path) { '/qa/search/local/my_terms' }
31
+ let(:query_string) { 'q=term' }
32
+
33
+ before do
34
+ allow(request).to receive(:params).and_return(params)
35
+ allow(request).to receive(:query_parameters).and_return(query_params)
36
+ allow(request).to receive(:query_string).and_return(query_string)
37
+ allow(request).to receive(:base_url).and_return(base_url)
38
+ allow(request).to receive(:path).and_return(url_path)
39
+ end
40
+
41
+ describe '#build_response' do
42
+ let(:response) { service.build_response }
43
+
44
+ # rubocop:disable RSpec/NestedGroups
45
+ context 'when json format (default) is requested' do
46
+ context 'and page_offset is missing' do
47
+ context 'and page_limit is missing' do
48
+ it 'returns all results as an array' do
49
+ expect(response).to match_array(results)
50
+ end
51
+ end
52
+
53
+ context 'and page_limit is passed in as "3"' do
54
+ before { params[:page_limit] = "3" }
55
+
56
+ it 'returns the first 3 results as an array' do
57
+ expect(response).to match_array(results[0..2])
58
+ end
59
+ end
60
+ end
61
+
62
+ context 'and page_offset is passed in' do
63
+ before { params[:page_offset] = "4" }
64
+
65
+ context 'and page_limit is missing' do
66
+ it 'returns the first DEFAULT_PAGE_LIMIT (10) records starting at 4th result' do
67
+ expect(response).to match_array(results[3..12])
68
+ end
69
+ end
70
+
71
+ context 'and page_limit is passed in' do
72
+ before { params[:page_limit] = "3" }
73
+
74
+ it 'returns the first 3 results as an array starting at 4th result' do
75
+ expect(response).to match_array(results[3..5])
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ context 'when json api format is requested' do
82
+ let(:requested_format) { :jsonapi }
83
+ let(:first_page) { "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=1" }
84
+ let(:second_page) { "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=11" }
85
+ let(:third_page) { "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=21" }
86
+ let(:fourth_page) { "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=31" }
87
+ let(:last_page) { fourth_page }
88
+ let(:query_string) { 'q=term&format=jsonapi' }
89
+ before do
90
+ params[:format] = "jsonapi"
91
+ query_params[:format] = "jsonapi"
92
+ end
93
+
94
+ context 'with invalid page_offset' do
95
+ context 'that is not an integer' do
96
+ let(:query_string) { 'q=term&format=jsonapi&page_offset=BAD' }
97
+
98
+ before do
99
+ params[:page_offset] = "BAD"
100
+ query_params[:page_offset] = "BAD"
101
+ end
102
+
103
+ it 'sets invalid error' do
104
+ error = response['errors'].first
105
+ expect(error['status']).to eq '200'
106
+ expect(error['source']).to include("page_offset" => "BAD")
107
+ expect(error['title']).to eq 'Page Offset Invalid'
108
+ expect(error['detail']).to eq "Page offset BAD is not an Integer. Returning empty results."
109
+ end
110
+
111
+ it 'returns json api response with no results' do
112
+ expect(response["data"]).to match_array([])
113
+ end
114
+
115
+ it "sets meta['page'] stats with page_offset showing the passed in value" do
116
+ expect(response["meta"]["page"]["page_offset"]).to eq "BAD"
117
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
118
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "0"
119
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
120
+ end
121
+
122
+ it "sets prev and next links to nil" do
123
+ expect(response['links']['prev']).to be_nil
124
+ expect(response['links']['next']).to be_nil
125
+ end
126
+
127
+ it "uses request values in self link" do
128
+ self_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_offset=BAD"
129
+ expect(response['links']['self']).to eq self_url
130
+ end
131
+
132
+ it "uses valid values in first and last links" do
133
+ expect(response['links']['first']).to eq first_page
134
+ expect(response['links']['last']).to eq last_page
135
+ end
136
+ end
137
+
138
+ context 'that is < 1' do
139
+ let(:query_string) { 'q=term&format=jsonapi&page_offset=0' }
140
+ before do
141
+ params[:page_offset] = "0"
142
+ query_params[:page_offset] = "0"
143
+ end
144
+
145
+ it 'sets out of range error' do
146
+ error = response['errors'].first
147
+ expect(error['status']).to eq '200'
148
+ expect(error['source']).to include("page_offset" => "0")
149
+ expect(error['title']).to eq 'Page Offset Out of Range'
150
+ expect(error['detail']).to eq "Page offset 0 < 1 (first result). Returning empty results."
151
+ end
152
+
153
+ it 'returns json api response with no results' do
154
+ expect(response["data"]).to match_array([])
155
+ end
156
+
157
+ it "sets meta['page'] stats with page_offset showing the passed in value" do
158
+ expect(response["meta"]["page"]["page_offset"]).to eq "0"
159
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
160
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "0"
161
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
162
+ end
163
+
164
+ it "sets prev and next links to nil" do
165
+ expect(response['links']['prev']).to be_nil
166
+ expect(response['links']['next']).to be_nil
167
+ end
168
+
169
+ it "uses request values in self link" do
170
+ self_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_offset=0"
171
+ expect(response['links']['self']).to eq self_url
172
+ end
173
+
174
+ it "uses valid values in first and last links" do
175
+ expect(response['links']['first']).to eq first_page
176
+ expect(response['links']['last']).to eq last_page
177
+ end
178
+ end
179
+
180
+ context 'that is > number of results found' do
181
+ let(:query_string) { 'q=term&format=jsonapi&page_offset=40' }
182
+ before do
183
+ params[:page_offset] = "40"
184
+ query_params[:page_offset] = "40"
185
+ end
186
+
187
+ it 'sets out of range error' do
188
+ error = response['errors'].first
189
+ expect(error['status']).to eq '200'
190
+ expect(error['source']).to include("page_offset" => "40")
191
+ expect(error['title']).to eq 'Page Offset Out of Range'
192
+ expect(error['detail']).to eq "Page offset 40 > 36 (total number of results). Returning empty results."
193
+ end
194
+
195
+ it 'returns json api response with no results' do
196
+ expect(response["data"]).to match_array([])
197
+ end
198
+
199
+ it "sets meta['page'] stats with page_offset showing the passed in value" do
200
+ expect(response["meta"]["page"]["page_offset"]).to eq "40"
201
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
202
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "0"
203
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
204
+ end
205
+
206
+ it "sets prev and next links to nil" do
207
+ expect(response['links']['prev']).to be_nil
208
+ expect(response['links']['next']).to be_nil
209
+ end
210
+
211
+ it "uses request values in self link" do
212
+ self_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_offset=40"
213
+ expect(response['links']['self']).to eq self_url
214
+ end
215
+
216
+ it "uses valid values in first and last links" do
217
+ expect(response['links']['first']).to eq first_page
218
+ expect(response['links']['last']).to eq last_page
219
+ end
220
+ end
221
+ end
222
+
223
+ context 'with invalid page_limit' do
224
+ context 'that is not an integer' do
225
+ let(:query_string) { 'q=term&format=jsonapi&page_limit=BAD' }
226
+ before do
227
+ params[:page_limit] = "BAD"
228
+ query_params[:page_limit] = "BAD"
229
+ end
230
+
231
+ it 'sets invalid error' do
232
+ error = response['errors'].first
233
+ expect(error['status']).to eq '200'
234
+ expect(error['source']).to include("page_limit" => "BAD")
235
+ expect(error['title']).to eq 'Page Limit Invalid'
236
+ expect(error['detail']).to eq "Page limit BAD is not an Integer. Returning empty results."
237
+ end
238
+
239
+ it 'returns json api response with no results' do
240
+ expect(response["data"]).to match_array([])
241
+ end
242
+
243
+ it "sets meta['page'] stats with page_limit showing the passed in value" do
244
+ expect(response["meta"]["page"]["page_offset"]).to eq "1"
245
+ expect(response["meta"]["page"]["page_limit"]).to eq "BAD"
246
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "0"
247
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
248
+ end
249
+
250
+ it "sets prev and next links to nil" do
251
+ expect(response['links']['prev']).to be_nil
252
+ expect(response['links']['next']).to be_nil
253
+ end
254
+
255
+ it "uses request values in self link" do
256
+ self_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=BAD"
257
+ expect(response['links']['self']).to eq self_url
258
+ end
259
+
260
+ it "uses valid values in first and last links" do
261
+ expect(response['links']['first']).to eq first_page
262
+ expect(response['links']['last']).to eq last_page
263
+ end
264
+ end
265
+
266
+ context 'that is < 1' do
267
+ let(:query_string) { 'q=term&format=jsonapi&page_limit=0' }
268
+ before do
269
+ params[:page_limit] = "0"
270
+ query_params[:page_limit] = "0"
271
+ end
272
+
273
+ it 'sets out of range error' do
274
+ error = response['errors'].first
275
+ expect(error['status']).to eq '200'
276
+ expect(error['source']).to include("page_limit" => "0")
277
+ expect(error['title']).to eq 'Page Limit Out of Range'
278
+ expect(error['detail']).to eq "Page limit 0 < 1 (minimum limit). Returning empty results."
279
+ end
280
+
281
+ it 'returns json api response with no results' do
282
+ expect(response["data"]).to match_array([])
283
+ end
284
+
285
+ it "sets meta['page'] stats with page_limit showing the passed in value" do
286
+ expect(response["meta"]["page"]["page_offset"]).to eq "1"
287
+ expect(response["meta"]["page"]["page_limit"]).to eq "0"
288
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "0"
289
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
290
+ end
291
+
292
+ it "sets prev and next links to nil" do
293
+ expect(response['links']['prev']).to be_nil
294
+ expect(response['links']['next']).to be_nil
295
+ end
296
+
297
+ it "uses request values in self link" do
298
+ self_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=0"
299
+ expect(response['links']['self']).to eq self_url
300
+ end
301
+
302
+ it "uses valid values in first and last links" do
303
+ expect(response['links']['first']).to eq first_page
304
+ expect(response['links']['last']).to eq last_page
305
+ end
306
+ end
307
+ end
308
+
309
+ context 'with multiple errors' do
310
+ context 'where page_offset is > number of results found and page_limit is < 1' do
311
+ let(:query_string) { 'q=term&format=jsonapi&page_limit=0&page_offset=40' }
312
+ before do
313
+ params[:page_limit] = "0"
314
+ params[:page_offset] = "40"
315
+ query_params[:page_limit] = "0"
316
+ query_params[:page_offset] = "40"
317
+ end
318
+
319
+ it 'sets page_offset out of range and page_limit out of range errors' do
320
+ expect(response['errors'].size).to eq 2
321
+ offset_error = response['errors'].find { |err| err['title'].starts_with? 'Page Offset' }
322
+ limit_error = response['errors'].find { |err| err['title'].starts_with? 'Page Limit' }
323
+
324
+ expect(offset_error['status']).to eq '200'
325
+ expect(offset_error['source']).to include("page_offset" => "40")
326
+ expect(offset_error['title']).to eq 'Page Offset Out of Range'
327
+ expect(offset_error['detail']).to eq "Page offset 40 > 36 (total number of results). Returning empty results."
328
+
329
+ expect(limit_error['status']).to eq '200'
330
+ expect(limit_error['source']).to include("page_limit" => "0")
331
+ expect(limit_error['title']).to eq 'Page Limit Out of Range'
332
+ expect(limit_error['detail']).to eq "Page limit 0 < 1 (minimum limit). Returning empty results."
333
+ end
334
+
335
+ it 'returns json api response with no results' do
336
+ expect(response["data"]).to match_array([])
337
+ end
338
+
339
+ it "sets meta['page'] stats with page_offset and page_limit showing the passed in values" do
340
+ expect(response["meta"]["page"]["page_offset"]).to eq "40"
341
+ expect(response["meta"]["page"]["page_limit"]).to eq "0"
342
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "0"
343
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
344
+ end
345
+
346
+ it "sets prev and next links to nil" do
347
+ expect(response['links']['prev']).to be_nil
348
+ expect(response['links']['next']).to be_nil
349
+ end
350
+
351
+ it "uses request values in self link" do
352
+ self_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=0&page_offset=40"
353
+ expect(response['links']['self']).to eq self_url
354
+ end
355
+
356
+ it "uses valid values in first and last links" do
357
+ expect(response['links']['first']).to eq first_page
358
+ expect(response['links']['last']).to eq last_page
359
+ end
360
+ end
361
+ end
362
+
363
+ context 'with page_offset missing' do
364
+ context 'and page_limit is missing' do
365
+ it 'returns the first DEFAULT_PAGE_LIMIT (10) records' do
366
+ expect(response["data"]).to match_array(results[0..9])
367
+ end
368
+
369
+ it "sets meta['page'] stats" do
370
+ expect(response["meta"]["page"]["page_offset"]).to eq "1"
371
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
372
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "10"
373
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
374
+ end
375
+
376
+ it "sets prev link to nil and next link to next page" do
377
+ expect(response['links']['prev']).to be_nil
378
+ expect(response['links']['next']).to eq second_page
379
+ end
380
+
381
+ it "sets first and self links to first page and last link to third page" do
382
+ expect(response['links']['first']).to eq first_page
383
+ expect(response['links']['last']).to eq last_page
384
+ expect(response['links']['self']).to eq first_page
385
+ end
386
+ end
387
+
388
+ context 'and page_limit is passed in' do
389
+ let(:query_string) { 'q=term&format=jsonapi&page_limit=8' }
390
+ let(:first_page) { "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=8&page_offset=1" }
391
+ let(:second_page) { "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=8&page_offset=9" }
392
+ let(:fifth_page) { "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=8&page_offset=33" }
393
+ before do
394
+ params[:page_limit] = "8"
395
+ query_params[:page_limit] = "8"
396
+ end
397
+
398
+ it 'returns json api response with the first 3 results as an array' do
399
+ expect(response["data"]).to match_array(results[0..7])
400
+ end
401
+
402
+ it "sets meta['page'] stats" do
403
+ expect(response["meta"]["page"]["page_offset"]).to eq "1"
404
+ expect(response["meta"]["page"]["page_limit"]).to eq "8"
405
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "8"
406
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
407
+ end
408
+
409
+ it "sets prev link to nil and next link to next page" do
410
+ expect(response['links']['prev']).to be_nil
411
+ expect(response['links']['next']).to eq second_page
412
+ end
413
+
414
+ it "sets first and self links to first page and last link to sixth page" do
415
+ expect(response['links']['first']).to eq first_page
416
+ expect(response['links']['last']).to eq fifth_page
417
+ expect(response['links']['self']).to eq first_page
418
+ end
419
+ end
420
+ end
421
+
422
+ context 'with page_offset passed being the middle of a page' do
423
+ let(:query_string) { 'q=term&format=jsonapi&page_offset=4' }
424
+ before do
425
+ params[:page_offset] = "4"
426
+ query_params[:page_offset] = "4"
427
+ end
428
+
429
+ context 'and page_limit is missing' do
430
+ it 'returns json api response with the first DEFAULT_PAGE_LIMIT (10) records starting at 4th result' do
431
+ expect(response["data"]).to match_array(results[3..12])
432
+ end
433
+
434
+ it "sets meta['page'] stats" do
435
+ expect(response["meta"]["page"]["page_offset"]).to eq "4"
436
+ expect(response["meta"]["page"]["page_limit"]).to eq described_class::DEFAULT_PAGE_LIMIT.to_s
437
+ expect(response["meta"]["page"]["actual_page_size"]).to eq described_class::DEFAULT_PAGE_LIMIT.to_s
438
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
439
+ end
440
+
441
+ it "sets self to requested page_offset and default page_limit" do
442
+ self_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=4"
443
+ expect(response['links']['self']).to eq self_url
444
+ end
445
+
446
+ it "sets prev link to first page and next link to next offset" do
447
+ first_page = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=1"
448
+ next_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=14"
449
+ expect(response['links']['prev']).to eq first_page
450
+ expect(response['links']['next']).to eq next_url
451
+ end
452
+
453
+ it "sets first to first page and last link to third page" do
454
+ first_page = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=1"
455
+ third_page = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=31"
456
+ expect(response['links']['first']).to eq first_page
457
+ expect(response['links']['last']).to eq third_page
458
+ end
459
+ end
460
+ end
461
+
462
+ context 'and there are no results' do
463
+ let(:results) { [] }
464
+
465
+ it 'returns no results' do
466
+ expect(response["data"]).to match_array([])
467
+ end
468
+
469
+ it "sets meta['page'] stats" do
470
+ expect(response["meta"]["page"]["page_offset"]).to eq "1"
471
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
472
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "0"
473
+ expect(response["meta"]["page"]["total_num_found"]).to eq "0"
474
+ end
475
+
476
+ it 'sets links with prev and next set to nil, last set to first' do
477
+ expect(response['links']["self"]).to eq first_page
478
+ expect(response['links']["first"]).to eq first_page
479
+ expect(response['links']["prev"]).to eq nil
480
+ expect(response['links']["next"]).to eq nil
481
+ expect(response['links']["last"]).to eq first_page
482
+ end
483
+
484
+ it 'does not include errors' do
485
+ expect(response.key?('errors')).to eq false
486
+ end
487
+ end
488
+
489
+ context 'and results do not include a full page' do
490
+ context 'and there are several results in range' do
491
+ let(:query_string) { 'q=term&format=jsonapi&page_offset=31&page_limit=10' }
492
+
493
+ before do
494
+ params[:page_offset] = "31"
495
+ query_params[:page_offset] = "31"
496
+ end
497
+
498
+ it 'returns json api response with a partial page of results starting at 31th result' do
499
+ expect(response["data"]).to match_array(results[30..35])
500
+ end
501
+
502
+ it "sets meta['page'] stats" do
503
+ expect(response["meta"]["page"]["page_offset"]).to eq "31"
504
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
505
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "6"
506
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
507
+ end
508
+
509
+ it "sets self to last page" do
510
+ expect(response['links']['self']).to eq last_page
511
+ end
512
+
513
+ it "sets prev link to 3rd page and next link to nil" do
514
+ expect(response['links']['prev']).to eq third_page
515
+ expect(response['links']['next']).to eq nil
516
+ end
517
+
518
+ it "sets first to first page and last link to fourth page" do
519
+ expect(response['links']['first']).to eq first_page
520
+ expect(response['links']['last']).to eq last_page
521
+ end
522
+ end
523
+
524
+ context 'and only the last result is in range' do
525
+ let(:query_string) { "q=term&format=jsonapi&page_offset=#{results.length}" }
526
+ before do
527
+ params[:page_offset] = results.length.to_s
528
+ query_params[:page_offset] = results.length.to_s
529
+ end
530
+
531
+ it 'returns json api response with a partial page with one result' do
532
+ expect(response["data"]).to match_array(results[35..35])
533
+ end
534
+
535
+ it "sets meta['page'] stats" do
536
+ expect(response["meta"]["page"]["page_offset"]).to eq "36"
537
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
538
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "1"
539
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
540
+ end
541
+
542
+ it "sets self to second page" do
543
+ self_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=36"
544
+ expect(response['links']['self']).to eq self_url
545
+ end
546
+
547
+ it "sets prev link to one page back and next link to nil" do
548
+ # when offset is middle of a page, then prev will also be middle of
549
+ # a page with `prev_offset = current_offset - page_limit`
550
+ prev_url = "#{base_url}#{url_path}?q=term&format=jsonapi&page_limit=10&page_offset=26"
551
+ expect(response['links']['prev']).to eq prev_url
552
+ expect(response['links']['next']).to eq nil
553
+ end
554
+
555
+ it "sets first to first page and last link to second page" do
556
+ # calculated assuming starting from offset=1
557
+ expect(response['links']['first']).to eq first_page
558
+ expect(response['links']['last']).to eq last_page
559
+ end
560
+ end
561
+ end
562
+
563
+ context 'and there are multiple pages of results' do
564
+ # data defined in main section has 3 pages of data
565
+ let(:query_string) { "q=term&format=jsonapi&page_offset=#{page_offset}" }
566
+ before do
567
+ params[:page_offset] = page_offset
568
+ query_params[:page_offset] = page_offset
569
+ end
570
+
571
+ context 'and page_offset is start of first page' do
572
+ let(:page_offset) { "1" }
573
+
574
+ it 'returns json api response first page of results' do
575
+ expect(response["data"]).to match_array(results[0..9])
576
+ end
577
+
578
+ it "sets meta['page'] stats" do
579
+ expect(response["meta"]["page"]["page_offset"]).to eq "1"
580
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
581
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "10"
582
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
583
+ end
584
+
585
+ it 'sets links with prev set to nil' do
586
+ expect(response['links']["self"]).to eq first_page
587
+ expect(response['links']["first"]).to eq first_page
588
+ expect(response['links']["prev"]).to be_nil
589
+ expect(response['links']["next"]).to eq second_page
590
+ expect(response['links']["last"]).to eq last_page
591
+ end
592
+
593
+ it 'does not include errors' do
594
+ expect(response.key?('errors')).to eq false
595
+ end
596
+ end
597
+
598
+ context 'and page_offset is start of second page' do
599
+ let(:page_offset) { "11" }
600
+
601
+ it 'returns json api response second page of results' do
602
+ expect(response["data"]).to match_array(results[10..19])
603
+ end
604
+
605
+ it "sets meta['page'] stats" do
606
+ expect(response["meta"]["page"]["page_offset"]).to eq "11"
607
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
608
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "10"
609
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
610
+ end
611
+
612
+ it 'sets links with prev and next having values' do
613
+ expect(response['links']["self"]).to eq second_page
614
+ expect(response['links']["first"]).to eq first_page
615
+ expect(response['links']["prev"]).to eq first_page
616
+ expect(response['links']["next"]).to eq third_page
617
+ expect(response['links']["last"]).to eq last_page
618
+ end
619
+
620
+ it 'does not include errors' do
621
+ expect(response.key?('errors')).to eq false
622
+ end
623
+ end
624
+
625
+ context 'and page_offset is start of third page' do
626
+ let(:page_offset) { "21" }
627
+
628
+ it 'returns json api response third page of results' do
629
+ expect(response["data"]).to match_array(results[20..29])
630
+ end
631
+
632
+ it "sets meta['page'] stats" do
633
+ expect(response["meta"]["page"]["page_offset"]).to eq "21"
634
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
635
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "10"
636
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
637
+ end
638
+
639
+ it 'sets links with prev and next having values' do
640
+ expect(response['links']["self"]).to eq third_page
641
+ expect(response['links']["first"]).to eq first_page
642
+ expect(response['links']["prev"]).to eq second_page
643
+ expect(response['links']["next"]).to eq last_page
644
+ expect(response['links']["last"]).to eq last_page
645
+ end
646
+
647
+ it 'does not include errors' do
648
+ expect(response.key?('errors')).to eq false
649
+ end
650
+ end
651
+
652
+ context 'and page_offset is start of fourth page (last page)' do
653
+ let(:page_offset) { "31" }
654
+
655
+ it 'returns json api response third page of results' do
656
+ expect(response["data"]).to match_array(results[30..35])
657
+ end
658
+
659
+ it "sets meta['page'] stats" do
660
+ expect(response["meta"]["page"]["page_offset"]).to eq "31"
661
+ expect(response["meta"]["page"]["page_limit"]).to eq "10"
662
+ expect(response["meta"]["page"]["actual_page_size"]).to eq "6"
663
+ expect(response["meta"]["page"]["total_num_found"]).to eq "36"
664
+ end
665
+
666
+ it 'sets links with next set to nil' do
667
+ expect(response['links']["self"]).to eq last_page
668
+ expect(response['links']["first"]).to eq first_page
669
+ expect(response['links']["prev"]).to eq third_page
670
+ expect(response['links']["next"]).to be_nil
671
+ expect(response['links']["last"]).to eq last_page
672
+ end
673
+
674
+ it 'does not include errors' do
675
+ expect(response.key?('errors')).to eq false
676
+ end
677
+ end
678
+ end
679
+ end
680
+ # rubocop:enable RSpec/NestedGroups
681
+ end
682
+ end