jsonapi-resources 0.2.0 → 0.3.0.pre1

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.
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']