jsonapi-resources 0.2.0 → 0.3.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.travis.yml +5 -2
  4. data/Gemfile +3 -1
  5. data/README.md +52 -13
  6. data/jsonapi-resources.gemspec +1 -1
  7. data/lib/jsonapi-resources.rb +1 -0
  8. data/lib/jsonapi/association.rb +1 -9
  9. data/lib/jsonapi/error_codes.rb +1 -0
  10. data/lib/jsonapi/exceptions.rb +9 -5
  11. data/lib/jsonapi/formatter.rb +9 -18
  12. data/lib/jsonapi/paginator.rb +4 -15
  13. data/lib/jsonapi/request.rb +26 -42
  14. data/lib/jsonapi/resource.rb +35 -45
  15. data/lib/jsonapi/resource_controller.rb +6 -32
  16. data/lib/jsonapi/resource_serializer.rb +62 -33
  17. data/lib/jsonapi/resources/version.rb +1 -1
  18. data/lib/jsonapi/routing_ext.rb +4 -4
  19. data/test/config/database.yml +2 -1
  20. data/test/controllers/controller_test.rb +200 -160
  21. data/test/fixtures/active_record.rb +44 -201
  22. data/test/fixtures/book_comments.yml +11 -0
  23. data/test/fixtures/books.yml +6 -0
  24. data/test/fixtures/comments.yml +17 -0
  25. data/test/fixtures/comments_tags.yml +20 -0
  26. data/test/fixtures/expense_entries.yml +13 -0
  27. data/test/fixtures/facts.yml +11 -0
  28. data/test/fixtures/iso_currencies.yml +17 -0
  29. data/test/fixtures/people.yml +24 -0
  30. data/test/fixtures/posts.yml +96 -0
  31. data/test/fixtures/posts_tags.yml +59 -0
  32. data/test/fixtures/preferences.yml +18 -0
  33. data/test/fixtures/sections.yml +8 -0
  34. data/test/fixtures/tags.yml +39 -0
  35. data/test/helpers/hash_helpers.rb +0 -7
  36. data/test/integration/requests/request_test.rb +86 -28
  37. data/test/integration/routes/routes_test.rb +14 -25
  38. data/test/test_helper.rb +41 -17
  39. data/test/unit/jsonapi_request/jsonapi_request_test.rb +152 -0
  40. data/test/unit/operation/operations_processor_test.rb +13 -2
  41. data/test/unit/resource/resource_test.rb +68 -13
  42. data/test/unit/serializer/serializer_test.rb +328 -220
  43. metadata +33 -6
  44. data/lib/jsonapi/resource_for.rb +0 -29
@@ -1,5 +1,5 @@
1
1
  module JSONAPI
2
2
  module Resources
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.0.pre1"
4
4
  end
5
5
  end
@@ -102,7 +102,7 @@ module ActionDispatch
102
102
 
103
103
  if methods.include?(:update)
104
104
  match "links/#{formatted_association_name}", controller: res._type.to_s,
105
- action: 'update_association', association: link_type.to_s, via: [:put]
105
+ action: 'update_association', association: link_type.to_s, via: [:put, :patch]
106
106
  end
107
107
 
108
108
  if methods.include?(:destroy)
@@ -132,7 +132,7 @@ module ActionDispatch
132
132
 
133
133
  if methods.include?(:update) && res._association(link_type).acts_as_set
134
134
  match "links/#{formatted_association_name}", controller: res._type.to_s,
135
- action: 'update_association', association: link_type.to_s, via: [:put]
135
+ action: 'update_association', association: link_type.to_s, via: [:put, :patch]
136
136
  end
137
137
 
138
138
  if methods.include?(:destroy)
@@ -148,7 +148,7 @@ module ActionDispatch
148
148
  association = source._associations[association_name]
149
149
 
150
150
  formatted_association_name = format_route(association.name)
151
- related_resource = JSONAPI::Resource.resource_for(resource_type_with_module_prefix(association.name.pluralize))
151
+ related_resource = JSONAPI::Resource.resource_for(resource_type_with_module_prefix(association.class_name.underscore.pluralize))
152
152
 
153
153
  match "#{formatted_association_name}", controller: related_resource._type.to_s,
154
154
  association: association.name, source: resource_type_with_module_prefix(source._type),
@@ -162,7 +162,7 @@ module ActionDispatch
162
162
  association = source._associations[association_name]
163
163
 
164
164
  formatted_association_name = format_route(association.name)
165
- related_resource = JSONAPI::Resource.resource_for(resource_type_with_module_prefix(association.name))
165
+ related_resource = JSONAPI::Resource.resource_for(resource_type_with_module_prefix(association.class_name.underscore))
166
166
 
167
167
  match "#{formatted_association_name}", controller: related_resource._type.to_s,
168
168
  association: association.name, source: resource_type_with_module_prefix(source._type),
@@ -1,5 +1,6 @@
1
1
  test:
2
2
  adapter: sqlite3
3
- database: ":memory:"
3
+ database: "test_db"
4
+ # database: ":memory:"
4
5
  pool: 5
5
6
  timeout: 5000
@@ -1,5 +1,4 @@
1
1
  require File.expand_path('../../test_helper', __FILE__)
2
- require File.expand_path('../../fixtures/active_record', __FILE__)
3
2
 
4
3
  def set_content_type_header!
5
4
  @request.headers['Content-Type'] = JSONAPI::MEDIA_TYPE
@@ -44,18 +43,18 @@ class PostsControllerTest < ActionController::TestCase
44
43
  get :index, {filter: {id: '2'}, include: 'comments'}
45
44
  assert_response :success
46
45
  assert_equal 1, json_response['data'].size
47
- assert_equal 1, json_response['linked'].size
46
+ assert_equal 1, json_response['included'].size
48
47
  end
49
48
 
50
49
  def test_index_filter_by_ids_and_include_related_different_type
51
50
  get :index, {filter: {id: '1,2'}, include: 'author'}
52
51
  assert_response :success
53
52
  assert_equal 2, json_response['data'].size
54
- assert_equal 1, json_response['linked'].size
53
+ assert_equal 1, json_response['included'].size
55
54
  end
56
55
 
57
56
  def test_index_filter_by_ids_and_fields
58
- get :index, {filter: {id: '1,2'}, 'fields' => 'id,title,author'}
57
+ get :index, {filter: {id: '1,2'}, fields: {posts: 'id,title,author'}}
59
58
  assert_response :success
60
59
  assert_equal 2, json_response['data'].size
61
60
 
@@ -87,7 +86,7 @@ class PostsControllerTest < ActionController::TestCase
87
86
  end
88
87
 
89
88
  def test_index_filter_by_ids_and_fields_2
90
- get :index, {filter: {id: '1,2'}, 'fields' => 'author'}
89
+ get :index, {filter: {id: '1,2'}, fields: {posts: 'author'}}
91
90
  assert_response :success
92
91
  assert_equal 2, json_response['data'].size
93
92
 
@@ -150,12 +149,6 @@ class PostsControllerTest < ActionController::TestCase
150
149
  assert_match /5412333 could not be found/, json_response['errors'][0]['detail']
151
150
  end
152
151
 
153
- def test_index_malformed_fields
154
- get :index, {filter: {id: '1,2'}, 'fields' => 'posts'}
155
- assert_response :bad_request
156
- assert_match /posts is not a valid field for posts./, json_response['errors'][0]['detail']
157
- end
158
-
159
152
  def test_field_not_supported
160
153
  get :index, {filter: {id: '1,2'}, 'fields' => {'posts' => 'id,title,rank,author'}}
161
154
  assert_response :bad_request
@@ -178,7 +171,7 @@ class PostsControllerTest < ActionController::TestCase
178
171
  get :index, {sort: '+title'}
179
172
 
180
173
  assert_response :success
181
- assert_equal "Delete This Later - Multiple2-1", json_response['data'][0]['title']
174
+ assert_equal "A First Post", json_response['data'][0]['title']
182
175
  end
183
176
 
184
177
  def test_sorting_desc
@@ -192,7 +185,7 @@ class PostsControllerTest < ActionController::TestCase
192
185
  get :index, {sort: '+title,+body'}
193
186
 
194
187
  assert_response :success
195
- assert_equal '8', json_response['data'][0]['id']
188
+ assert_equal '14', json_response['data'][0]['id']
196
189
  end
197
190
 
198
191
  def test_invalid_sort_param
@@ -216,19 +209,13 @@ class PostsControllerTest < ActionController::TestCase
216
209
  assert_match /id is not a valid sort criteria for post/, response.body
217
210
  end
218
211
 
219
- # ToDo: test validating the parameter values
220
- # def test_index_invalid_filter_value
221
- # get :index, {ids: [1,'asdfg1']}
222
- # assert_response :bad_request
223
- # end
224
-
225
212
  def test_show_single
226
213
  get :show, {id: '1'}
227
214
  assert_response :success
228
215
  assert json_response['data'].is_a?(Hash)
229
216
  assert_equal 'New post', json_response['data']['title']
230
217
  assert_equal 'A body!!!', json_response['data']['body']
231
- assert_nil json_response['linked']
218
+ assert_nil json_response['included']
232
219
  end
233
220
 
234
221
  def test_show_single_with_includes
@@ -237,18 +224,25 @@ class PostsControllerTest < ActionController::TestCase
237
224
  assert json_response['data'].is_a?(Hash)
238
225
  assert_equal 'New post', json_response['data']['title']
239
226
  assert_equal 'A body!!!', json_response['data']['body']
240
- assert_nil json_response['data']['links']['tags']['ids']
241
- assert_equal ['1', '2'], json_response['data']['links']['comments']['ids']
242
- assert_equal 2, json_response['linked'].size
227
+ assert_nil json_response['data']['links']['tags']['linkage']
228
+ assert matches_array?([{'type' => 'comments', 'id' => '1'}, {'type' => 'comments', 'id' => '2'}],
229
+ json_response['data']['links']['comments']['linkage'])
230
+ assert_equal 2, json_response['included'].size
243
231
  end
244
232
 
245
233
  def test_show_single_with_fields
246
- get :show, {id: '1', fields: 'author'}
234
+ get :show, {id: '1', fields: {posts: 'author'}}
247
235
  assert_response :success
248
236
  assert json_response['data'].is_a?(Hash)
249
237
  assert_nil json_response['data']['title']
250
238
  assert_nil json_response['data']['body']
251
- assert_equal '1', json_response['data']['links']['author']['id']
239
+ assert_equal '1', json_response['data']['links']['author']['linkage']['id']
240
+ end
241
+
242
+ def test_show_single_with_fields_string
243
+ get :show, {id: '1', fields: 'author'}
244
+ assert_response :bad_request
245
+ assert_match /Fields must specify a type./, json_response['errors'][0]['detail']
252
246
  end
253
247
 
254
248
  def test_show_single_invalid_id_format
@@ -266,7 +260,7 @@ class PostsControllerTest < ActionController::TestCase
266
260
  def test_show_malformed_fields_not_list
267
261
  get :show, {id: '1', 'fields' => ''}
268
262
  assert_response :bad_request
269
- assert_match /nil is not a valid field for posts./, json_response['errors'][0]['detail']
263
+ assert_match /Fields must specify a type./, json_response['errors'][0]['detail']
270
264
  end
271
265
 
272
266
  def test_show_malformed_fields_type_not_list
@@ -291,7 +285,7 @@ class PostsControllerTest < ActionController::TestCase
291
285
 
292
286
  assert_response :created
293
287
  assert json_response['data'].is_a?(Hash)
294
- assert_equal '3', json_response['data']['links']['author']['id']
288
+ assert_equal '3', json_response['data']['links']['author']['linkage']['id']
295
289
  assert_equal 'JR is Great', json_response['data']['title']
296
290
  assert_equal 'JSONAPIResources is the greatest thing since unsliced bread.', json_response['data']['body']
297
291
  end
@@ -386,7 +380,7 @@ class PostsControllerTest < ActionController::TestCase
386
380
  assert_response :created
387
381
  assert json_response['data'].is_a?(Array)
388
382
  assert_equal json_response['data'].size, 2
389
- assert_equal json_response['data'][0]['links']['author']['id'], '3'
383
+ assert_equal json_response['data'][0]['links']['author']['linkage']['id'], '3'
390
384
  assert_match /JR is Great/, response.body
391
385
  assert_match /Ember is Great/, response.body
392
386
  end
@@ -500,14 +494,14 @@ class PostsControllerTest < ActionController::TestCase
500
494
  body: 'JSONAPIResources is the greatest thing since unsliced bread.',
501
495
  links: {
502
496
  author: {type: 'people', id: '3'},
503
- tags: {type: 'tags', ids: [3, 4]}
497
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
504
498
  }
505
499
  }
506
500
  }
507
501
 
508
502
  assert_response :created
509
503
  assert json_response['data'].is_a?(Hash)
510
- assert_equal '3', json_response['data']['links']['author']['id']
504
+ assert_equal '3', json_response['data']['links']['author']['linkage']['id']
511
505
  assert_equal 'JR is Great', json_response['data']['title']
512
506
  assert_equal 'JSONAPIResources is the greatest thing since unsliced bread.', json_response['data']['body']
513
507
  end
@@ -529,7 +523,7 @@ class PostsControllerTest < ActionController::TestCase
529
523
 
530
524
  assert_response :created
531
525
  assert json_response['data'].is_a?(Hash)
532
- assert_equal '3', json_response['data']['links']['author']['id']
526
+ assert_equal '3', json_response['data']['links']['author']['linkage']['id']
533
527
  assert_equal 'JR is Great', json_response['data']['title']
534
528
  assert_equal 'JSONAPIResources is the greatest thing since unsliced bread.', json_response['data']['body']
535
529
  end
@@ -544,18 +538,18 @@ class PostsControllerTest < ActionController::TestCase
544
538
  body: 'JSONAPIResources is the greatest thing since unsliced bread!',
545
539
  links: {
546
540
  author: {type: 'people', id: '3'},
547
- tags: {type: 'tags', ids: [3, 4]}
541
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
548
542
  }
549
543
  },
550
544
  include: 'author,author.posts',
551
- fields: 'id,title,author'
545
+ fields: {posts: 'id,title,author'}
552
546
  }
553
547
 
554
548
  assert_response :created
555
549
  assert json_response['data'].is_a?(Hash)
556
- assert_equal '3', json_response['data']['links']['author']['id']
550
+ assert_equal '3', json_response['data']['links']['author']['linkage']['id']
557
551
  assert_equal 'JR is Great!', json_response['data']['title']
558
- assert_not_nil json_response['linked'].size
552
+ assert_not_nil json_response['included'].size
559
553
  end
560
554
 
561
555
  def test_update_with_links
@@ -571,7 +565,7 @@ class PostsControllerTest < ActionController::TestCase
571
565
  title: 'A great new Post',
572
566
  links: {
573
567
  section: {type: 'sections', id: "#{javascript.id}"},
574
- tags: {type: 'tags', ids: [3, 4]}
568
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
575
569
  }
576
570
  },
577
571
  include: 'tags'
@@ -579,11 +573,12 @@ class PostsControllerTest < ActionController::TestCase
579
573
 
580
574
  assert_response :success
581
575
  assert json_response['data'].is_a?(Hash)
582
- assert_equal '3', json_response['data']['links']['author']['id']
583
- assert_equal javascript.id.to_s, json_response['data']['links']['section']['id']
576
+ assert_equal '3', json_response['data']['links']['author']['linkage']['id']
577
+ assert_equal javascript.id.to_s, json_response['data']['links']['section']['linkage']['id']
584
578
  assert_equal 'A great new Post', json_response['data']['title']
585
579
  assert_equal 'AAAA', json_response['data']['body']
586
- assert matches_array?(['3', '4'], json_response['data']['links']['tags']['ids'])
580
+ assert matches_array?([{'type' => 'tags', 'id' => '3'}, {'type' => 'tags', 'id' => '4'}],
581
+ json_response['data']['links']['tags']['linkage'])
587
582
  end
588
583
 
589
584
  def test_update_remove_links
@@ -605,29 +600,30 @@ class PostsControllerTest < ActionController::TestCase
605
600
 
606
601
  assert_response :success
607
602
  assert json_response['data'].is_a?(Hash)
608
- assert_equal '3', json_response['data']['links']['author']['id']
609
- assert_equal nil, json_response['data']['links']['section']['id']
603
+ assert_equal '3', json_response['data']['links']['author']['linkage']['id']
604
+ assert_equal nil, json_response['data']['links']['section']['linkage']['id']
610
605
  assert_equal 'A great new Post', json_response['data']['title']
611
606
  assert_equal 'AAAA', json_response['data']['body']
612
- assert matches_array?([], json_response['data']['links']['tags']['ids'])
607
+ assert matches_array?([],
608
+ json_response['data']['links']['tags']['linkage'])
613
609
  end
614
610
 
615
611
  def test_update_relationship_has_one
616
612
  set_content_type_header!
617
613
  ruby = Section.find_by(name: 'ruby')
618
- post_object = Post.find(3)
614
+ post_object = Post.find(4)
619
615
  assert_not_equal ruby.id, post_object.section_id
620
616
 
621
- put :update_association, {post_id: 3, association: 'section', data: {type: 'sections', id: "#{ruby.id}"}}
617
+ put :update_association, {post_id: 4, association: 'section', data: {type: 'sections', id: "#{ruby.id}"}}
622
618
 
623
619
  assert_response :no_content
624
- post_object = Post.find(3)
620
+ post_object = Post.find(4)
625
621
  assert_equal ruby.id, post_object.section_id
626
622
  end
627
623
 
628
624
  def test_update_relationship_has_one_invalid_links_hash_keys_ids
629
625
  set_content_type_header!
630
- put :update_association, {post_id: 3, association: 'section', data: {types: 'sections', ids: 'foo'}}
626
+ put :update_association, {post_id: 3, association: 'section', data: {type: 'sections', ids: 'foo'}}
631
627
 
632
628
  assert_response :bad_request
633
629
  assert_match /Invalid Links Object/, response.body
@@ -635,7 +631,15 @@ class PostsControllerTest < ActionController::TestCase
635
631
 
636
632
  def test_update_relationship_has_one_invalid_links_hash_count
637
633
  set_content_type_header!
638
- put :update_association, {post_id: 3, association: 'section', data: {types: 'sections'}}
634
+ put :update_association, {post_id: 3, association: 'section', data: {type: 'sections'}}
635
+
636
+ assert_response :bad_request
637
+ assert_match /Invalid Links Object/, response.body
638
+ end
639
+
640
+ def test_update_relationship_has_many_not_array
641
+ set_content_type_header!
642
+ put :update_association, {post_id: 3, association: 'tags', data: {type: 'tags', id: 2}}
639
643
 
640
644
  assert_response :bad_request
641
645
  assert_match /Invalid Links Object/, response.body
@@ -707,14 +711,26 @@ class PostsControllerTest < ActionController::TestCase
707
711
  set_content_type_header!
708
712
  ruby = Section.find_by(name: 'ruby')
709
713
  post_object = Post.find(3)
710
- post_object.section_id = ruby.id
714
+ post_object.section = ruby
711
715
  post_object.save!
712
716
 
713
717
  put :update_association, {post_id: 3, association: 'section', data: {type: 'sections', id: nil}}
714
718
 
715
719
  assert_response :no_content
720
+ assert_equal nil, post_object.reload.section_id
721
+ end
722
+
723
+ def test_update_relationship_has_one_data_nil
724
+ set_content_type_header!
725
+ ruby = Section.find_by(name: 'ruby')
716
726
  post_object = Post.find(3)
717
- assert_equal nil, post_object.section_id
727
+ post_object.section = ruby
728
+ post_object.save!
729
+
730
+ put :update_association, {post_id: 3, association: 'section', data: nil}
731
+
732
+ assert_response :no_content
733
+ assert_equal nil, post_object.reload.section_id
718
734
  end
719
735
 
720
736
  def test_remove_relationship_has_one
@@ -747,19 +763,19 @@ class PostsControllerTest < ActionController::TestCase
747
763
 
748
764
  def test_update_relationship_has_many_join_table_single
749
765
  set_content_type_header!
750
- put :update_association, {post_id: 3, association: 'tags', data: {type: 'tags', ids: []}}
766
+ put :update_association, {post_id: 3, association: 'tags', data: []}
751
767
  assert_response :no_content
752
768
 
753
769
  post_object = Post.find(3)
754
770
  assert_equal 0, post_object.tags.length
755
771
 
756
- put :update_association, {post_id: 3, association: 'tags', data: {type: 'tags', ids: [2]}}
772
+ put :update_association, {post_id: 3, association: 'tags', data: [{type: 'tags', id: 2}]}
757
773
 
758
774
  assert_response :no_content
759
775
  post_object = Post.find(3)
760
776
  assert_equal 1, post_object.tags.length
761
777
 
762
- put :update_association, {post_id: 3, association: 'tags', data: {type: 'tags', ids: [5]}}
778
+ put :update_association, {post_id: 3, association: 'tags', data: [{type: 'tags', id: 5}]}
763
779
 
764
780
  assert_response :no_content
765
781
  post_object = Post.find(3)
@@ -768,17 +784,7 @@ class PostsControllerTest < ActionController::TestCase
768
784
  assert matches_array? [5], tags
769
785
  end
770
786
 
771
- def test_update_relationship_has_many_join_table_homogenous
772
- set_content_type_header!
773
- put :update_association, {post_id: 3, association: 'tags', data: {type: 'tags', ids: [2, 3]}}
774
-
775
- assert_response :no_content
776
- post_object = Post.find(3)
777
- assert_equal 2, post_object.tags.collect { |tag| tag.id }.length
778
- assert matches_array? [2, 3], post_object.tags.collect { |tag| tag.id }
779
- end
780
-
781
- def test_update_relationship_has_many_join_table_heterogenous
787
+ def test_update_relationship_has_many
782
788
  set_content_type_header!
783
789
  put :update_association, {post_id: 3, association: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
784
790
 
@@ -790,14 +796,14 @@ class PostsControllerTest < ActionController::TestCase
790
796
 
791
797
  def test_create_relationship_has_many_join_table
792
798
  set_content_type_header!
793
- put :update_association, {post_id: 3, association: 'tags', data: {type: 'tags', ids: [2, 3]}}
799
+ put :update_association, {post_id: 3, association: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
794
800
 
795
801
  assert_response :no_content
796
802
  post_object = Post.find(3)
797
803
  assert_equal 2, post_object.tags.collect { |tag| tag.id }.length
798
804
  assert matches_array? [2, 3], post_object.tags.collect { |tag| tag.id }
799
805
 
800
- post :create_association, {post_id: 3, association: 'tags', data: {type: 'tags', ids: [5]}}
806
+ post :create_association, {post_id: 3, association: 'tags', data: [{type: 'tags', id: 5}]}
801
807
 
802
808
  assert_response :no_content
803
809
  post_object = Post.find(3)
@@ -807,7 +813,7 @@ class PostsControllerTest < ActionController::TestCase
807
813
 
808
814
  def test_create_relationship_has_many_mismatched_type
809
815
  set_content_type_header!
810
- post :create_association, {post_id: 3, association: 'tags', data: {type: 'comments', ids: [5]}}
816
+ post :create_association, {post_id: 3, association: 'tags', data: [{type: 'comments', id: 5}]}
811
817
 
812
818
  assert_response :bad_request
813
819
  assert_match /Type Mismatch/, response.body
@@ -815,10 +821,18 @@ class PostsControllerTest < ActionController::TestCase
815
821
 
816
822
  def test_create_relationship_has_many_missing_id
817
823
  set_content_type_header!
818
- post :create_association, {post_id: 3, association: 'tags', data: {type: 'tags', idds: [5]}}
824
+ post :create_association, {post_id: 3, association: 'tags', data: [{type: 'tags', idd: 5}]}
819
825
 
820
826
  assert_response :bad_request
821
- assert_match /The required parameter, ids, is missing/, response.body
827
+ assert_match /Data is not a valid Links Object./, response.body
828
+ end
829
+
830
+ def test_create_relationship_has_many_not_array
831
+ set_content_type_header!
832
+ post :create_association, {post_id: 3, association: 'tags', data: {type: 'tags', id: 5}}
833
+
834
+ assert_response :bad_request
835
+ assert_match /Data is not a valid Links Object./, response.body
822
836
  end
823
837
 
824
838
  def test_create_relationship_has_many_missing_data
@@ -831,20 +845,20 @@ class PostsControllerTest < ActionController::TestCase
831
845
 
832
846
  def test_create_relationship_has_many_join
833
847
  set_content_type_header!
834
- post :create_association, {post_id: 4, association: 'tags', data: {type: 'tags', ids: [1, 2, 3]}}
848
+ post :create_association, {post_id: 4, association: 'tags', data: [{type: 'tags', id: 1}, {type: 'tags', id: 2}, {type: 'tags', id: 3}]}
835
849
  assert_response :no_content
836
850
  end
837
851
 
838
852
  def test_create_relationship_has_many_join_table_record_exists
839
853
  set_content_type_header!
840
- put :update_association, {post_id: 3, association: 'tags', data: {type: 'tags', ids: [2, 3]}}
854
+ put :update_association, {post_id: 3, association: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
841
855
 
842
856
  assert_response :no_content
843
857
  post_object = Post.find(3)
844
858
  assert_equal 2, post_object.tags.collect { |tag| tag.id }.length
845
859
  assert matches_array? [2, 3], post_object.tags.collect { |tag| tag.id }
846
860
 
847
- post :create_association, {post_id: 3, association: 'tags', data: {type: 'tags', ids: [5, 2]}}
861
+ post :create_association, {post_id: 3, association: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 5}]}
848
862
 
849
863
  assert_response :bad_request
850
864
  assert_match /The relation to 2 already exists./, response.body
@@ -860,12 +874,12 @@ class PostsControllerTest < ActionController::TestCase
860
874
 
861
875
  def test_delete_relationship_has_many
862
876
  set_content_type_header!
863
- put :update_association, {post_id: 9, association: 'tags', data: {type: 'tags', ids: [2, 3]}}
877
+ put :update_association, {post_id: 14, association: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
864
878
  assert_response :no_content
865
- p = Post.find(9)
879
+ p = Post.find(14)
866
880
  assert_equal [2, 3], p.tag_ids
867
881
 
868
- delete :destroy_association, {post_id: 9, association: 'tags', keys: '3'}
882
+ delete :destroy_association, {post_id: 14, association: 'tags', keys: '3'}
869
883
 
870
884
  p.reload
871
885
  assert_response :no_content
@@ -874,18 +888,32 @@ class PostsControllerTest < ActionController::TestCase
874
888
 
875
889
  def test_delete_relationship_has_many_does_not_exist
876
890
  set_content_type_header!
877
- put :update_association, {post_id: 9, association: 'tags', data: {type: 'tags', ids: [2, 3]}}
891
+ put :update_association, {post_id: 14, association: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
878
892
  assert_response :no_content
879
- p = Post.find(9)
893
+ p = Post.find(14)
880
894
  assert_equal [2, 3], p.tag_ids
881
895
 
882
- delete :destroy_association, {post_id: 9, association: 'tags', keys: '4'}
896
+ delete :destroy_association, {post_id: 14, association: 'tags', keys: '4'}
883
897
 
884
898
  p.reload
885
899
  assert_response :not_found
886
900
  assert_equal [2, 3], p.tag_ids
887
901
  end
888
902
 
903
+ def test_delete_relationship_has_many_with_empty_data
904
+ set_content_type_header!
905
+ put :update_association, {post_id: 14, association: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
906
+ assert_response :no_content
907
+ p = Post.find(14)
908
+ assert_equal [2, 3], p.tag_ids
909
+
910
+ put :update_association, {post_id: 14, association: 'tags', data: [] }
911
+
912
+ p.reload
913
+ assert_response :no_content
914
+ assert_equal [], p.tag_ids
915
+ end
916
+
889
917
  def test_update_mismatched_keys
890
918
  set_content_type_header!
891
919
  javascript = Section.find_by(name: 'javascript')
@@ -899,7 +927,7 @@ class PostsControllerTest < ActionController::TestCase
899
927
  title: 'A great new Post',
900
928
  links: {
901
929
  section: {type: 'sections', id: "#{javascript.id}"},
902
- tags: {type: 'tags', ids: [3, 4]}
930
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
903
931
  }
904
932
  }
905
933
  }
@@ -922,7 +950,7 @@ class PostsControllerTest < ActionController::TestCase
922
950
  title: 'A great new Post',
923
951
  links: {
924
952
  section: {type: 'sections', id: "#{javascript.id}"},
925
- tags: {type: 'tags', ids: [3, 4]}
953
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
926
954
  }
927
955
  }
928
956
  }
@@ -945,7 +973,7 @@ class PostsControllerTest < ActionController::TestCase
945
973
  links: {
946
974
  asdfg: 'aaaa',
947
975
  section: {type: 'sections', id: "#{javascript.id}"},
948
- tags: {type: 'tags', ids: [3, 4]}
976
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
949
977
  }
950
978
  }
951
979
  }
@@ -966,7 +994,7 @@ class PostsControllerTest < ActionController::TestCase
966
994
  title: 'A great new Post',
967
995
  links: {
968
996
  section: {type: 'sections', id: "#{javascript.id}"},
969
- tags: {type: 'tags', ids: [3, 4]}
997
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
970
998
  }
971
999
  }
972
1000
  }
@@ -1004,7 +1032,7 @@ class PostsControllerTest < ActionController::TestCase
1004
1032
  title: 'A great new Post',
1005
1033
  links: {
1006
1034
  section: {type: 'sections', id: "#{javascript.id}"},
1007
- tags: {type: 'tags', ids: [3, 4]}
1035
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1008
1036
  }
1009
1037
  }
1010
1038
  }
@@ -1019,7 +1047,7 @@ class PostsControllerTest < ActionController::TestCase
1019
1047
 
1020
1048
  put :update,
1021
1049
  {
1022
- id: [3, 9],
1050
+ id: [3, 16],
1023
1051
  data: [
1024
1052
  {
1025
1053
  type: 'posts',
@@ -1027,16 +1055,16 @@ class PostsControllerTest < ActionController::TestCase
1027
1055
  title: 'A great new Post QWERTY',
1028
1056
  links: {
1029
1057
  section: {type: 'sections', id: "#{javascript.id}"},
1030
- tags: {type: 'tags', ids: [3, 4]}
1058
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1031
1059
  }
1032
1060
  },
1033
1061
  {
1034
1062
  type: 'posts',
1035
- id: 9,
1063
+ id: 16,
1036
1064
  title: 'A great new Post ASDFG',
1037
1065
  links: {
1038
1066
  section: {type: 'sections', id: "#{javascript.id}"},
1039
- tags: {type: 'tags', ids: [3, 4]}
1067
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1040
1068
  }
1041
1069
  }
1042
1070
  ],
@@ -1045,17 +1073,19 @@ class PostsControllerTest < ActionController::TestCase
1045
1073
 
1046
1074
  assert_response :success
1047
1075
  assert_equal json_response['data'].size, 2
1048
- assert_equal json_response['data'][0]['links']['author']['id'], '3'
1049
- assert_equal json_response['data'][0]['links']['section']['id'], javascript.id.to_s
1076
+ assert_equal json_response['data'][0]['links']['author']['linkage']['id'], '3'
1077
+ assert_equal json_response['data'][0]['links']['section']['linkage']['id'], javascript.id.to_s
1050
1078
  assert_equal json_response['data'][0]['title'], 'A great new Post QWERTY'
1051
1079
  assert_equal json_response['data'][0]['body'], 'AAAA'
1052
- assert_equal json_response['data'][0]['links']['tags']['ids'], ['3', '4']
1080
+ assert matches_array?([{'type' => 'tags', 'id' => '3'}, {'type' => 'tags', 'id' => '4'}],
1081
+ json_response['data'][0]['links']['tags']['linkage'])
1053
1082
 
1054
- assert_equal json_response['data'][1]['links']['author']['id'], '3'
1055
- assert_equal json_response['data'][1]['links']['section']['id'], javascript.id.to_s
1083
+ assert_equal json_response['data'][1]['links']['author']['linkage']['id'], '3'
1084
+ assert_equal json_response['data'][1]['links']['section']['linkage']['id'], javascript.id.to_s
1056
1085
  assert_equal json_response['data'][1]['title'], 'A great new Post ASDFG'
1057
- assert_equal json_response['data'][1]['body'], 'AAAA'
1058
- assert_equal json_response['data'][1]['links']['tags']['ids'], ['3', '4']
1086
+ assert_equal json_response['data'][1]['body'], 'Not First!!!!'
1087
+ assert matches_array?([{'type' => 'tags', 'id' => '3'}, {'type' => 'tags', 'id' => '4'}],
1088
+ json_response['data'][1]['links']['tags']['linkage'])
1059
1089
  end
1060
1090
 
1061
1091
  def test_update_multiple_missing_keys
@@ -1071,7 +1101,7 @@ class PostsControllerTest < ActionController::TestCase
1071
1101
  title: 'A great new Post ASDFG',
1072
1102
  links: {
1073
1103
  section: {type: 'sections', id: "#{javascript.id}"},
1074
- tags: {type: 'tags', ids: [3, 4]}
1104
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1075
1105
  }
1076
1106
  },
1077
1107
  {
@@ -1079,7 +1109,7 @@ class PostsControllerTest < ActionController::TestCase
1079
1109
  title: 'A great new Post QWERTY',
1080
1110
  links: {
1081
1111
  section: {type: 'sections', id: "#{javascript.id}"},
1082
- tags: {type: 'tags', ids: [3, 4]}
1112
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1083
1113
  }
1084
1114
  }
1085
1115
  ]}
@@ -1102,7 +1132,7 @@ class PostsControllerTest < ActionController::TestCase
1102
1132
  title: 'A great new Post ASDFG',
1103
1133
  links: {
1104
1134
  section: {type: 'sections', id: "#{javascript.id}"},
1105
- tags: {type: 'tags', ids: [3, 4]}
1135
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1106
1136
  }
1107
1137
  },
1108
1138
  {
@@ -1111,7 +1141,7 @@ class PostsControllerTest < ActionController::TestCase
1111
1141
  title: 'A great new Post QWERTY',
1112
1142
  links: {
1113
1143
  section: {type: 'sections', id: "#{javascript.id}"},
1114
- tags: {type: 'tags', ids: [3, 4]}
1144
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1115
1145
  }
1116
1146
  }
1117
1147
  ]}
@@ -1134,7 +1164,7 @@ class PostsControllerTest < ActionController::TestCase
1134
1164
  title: 'A great new Post QWERTY',
1135
1165
  links: {
1136
1166
  section: {type: 'sections', id: "#{javascript.id}"},
1137
- tags: {type: 'tags', ids: [3, 4]}
1167
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1138
1168
  }
1139
1169
  },
1140
1170
  {
@@ -1143,7 +1173,7 @@ class PostsControllerTest < ActionController::TestCase
1143
1173
  title: 'A great new Post ASDFG',
1144
1174
  links: {
1145
1175
  section: {type: 'sections', id: "#{javascript.id}"},
1146
- tags: {type: 'tags', ids: [3, 4]}
1176
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1147
1177
  }
1148
1178
  }
1149
1179
  ]}
@@ -1163,7 +1193,7 @@ class PostsControllerTest < ActionController::TestCase
1163
1193
  subject: 'A great new Post',
1164
1194
  links: {
1165
1195
  author: {type: 'people', id: '1'},
1166
- tags: {type: 'tags', ids: [3, 4]}
1196
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1167
1197
  }
1168
1198
  }
1169
1199
  }
@@ -1183,7 +1213,7 @@ class PostsControllerTest < ActionController::TestCase
1183
1213
  subject: 'A great new Post',
1184
1214
  linked_objects: {
1185
1215
  author: {type: 'people', id: '1'},
1186
- tags: {type: 'tags', ids: [3, 4]}
1216
+ tags: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]
1187
1217
  }
1188
1218
  }
1189
1219
  }
@@ -1224,26 +1254,36 @@ class PostsControllerTest < ActionController::TestCase
1224
1254
  assert_response :success
1225
1255
  assert_hash_equals json_response,
1226
1256
  {data: {
1227
- type: 'people',
1228
- id: '1',
1229
- self: 'http://test.host/posts/1/links/author',
1230
- resource: 'http://test.host/posts/1/author'
1231
- }
1257
+ type: 'people',
1258
+ id: '1'
1259
+ },
1260
+ links: {
1261
+ self: 'http://test.host/posts/1/links/author',
1262
+ related: 'http://test.host/posts/1/author'
1263
+ }
1232
1264
  }
1233
1265
  end
1234
1266
 
1235
1267
  def test_show_has_many_relationship
1236
- get :show_association, {post_id: '1', association: 'tags'}
1268
+ get :show_association, {post_id: '2', association: 'tags'}
1237
1269
  assert_response :success
1238
1270
  assert_hash_equals json_response,
1239
- {data: {
1240
- type: 'tags',
1241
- ids: ['1', '2', '3'],
1242
- self: 'http://test.host/posts/1/links/tags',
1243
- resource: 'http://test.host/posts/1/tags'
1271
+ {
1272
+ data: [
1273
+ {type: 'tags', id: '5'}
1274
+ ],
1275
+ links: {
1276
+ self: 'http://test.host/posts/2/links/tags',
1277
+ related: 'http://test.host/posts/2/tags'
1244
1278
  }
1245
1279
  }
1246
1280
  end
1281
+
1282
+ def test_show_has_many_relationship_invalid_id
1283
+ get :show_association, {post_id: '2,1', association: 'tags'}
1284
+ assert_response :bad_request
1285
+ assert_match /2,1 is not a valid value for id/, response.body
1286
+ end
1247
1287
  end
1248
1288
 
1249
1289
  class TagsControllerTest < ActionController::TestCase
@@ -1251,33 +1291,36 @@ class TagsControllerTest < ActionController::TestCase
1251
1291
  get :index, {filter: {id: '6,7,8,9'}, include: 'posts,posts.tags,posts.author.posts'}
1252
1292
  assert_response :success
1253
1293
  assert_equal 4, json_response['data'].size
1254
- assert_equal 2, json_response['linked'].size
1294
+ assert_equal 2, json_response['included'].size
1255
1295
  end
1256
1296
 
1257
1297
  def test_tags_show_multiple
1258
1298
  get :show, {id: '6,7,8,9'}
1259
- assert_response :success
1260
- assert json_response['data'].is_a?(Array)
1261
- assert_equal 4, json_response['data'].size
1299
+ assert_response :bad_request
1300
+ assert_match /6,7,8,9 is not a valid value for id/, response.body
1262
1301
  end
1263
1302
 
1264
1303
  def test_tags_show_multiple_with_include
1265
1304
  get :show, {id: '6,7,8,9', include: 'posts,posts.tags,posts.author.posts'}
1266
- assert_response :success
1267
- assert json_response['data'].is_a?(Array)
1268
- assert_equal 4, json_response['data'].size
1269
- assert_equal 2, json_response['linked'].size
1305
+ assert_response :bad_request
1306
+ assert_match /6,7,8,9 is not a valid value for id/, response.body
1270
1307
  end
1271
1308
 
1272
1309
  def test_tags_show_multiple_with_nonexistent_ids
1273
1310
  get :show, {id: '6,99,9,100'}
1274
- assert_response :not_found
1275
- assert_match /The record identified by 99 could not be found./, json_response['errors'][0]['detail']
1311
+ assert_response :bad_request
1312
+ assert_match /6,99,9,100 is not a valid value for id/, response.body
1313
+ end
1314
+
1315
+ def test_tags_show_multiple_with_nonexistent_ids_at_the_beginning
1316
+ get :show, {id: '99,9,100'}
1317
+ assert_response :bad_request
1318
+ assert_match /99,9,100 is not a valid value for id/, response.body
1276
1319
  end
1277
1320
  end
1278
1321
 
1279
1322
  class ExpenseEntriesControllerTest < ActionController::TestCase
1280
- def after_teardown
1323
+ def setup
1281
1324
  JSONAPI.configuration.json_key_format = :camelized_key
1282
1325
  end
1283
1326
 
@@ -1298,7 +1341,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1298
1341
  get :show, {id: 1, include: 'isoCurrency,employee'}
1299
1342
  assert_response :success
1300
1343
  assert json_response['data'].is_a?(Hash)
1301
- assert_equal 2, json_response['linked'].size
1344
+ assert_equal 2, json_response['included'].size
1302
1345
  end
1303
1346
 
1304
1347
  def test_expense_entries_show_bad_include_missing_association
@@ -1315,18 +1358,11 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1315
1358
  end
1316
1359
 
1317
1360
  def test_expense_entries_show_fields
1318
- get :show, {id: 1, include: 'isoCurrency,employee', 'fields' => 'transactionDate'}
1319
- assert_response :success
1320
- assert json_response['data'].is_a?(Hash)
1321
- assert json_response['data'].has_key?('transactionDate')
1322
- end
1323
-
1324
- def test_expense_entries_show_fields_type
1325
1361
  get :show, {id: 1, include: 'isoCurrency,employee', 'fields' => {'expenseEntries' => 'transactionDate'}}
1326
1362
  assert_response :success
1327
1363
  assert json_response['data'].is_a?(Hash)
1328
1364
  assert json_response['data'].has_key?('transactionDate')
1329
- assert_equal 2, json_response['linked'].size
1365
+ assert_equal 2, json_response['included'].size
1330
1366
  end
1331
1367
 
1332
1368
  def test_expense_entries_show_fields_type_many
@@ -1335,7 +1371,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1335
1371
  assert_response :success
1336
1372
  assert json_response['data'].is_a?(Hash)
1337
1373
  assert json_response['data'].has_key?('transactionDate')
1338
- assert_equal 2, json_response['linked'].size
1374
+ assert_equal 2, json_response['included'].size
1339
1375
  end
1340
1376
 
1341
1377
  def test_create_expense_entries_underscored
@@ -1354,14 +1390,14 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1354
1390
  }
1355
1391
  },
1356
1392
  include: 'iso_currency',
1357
- fields: 'id,transaction_date,iso_currency,cost,employee'
1393
+ fields: {expense_entries: 'id,transaction_date,iso_currency,cost,employee'}
1358
1394
  }
1359
1395
 
1360
1396
  assert_response :created
1361
1397
  assert json_response['data'].is_a?(Hash)
1362
- assert_equal '3', json_response['data']['links']['employee']['id']
1363
- assert_equal 'USD', json_response['data']['links']['iso_currency']['id']
1364
- assert_equal 50.58, json_response['data']['cost']
1398
+ assert_equal '3', json_response['data']['links']['employee']['linkage']['id']
1399
+ assert_equal 'USD', json_response['data']['links']['iso_currency']['linkage']['id']
1400
+ assert_equal '50.58', json_response['data']['cost']
1365
1401
 
1366
1402
  delete :destroy, {id: json_response['data']['id']}
1367
1403
  assert_response :no_content
@@ -1383,14 +1419,14 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1383
1419
  }
1384
1420
  },
1385
1421
  include: 'isoCurrency',
1386
- fields: 'id,transactionDate,isoCurrency,cost,employee'
1422
+ fields: {expenseEntries: 'id,transactionDate,isoCurrency,cost,employee'}
1387
1423
  }
1388
1424
 
1389
1425
  assert_response :created
1390
1426
  assert json_response['data'].is_a?(Hash)
1391
- assert_equal '3', json_response['data']['links']['employee']['id']
1392
- assert_equal 'USD', json_response['data']['links']['isoCurrency']['id']
1393
- assert_equal 50.58, json_response['data']['cost']
1427
+ assert_equal '3', json_response['data']['links']['employee']['linkage']['id']
1428
+ assert_equal 'USD', json_response['data']['links']['isoCurrency']['linkage']['id']
1429
+ assert_equal '50.58', json_response['data']['cost']
1394
1430
 
1395
1431
  delete :destroy, {id: json_response['data']['id']}
1396
1432
  assert_response :no_content
@@ -1412,14 +1448,14 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1412
1448
  }
1413
1449
  },
1414
1450
  include: 'iso-currency',
1415
- fields: 'id,transaction-date,iso-currency,cost,employee'
1451
+ fields: {'expense-entries' => 'id,transaction-date,iso-currency,cost,employee'}
1416
1452
  }
1417
1453
 
1418
1454
  assert_response :created
1419
1455
  assert json_response['data'].is_a?(Hash)
1420
- assert_equal '3', json_response['data']['links']['employee']['id']
1421
- assert_equal 'USD', json_response['data']['links']['iso-currency']['id']
1422
- assert_equal 50.58, json_response['data']['cost']
1456
+ assert_equal '3', json_response['data']['links']['employee']['linkage']['id']
1457
+ assert_equal 'USD', json_response['data']['links']['iso-currency']['linkage']['id']
1458
+ assert_equal '50.58', json_response['data']['cost']
1423
1459
 
1424
1460
  delete :destroy, {id: json_response['data']['id']}
1425
1461
  assert_response :no_content
@@ -1517,6 +1553,10 @@ class IsoCurrenciesControllerTest < ActionController::TestCase
1517
1553
  end
1518
1554
 
1519
1555
  class PeopleControllerTest < ActionController::TestCase
1556
+ def setup
1557
+ JSONAPI.configuration.json_key_format = :camelized_key
1558
+ end
1559
+
1520
1560
  def test_create_validations
1521
1561
  set_content_type_header!
1522
1562
  post :create,
@@ -1589,7 +1629,7 @@ class PeopleControllerTest < ActionController::TestCase
1589
1629
  end
1590
1630
  end
1591
1631
 
1592
- class AuthorsControllerTest < ActionController::TestCase
1632
+ class Api::V5::AuthorsControllerTest < ActionController::TestCase
1593
1633
  def test_get_person_as_author
1594
1634
  get :index, {filter: {id: '1'}}
1595
1635
  assert_response :success
@@ -1629,13 +1669,9 @@ class BreedsControllerTest < ActionController::TestCase
1629
1669
 
1630
1670
  def test_poro_show_multiple
1631
1671
  get :show, {id: '0,2'}
1632
- assert_response :success
1633
- assert json_response['data'].is_a?(Array)
1634
- assert_equal 2, json_response['data'].size
1635
- assert_equal '0', json_response['data'][0]['id']
1636
- assert_equal 'Persian', json_response['data'][0]['name']
1637
- assert_equal '2', json_response['data'][1]['id']
1638
- assert_equal 'Sphinx', json_response['data'][1]['name']
1672
+
1673
+ assert_response :bad_request
1674
+ assert_match /0,2 is not a valid value for id/, response.body
1639
1675
  end
1640
1676
 
1641
1677
  def test_poro_create_simple
@@ -1707,11 +1743,11 @@ class Api::V1::PostsControllerTest < ActionController::TestCase
1707
1743
  def test_show_post_namespaced_include
1708
1744
  get :show, {id: '1', include: 'writer'}
1709
1745
  assert_response :success
1710
- assert_equal '1', json_response['data']['links']['writer']['id']
1746
+ assert_equal '1', json_response['data']['links']['writer']['linkage']['id']
1711
1747
  assert_nil json_response['data']['links']['tags']
1712
- assert_equal '1', json_response['linked'][0]['id']
1713
- assert_equal 'writers', json_response['linked'][0]['type']
1714
- assert_equal 'joe@xyz.fake', json_response['linked'][0]['email']
1748
+ assert_equal '1', json_response['included'][0]['id']
1749
+ assert_equal 'writers', json_response['included'][0]['type']
1750
+ assert_equal 'joe@xyz.fake', json_response['included'][0]['email']
1715
1751
  end
1716
1752
 
1717
1753
  def test_index_filter_on_association_namespaced
@@ -1743,7 +1779,7 @@ class Api::V1::PostsControllerTest < ActionController::TestCase
1743
1779
 
1744
1780
  assert_response :created
1745
1781
  assert json_response['data'].is_a?(Hash)
1746
- assert_equal '3', json_response['data']['links']['writer']['id']
1782
+ assert_equal '3', json_response['data']['links']['writer']['linkage']['id']
1747
1783
  assert_equal 'JR - now with Namespacing', json_response['data']['title']
1748
1784
  assert_equal 'JSONAPIResources is the greatest thing since unsliced bread now that it has namespaced resources.',
1749
1785
  json_response['data']['body']
@@ -1752,6 +1788,10 @@ class Api::V1::PostsControllerTest < ActionController::TestCase
1752
1788
  end
1753
1789
 
1754
1790
  class FactsControllerTest < ActionController::TestCase
1791
+ def setup
1792
+ JSONAPI.configuration.json_key_format = :camelized_key
1793
+ end
1794
+
1755
1795
  def test_type_formatting
1756
1796
  get :show, {id: '1'}
1757
1797
  assert_response :success
@@ -1759,8 +1799,8 @@ class FactsControllerTest < ActionController::TestCase
1759
1799
  assert_equal 'Jane Author', json_response['data']['spouseName']
1760
1800
  assert_equal 'First man to run across Antartica.', json_response['data']['bio']
1761
1801
  assert_equal 23.89/45.6, json_response['data']['qualityRating']
1762
- assert_equal 47000.56, json_response['data']['salary']
1763
- assert_equal '2013-08-07T20:25:00.000Z', json_response['data']['dateTimeJoined']
1802
+ assert_equal '47000.56', json_response['data']['salary']
1803
+ assert_equal '2013-08-07T20:25:00Z', json_response['data']['dateTimeJoined']
1764
1804
  assert_equal '1965-06-30', json_response['data']['birthday']
1765
1805
  assert_equal '2000-01-01T20:00:00Z', json_response['data']['bedtime']
1766
1806
  assert_equal 'abc', json_response['data']['photo']