jsonapi-resources 0.4.4 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/README.md +73 -39
- data/lib/jsonapi-resources.rb +2 -1
- data/lib/jsonapi/acts_as_resource_controller.rb +5 -5
- data/lib/jsonapi/configuration.rb +13 -1
- data/lib/jsonapi/error.rb +2 -2
- data/lib/jsonapi/exceptions.rb +32 -20
- data/lib/jsonapi/link_builder.rb +141 -0
- data/lib/jsonapi/operation.rb +34 -34
- data/lib/jsonapi/operation_result.rb +3 -3
- data/lib/jsonapi/operations_processor.rb +7 -7
- data/lib/jsonapi/{association.rb → relationship.rb} +12 -4
- data/lib/jsonapi/request.rb +85 -85
- data/lib/jsonapi/resource.rb +153 -121
- data/lib/jsonapi/resource_serializer.rb +89 -92
- data/lib/jsonapi/resources/version.rb +1 -1
- data/lib/jsonapi/response_document.rb +1 -1
- data/lib/jsonapi/routing_ext.rb +42 -42
- data/test/controllers/controller_test.rb +90 -100
- data/test/fixtures/active_record.rb +38 -5
- data/test/fixtures/author_details.yml +9 -0
- data/test/fixtures/vehicles.yml +10 -2
- data/test/integration/requests/request_test.rb +17 -17
- data/test/integration/routes/routes_test.rb +20 -20
- data/test/test_helper.rb +18 -1
- data/test/unit/jsonapi_request/jsonapi_request_test.rb +1 -1
- data/test/unit/operation/operations_processor_test.rb +21 -21
- data/test/unit/resource/resource_test.rb +13 -13
- data/test/unit/serializer/link_builder_test.rb +183 -0
- data/test/unit/serializer/polymorphic_serializer_test.rb +73 -74
- data/test/unit/serializer/serializer_test.rb +342 -91
- metadata +8 -3
@@ -129,7 +129,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
129
129
|
assert json_response['data'][0]['relationships'].key?('author')
|
130
130
|
end
|
131
131
|
|
132
|
-
def
|
132
|
+
def test_filter_relationship_single
|
133
133
|
count_queries do
|
134
134
|
get :index, {filter: {tags: '5,1'}}
|
135
135
|
end
|
@@ -141,7 +141,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
141
141
|
assert_match /JR How To/, response.body
|
142
142
|
end
|
143
143
|
|
144
|
-
def
|
144
|
+
def test_filter_relationships_multiple
|
145
145
|
count_queries do
|
146
146
|
get :index, {filter: {tags: '5,1', comments: '3'}}
|
147
147
|
end
|
@@ -151,7 +151,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
151
151
|
assert_match /JR Solves your serialization woes!/, response.body
|
152
152
|
end
|
153
153
|
|
154
|
-
def
|
154
|
+
def test_filter_relationships_multiple_not_found
|
155
155
|
get :index, {filter: {tags: '1', comments: '3'}}
|
156
156
|
assert_response :success
|
157
157
|
assert_equal 0, json_response['data'].size
|
@@ -199,7 +199,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
199
199
|
assert_match /posters is not a valid resource./, json_response['errors'][0]['detail']
|
200
200
|
end
|
201
201
|
|
202
|
-
def
|
202
|
+
def test_index_filter_on_relationship
|
203
203
|
get :index, {filter: {author: '1'}}
|
204
204
|
assert_response :success
|
205
205
|
assert_equal 3, json_response['data'].size
|
@@ -275,7 +275,6 @@ class PostsControllerTest < ActionController::TestCase
|
|
275
275
|
assert_response :success
|
276
276
|
assert json_response['data'].is_a?(Hash)
|
277
277
|
assert_nil json_response['data']['attributes']
|
278
|
-
assert_equal '1', json_response['data']['relationships']['author']['data']['id']
|
279
278
|
end
|
280
279
|
|
281
280
|
def test_show_single_with_fields_string
|
@@ -326,7 +325,6 @@ class PostsControllerTest < ActionController::TestCase
|
|
326
325
|
|
327
326
|
assert_response :created
|
328
327
|
assert json_response['data'].is_a?(Hash)
|
329
|
-
assert_equal '3', json_response['data']['relationships']['author']['data']['id']
|
330
328
|
assert_equal 'JR is Great', json_response['data']['attributes']['title']
|
331
329
|
assert_equal 'JSONAPIResources is the greatest thing since unsliced bread.', json_response['data']['attributes']['body']
|
332
330
|
end
|
@@ -391,11 +389,11 @@ class PostsControllerTest < ActionController::TestCase
|
|
391
389
|
|
392
390
|
assert_response :unprocessable_entity
|
393
391
|
|
394
|
-
assert_equal "/author", json_response['errors'][0]['
|
392
|
+
assert_equal "/data/relationships/author", json_response['errors'][0]['source']['pointer']
|
395
393
|
assert_equal "can't be blank", json_response['errors'][0]['detail']
|
396
394
|
assert_equal "author - can't be blank", json_response['errors'][0]['title']
|
397
395
|
|
398
|
-
assert_equal "/title", json_response['errors'][1]['
|
396
|
+
assert_equal "/data/attributes/title", json_response['errors'][1]['source']['pointer']
|
399
397
|
assert_equal "is too long (maximum is 35 characters)", json_response['errors'][1]['detail']
|
400
398
|
assert_equal "title - is too long (maximum is 35 characters)", json_response['errors'][1]['title']
|
401
399
|
end
|
@@ -431,7 +429,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
431
429
|
assert_response :created
|
432
430
|
assert json_response['data'].is_a?(Array)
|
433
431
|
assert_equal json_response['data'].size, 2
|
434
|
-
|
432
|
+
assert_nil json_response['data'][0]['relationships']['author']['data']
|
435
433
|
assert_match /JR is Great/, response.body
|
436
434
|
assert_match /Ember is Great/, response.body
|
437
435
|
end
|
@@ -547,7 +545,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
547
545
|
assert_match /subject/, json_response['errors'][0]['detail']
|
548
546
|
end
|
549
547
|
|
550
|
-
def
|
548
|
+
def test_create_with_links_to_many_type_ids
|
551
549
|
set_content_type_header!
|
552
550
|
post :create,
|
553
551
|
{
|
@@ -561,7 +559,8 @@ class PostsControllerTest < ActionController::TestCase
|
|
561
559
|
author: {data: {type: 'people', id: '3'}},
|
562
560
|
tags: {data: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]}
|
563
561
|
}
|
564
|
-
}
|
562
|
+
},
|
563
|
+
include: 'author'
|
565
564
|
}
|
566
565
|
|
567
566
|
assert_response :created
|
@@ -571,7 +570,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
571
570
|
assert_equal 'JSONAPIResources is the greatest thing since unsliced bread.', json_response['data']['attributes']['body']
|
572
571
|
end
|
573
572
|
|
574
|
-
def
|
573
|
+
def test_create_with_links_to_many_array
|
575
574
|
set_content_type_header!
|
576
575
|
post :create,
|
577
576
|
{
|
@@ -585,7 +584,8 @@ class PostsControllerTest < ActionController::TestCase
|
|
585
584
|
author: {data: {type: 'people', id: '3'}},
|
586
585
|
tags: {data: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]}
|
587
586
|
}
|
588
|
-
}
|
587
|
+
},
|
588
|
+
include: 'author'
|
589
589
|
}
|
590
590
|
|
591
591
|
assert_response :created
|
@@ -639,7 +639,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
639
639
|
tags: {data: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]}
|
640
640
|
}
|
641
641
|
},
|
642
|
-
include: 'tags'
|
642
|
+
include: 'tags,author,section'
|
643
643
|
}
|
644
644
|
|
645
645
|
assert_response :success
|
@@ -709,7 +709,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
709
709
|
tags: []
|
710
710
|
}
|
711
711
|
},
|
712
|
-
include: 'tags'
|
712
|
+
include: 'tags,author,section'
|
713
713
|
}
|
714
714
|
|
715
715
|
assert_response :success
|
@@ -722,52 +722,52 @@ class PostsControllerTest < ActionController::TestCase
|
|
722
722
|
json_response['data']['relationships']['tags']['data'])
|
723
723
|
end
|
724
724
|
|
725
|
-
def
|
725
|
+
def test_update_relationship_to_one
|
726
726
|
set_content_type_header!
|
727
727
|
ruby = Section.find_by(name: 'ruby')
|
728
728
|
post_object = Post.find(4)
|
729
729
|
assert_not_equal ruby.id, post_object.section_id
|
730
730
|
|
731
|
-
put :
|
731
|
+
put :update_relationship, {post_id: 4, relationship: 'section', data: {type: 'sections', id: "#{ruby.id}"}}
|
732
732
|
|
733
733
|
assert_response :no_content
|
734
734
|
post_object = Post.find(4)
|
735
735
|
assert_equal ruby.id, post_object.section_id
|
736
736
|
end
|
737
737
|
|
738
|
-
def
|
738
|
+
def test_update_relationship_to_one_invalid_links_hash_keys_ids
|
739
739
|
set_content_type_header!
|
740
|
-
put :
|
740
|
+
put :update_relationship, {post_id: 3, relationship: 'section', data: {type: 'sections', ids: 'foo'}}
|
741
741
|
|
742
742
|
assert_response :bad_request
|
743
743
|
assert_match /Invalid Links Object/, response.body
|
744
744
|
end
|
745
745
|
|
746
|
-
def
|
746
|
+
def test_update_relationship_to_one_invalid_links_hash_count
|
747
747
|
set_content_type_header!
|
748
|
-
put :
|
748
|
+
put :update_relationship, {post_id: 3, relationship: 'section', data: {type: 'sections'}}
|
749
749
|
|
750
750
|
assert_response :bad_request
|
751
751
|
assert_match /Invalid Links Object/, response.body
|
752
752
|
end
|
753
753
|
|
754
|
-
def
|
754
|
+
def test_update_relationship_to_many_not_array
|
755
755
|
set_content_type_header!
|
756
|
-
put :
|
756
|
+
put :update_relationship, {post_id: 3, relationship: 'tags', data: {type: 'tags', id: 2}}
|
757
757
|
|
758
758
|
assert_response :bad_request
|
759
759
|
assert_match /Invalid Links Object/, response.body
|
760
760
|
end
|
761
761
|
|
762
|
-
def
|
762
|
+
def test_update_relationship_to_one_invalid_links_hash_keys_type_mismatch
|
763
763
|
set_content_type_header!
|
764
|
-
put :
|
764
|
+
put :update_relationship, {post_id: 3, relationship: 'section', data: {type: 'comment', id: '3'}}
|
765
765
|
|
766
766
|
assert_response :bad_request
|
767
767
|
assert_match /Type Mismatch/, response.body
|
768
768
|
end
|
769
769
|
|
770
|
-
def
|
770
|
+
def test_update_nil_to_many_links
|
771
771
|
set_content_type_header!
|
772
772
|
put :update,
|
773
773
|
{
|
@@ -785,7 +785,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
785
785
|
assert_match /Invalid Links Object/, response.body
|
786
786
|
end
|
787
787
|
|
788
|
-
def
|
788
|
+
def test_update_bad_hash_to_many_links
|
789
789
|
set_content_type_header!
|
790
790
|
put :update,
|
791
791
|
{
|
@@ -803,7 +803,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
803
803
|
assert_match /Invalid Links Object/, response.body
|
804
804
|
end
|
805
805
|
|
806
|
-
def
|
806
|
+
def test_update_other_to_many_links
|
807
807
|
set_content_type_header!
|
808
808
|
put :update,
|
809
809
|
{
|
@@ -821,7 +821,7 @@ class PostsControllerTest < ActionController::TestCase
|
|
821
821
|
assert_match /Invalid Links Object/, response.body
|
822
822
|
end
|
823
823
|
|
824
|
-
def
|
824
|
+
def test_update_other_to_many_links_data_nil
|
825
825
|
set_content_type_header!
|
826
826
|
put :update,
|
827
827
|
{
|
@@ -839,75 +839,75 @@ class PostsControllerTest < ActionController::TestCase
|
|
839
839
|
assert_match /Invalid Links Object/, response.body
|
840
840
|
end
|
841
841
|
|
842
|
-
def
|
842
|
+
def test_update_relationship_to_one_singular_param_id_nil
|
843
843
|
set_content_type_header!
|
844
844
|
ruby = Section.find_by(name: 'ruby')
|
845
845
|
post_object = Post.find(3)
|
846
846
|
post_object.section = ruby
|
847
847
|
post_object.save!
|
848
848
|
|
849
|
-
put :
|
849
|
+
put :update_relationship, {post_id: 3, relationship: 'section', data: {type: 'sections', id: nil}}
|
850
850
|
|
851
851
|
assert_response :no_content
|
852
852
|
assert_equal nil, post_object.reload.section_id
|
853
853
|
end
|
854
854
|
|
855
|
-
def
|
855
|
+
def test_update_relationship_to_one_data_nil
|
856
856
|
set_content_type_header!
|
857
857
|
ruby = Section.find_by(name: 'ruby')
|
858
858
|
post_object = Post.find(3)
|
859
859
|
post_object.section = ruby
|
860
860
|
post_object.save!
|
861
861
|
|
862
|
-
put :
|
862
|
+
put :update_relationship, {post_id: 3, relationship: 'section', data: nil}
|
863
863
|
|
864
864
|
assert_response :no_content
|
865
865
|
assert_equal nil, post_object.reload.section_id
|
866
866
|
end
|
867
867
|
|
868
|
-
def
|
868
|
+
def test_remove_relationship_to_one
|
869
869
|
set_content_type_header!
|
870
870
|
ruby = Section.find_by(name: 'ruby')
|
871
871
|
post_object = Post.find(3)
|
872
872
|
post_object.section_id = ruby.id
|
873
873
|
post_object.save!
|
874
874
|
|
875
|
-
put :
|
875
|
+
put :destroy_relationship, {post_id: 3, relationship: 'section'}
|
876
876
|
|
877
877
|
assert_response :no_content
|
878
878
|
post_object = Post.find(3)
|
879
879
|
assert_equal nil, post_object.section_id
|
880
880
|
end
|
881
881
|
|
882
|
-
def
|
882
|
+
def test_update_relationship_to_one_singular_param
|
883
883
|
set_content_type_header!
|
884
884
|
ruby = Section.find_by(name: 'ruby')
|
885
885
|
post_object = Post.find(3)
|
886
886
|
post_object.section_id = nil
|
887
887
|
post_object.save!
|
888
888
|
|
889
|
-
put :
|
889
|
+
put :update_relationship, {post_id: 3, relationship: 'section', data: {type: 'sections', id: "#{ruby.id}"}}
|
890
890
|
|
891
891
|
assert_response :no_content
|
892
892
|
post_object = Post.find(3)
|
893
893
|
assert_equal ruby.id, post_object.section_id
|
894
894
|
end
|
895
895
|
|
896
|
-
def
|
896
|
+
def test_update_relationship_to_many_join_table_single
|
897
897
|
set_content_type_header!
|
898
|
-
put :
|
898
|
+
put :update_relationship, {post_id: 3, relationship: 'tags', data: []}
|
899
899
|
assert_response :no_content
|
900
900
|
|
901
901
|
post_object = Post.find(3)
|
902
902
|
assert_equal 0, post_object.tags.length
|
903
903
|
|
904
|
-
put :
|
904
|
+
put :update_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'tags', id: 2}]}
|
905
905
|
|
906
906
|
assert_response :no_content
|
907
907
|
post_object = Post.find(3)
|
908
908
|
assert_equal 1, post_object.tags.length
|
909
909
|
|
910
|
-
put :
|
910
|
+
put :update_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'tags', id: 5}]}
|
911
911
|
|
912
912
|
assert_response :no_content
|
913
913
|
post_object = Post.find(3)
|
@@ -916,9 +916,9 @@ class PostsControllerTest < ActionController::TestCase
|
|
916
916
|
assert matches_array? [5], tags
|
917
917
|
end
|
918
918
|
|
919
|
-
def
|
919
|
+
def test_update_relationship_to_many
|
920
920
|
set_content_type_header!
|
921
|
-
put :
|
921
|
+
put :update_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
|
922
922
|
|
923
923
|
assert_response :no_content
|
924
924
|
post_object = Post.find(3)
|
@@ -926,16 +926,16 @@ class PostsControllerTest < ActionController::TestCase
|
|
926
926
|
assert matches_array? [2, 3], post_object.tags.collect { |tag| tag.id }
|
927
927
|
end
|
928
928
|
|
929
|
-
def
|
929
|
+
def test_create_relationship_to_many_join_table
|
930
930
|
set_content_type_header!
|
931
|
-
put :
|
931
|
+
put :update_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
|
932
932
|
|
933
933
|
assert_response :no_content
|
934
934
|
post_object = Post.find(3)
|
935
935
|
assert_equal 2, post_object.tags.collect { |tag| tag.id }.length
|
936
936
|
assert matches_array? [2, 3], post_object.tags.collect { |tag| tag.id }
|
937
937
|
|
938
|
-
post :
|
938
|
+
post :create_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'tags', id: 5}]}
|
939
939
|
|
940
940
|
assert_response :no_content
|
941
941
|
post_object = Post.find(3)
|
@@ -943,103 +943,103 @@ class PostsControllerTest < ActionController::TestCase
|
|
943
943
|
assert matches_array? [2, 3, 5], post_object.tags.collect { |tag| tag.id }
|
944
944
|
end
|
945
945
|
|
946
|
-
def
|
946
|
+
def test_create_relationship_to_many_mismatched_type
|
947
947
|
set_content_type_header!
|
948
|
-
post :
|
948
|
+
post :create_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'comments', id: 5}]}
|
949
949
|
|
950
950
|
assert_response :bad_request
|
951
951
|
assert_match /Type Mismatch/, response.body
|
952
952
|
end
|
953
953
|
|
954
|
-
def
|
954
|
+
def test_create_relationship_to_many_missing_id
|
955
955
|
set_content_type_header!
|
956
|
-
post :
|
956
|
+
post :create_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'tags', idd: 5}]}
|
957
957
|
|
958
958
|
assert_response :bad_request
|
959
959
|
assert_match /Data is not a valid Links Object./, response.body
|
960
960
|
end
|
961
961
|
|
962
|
-
def
|
962
|
+
def test_create_relationship_to_many_not_array
|
963
963
|
set_content_type_header!
|
964
|
-
post :
|
964
|
+
post :create_relationship, {post_id: 3, relationship: 'tags', data: {type: 'tags', id: 5}}
|
965
965
|
|
966
966
|
assert_response :bad_request
|
967
967
|
assert_match /Data is not a valid Links Object./, response.body
|
968
968
|
end
|
969
969
|
|
970
|
-
def
|
970
|
+
def test_create_relationship_to_many_missing_data
|
971
971
|
set_content_type_header!
|
972
|
-
post :
|
972
|
+
post :create_relationship, {post_id: 3, relationship: 'tags'}
|
973
973
|
|
974
974
|
assert_response :bad_request
|
975
975
|
assert_match /The required parameter, data, is missing./, response.body
|
976
976
|
end
|
977
977
|
|
978
|
-
def
|
978
|
+
def test_create_relationship_to_many_join
|
979
979
|
set_content_type_header!
|
980
|
-
post :
|
980
|
+
post :create_relationship, {post_id: 4, relationship: 'tags', data: [{type: 'tags', id: 1}, {type: 'tags', id: 2}, {type: 'tags', id: 3}]}
|
981
981
|
assert_response :no_content
|
982
982
|
end
|
983
983
|
|
984
|
-
def
|
984
|
+
def test_create_relationship_to_many_join_table_record_exists
|
985
985
|
set_content_type_header!
|
986
|
-
put :
|
986
|
+
put :update_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
|
987
987
|
|
988
988
|
assert_response :no_content
|
989
989
|
post_object = Post.find(3)
|
990
990
|
assert_equal 2, post_object.tags.collect { |tag| tag.id }.length
|
991
991
|
assert matches_array? [2, 3], post_object.tags.collect { |tag| tag.id }
|
992
992
|
|
993
|
-
post :
|
993
|
+
post :create_relationship, {post_id: 3, relationship: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 5}]}
|
994
994
|
|
995
995
|
assert_response :bad_request
|
996
996
|
assert_match /The relation to 2 already exists./, response.body
|
997
997
|
end
|
998
998
|
|
999
|
-
def
|
999
|
+
def test_update_relationship_to_many_missing_tags
|
1000
1000
|
set_content_type_header!
|
1001
|
-
put :
|
1001
|
+
put :update_relationship, {post_id: 3, relationship: 'tags'}
|
1002
1002
|
|
1003
1003
|
assert_response :bad_request
|
1004
1004
|
assert_match /The required parameter, data, is missing./, response.body
|
1005
1005
|
end
|
1006
1006
|
|
1007
|
-
def
|
1007
|
+
def test_delete_relationship_to_many
|
1008
1008
|
set_content_type_header!
|
1009
|
-
put :
|
1009
|
+
put :update_relationship, {post_id: 14, relationship: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
|
1010
1010
|
assert_response :no_content
|
1011
1011
|
p = Post.find(14)
|
1012
1012
|
assert_equal [2, 3], p.tag_ids
|
1013
1013
|
|
1014
|
-
delete :
|
1014
|
+
delete :destroy_relationship, {post_id: 14, relationship: 'tags', keys: '3'}
|
1015
1015
|
|
1016
1016
|
p.reload
|
1017
1017
|
assert_response :no_content
|
1018
1018
|
assert_equal [2], p.tag_ids
|
1019
1019
|
end
|
1020
1020
|
|
1021
|
-
def
|
1021
|
+
def test_delete_relationship_to_many_does_not_exist
|
1022
1022
|
set_content_type_header!
|
1023
|
-
put :
|
1023
|
+
put :update_relationship, {post_id: 14, relationship: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
|
1024
1024
|
assert_response :no_content
|
1025
1025
|
p = Post.find(14)
|
1026
1026
|
assert_equal [2, 3], p.tag_ids
|
1027
1027
|
|
1028
|
-
delete :
|
1028
|
+
delete :destroy_relationship, {post_id: 14, relationship: 'tags', keys: '4'}
|
1029
1029
|
|
1030
1030
|
p.reload
|
1031
1031
|
assert_response :not_found
|
1032
1032
|
assert_equal [2, 3], p.tag_ids
|
1033
1033
|
end
|
1034
1034
|
|
1035
|
-
def
|
1035
|
+
def test_delete_relationship_to_many_with_empty_data
|
1036
1036
|
set_content_type_header!
|
1037
|
-
put :
|
1037
|
+
put :update_relationship, {post_id: 14, relationship: 'tags', data: [{type: 'tags', id: 2}, {type: 'tags', id: 3}]}
|
1038
1038
|
assert_response :no_content
|
1039
1039
|
p = Post.find(14)
|
1040
1040
|
assert_equal [2, 3], p.tag_ids
|
1041
1041
|
|
1042
|
-
put :
|
1042
|
+
put :update_relationship, {post_id: 14, relationship: 'tags', data: [] }
|
1043
1043
|
|
1044
1044
|
p.reload
|
1045
1045
|
assert_response :no_content
|
@@ -1246,15 +1246,11 @@ class PostsControllerTest < ActionController::TestCase
|
|
1246
1246
|
|
1247
1247
|
assert_response :success
|
1248
1248
|
assert_equal json_response['data'].size, 2
|
1249
|
-
assert_equal json_response['data'][0]['relationships']['author']['data']['id'], '3'
|
1250
|
-
assert_equal json_response['data'][0]['relationships']['section']['data']['id'], javascript.id.to_s
|
1251
1249
|
assert_equal json_response['data'][0]['attributes']['title'], 'A great new Post QWERTY'
|
1252
1250
|
assert_equal json_response['data'][0]['attributes']['body'], 'AAAA'
|
1253
1251
|
assert matches_array?([{'type' => 'tags', 'id' => '3'}, {'type' => 'tags', 'id' => '4'}],
|
1254
1252
|
json_response['data'][0]['relationships']['tags']['data'])
|
1255
1253
|
|
1256
|
-
assert_equal json_response['data'][1]['relationships']['author']['data']['id'], '3'
|
1257
|
-
assert_equal json_response['data'][1]['relationships']['section']['data']['id'], javascript.id.to_s
|
1258
1254
|
assert_equal json_response['data'][1]['attributes']['title'], 'A great new Post ASDFG'
|
1259
1255
|
assert_equal json_response['data'][1]['attributes']['body'], 'Not First!!!!'
|
1260
1256
|
assert matches_array?([{'type' => 'tags', 'id' => '3'}, {'type' => 'tags', 'id' => '4'}],
|
@@ -1438,8 +1434,8 @@ class PostsControllerTest < ActionController::TestCase
|
|
1438
1434
|
assert_equal initial_count, Post.count
|
1439
1435
|
end
|
1440
1436
|
|
1441
|
-
def
|
1442
|
-
get :
|
1437
|
+
def test_show_to_one_relationship
|
1438
|
+
get :show_relationship, {post_id: '1', relationship: 'author'}
|
1443
1439
|
assert_response :success
|
1444
1440
|
assert_hash_equals json_response,
|
1445
1441
|
{data: {
|
@@ -1453,8 +1449,8 @@ class PostsControllerTest < ActionController::TestCase
|
|
1453
1449
|
}
|
1454
1450
|
end
|
1455
1451
|
|
1456
|
-
def
|
1457
|
-
get :
|
1452
|
+
def test_show_to_many_relationship
|
1453
|
+
get :show_relationship, {post_id: '2', relationship: 'tags'}
|
1458
1454
|
assert_response :success
|
1459
1455
|
assert_hash_equals json_response,
|
1460
1456
|
{
|
@@ -1468,14 +1464,14 @@ class PostsControllerTest < ActionController::TestCase
|
|
1468
1464
|
}
|
1469
1465
|
end
|
1470
1466
|
|
1471
|
-
def
|
1472
|
-
get :
|
1467
|
+
def test_show_to_many_relationship_invalid_id
|
1468
|
+
get :show_relationship, {post_id: '2,1', relationship: 'tags'}
|
1473
1469
|
assert_response :bad_request
|
1474
1470
|
assert_match /2,1 is not a valid value for id/, response.body
|
1475
1471
|
end
|
1476
1472
|
|
1477
|
-
def
|
1478
|
-
get :
|
1473
|
+
def test_show_to_one_relationship_nil
|
1474
|
+
get :show_relationship, {post_id: '17', relationship: 'author'}
|
1479
1475
|
assert_response :success
|
1480
1476
|
assert_hash_equals json_response,
|
1481
1477
|
{
|
@@ -1554,17 +1550,17 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
|
|
1554
1550
|
assert_equal 2, json_response['included'].size
|
1555
1551
|
end
|
1556
1552
|
|
1557
|
-
def
|
1553
|
+
def test_expense_entries_show_bad_include_missing_relationship
|
1558
1554
|
get :show, {id: 1, include: 'isoCurrencies,employees'}
|
1559
1555
|
assert_response :bad_request
|
1560
|
-
assert_match /isoCurrencies is not a valid
|
1561
|
-
assert_match /employees is not a valid
|
1556
|
+
assert_match /isoCurrencies is not a valid relationship of expenseEntries/, json_response['errors'][0]['detail']
|
1557
|
+
assert_match /employees is not a valid relationship of expenseEntries/, json_response['errors'][1]['detail']
|
1562
1558
|
end
|
1563
1559
|
|
1564
|
-
def
|
1560
|
+
def test_expense_entries_show_bad_include_missing_sub_relationship
|
1565
1561
|
get :show, {id: 1, include: 'isoCurrency,employee.post'}
|
1566
1562
|
assert_response :bad_request
|
1567
|
-
assert_match /post is not a valid
|
1563
|
+
assert_match /post is not a valid relationship of people/, json_response['errors'][0]['detail']
|
1568
1564
|
end
|
1569
1565
|
|
1570
1566
|
def test_expense_entries_show_fields
|
@@ -1601,7 +1597,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
|
|
1601
1597
|
iso_currency: {data: {type: 'iso_currencies', id: 'USD'}}
|
1602
1598
|
}
|
1603
1599
|
},
|
1604
|
-
include: 'iso_currency',
|
1600
|
+
include: 'iso_currency,employee',
|
1605
1601
|
fields: {expense_entries: 'id,transaction_date,iso_currency,cost,employee'}
|
1606
1602
|
}
|
1607
1603
|
|
@@ -1632,7 +1628,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
|
|
1632
1628
|
isoCurrency: {data: {type: 'iso_currencies', id: 'USD'}}
|
1633
1629
|
}
|
1634
1630
|
},
|
1635
|
-
include: 'isoCurrency',
|
1631
|
+
include: 'isoCurrency,employee',
|
1636
1632
|
fields: {expenseEntries: 'id,transactionDate,isoCurrency,cost,employee'}
|
1637
1633
|
}
|
1638
1634
|
|
@@ -1663,7 +1659,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
|
|
1663
1659
|
'iso-currency' => {data: {type: 'iso_currencies', id: 'USD'}}
|
1664
1660
|
}
|
1665
1661
|
},
|
1666
|
-
include: 'iso-currency',
|
1662
|
+
include: 'iso-currency,employee',
|
1667
1663
|
fields: {'expense-entries' => 'id,transaction-date,iso-currency,cost,employee'}
|
1668
1664
|
}
|
1669
1665
|
|
@@ -1916,7 +1912,7 @@ class PeopleControllerTest < ActionController::TestCase
|
|
1916
1912
|
def test_get_related_resource
|
1917
1913
|
JSONAPI.configuration.json_key_format = :dasherized_key
|
1918
1914
|
JSONAPI.configuration.route_format = :underscored_key
|
1919
|
-
get :get_related_resource, {post_id: '2',
|
1915
|
+
get :get_related_resource, {post_id: '2', relationship: 'author', source:'posts'}
|
1920
1916
|
assert_response :success
|
1921
1917
|
assert_hash_equals(
|
1922
1918
|
{
|
@@ -1948,18 +1944,13 @@ class PeopleControllerTest < ActionController::TestCase
|
|
1948
1944
|
links: {
|
1949
1945
|
self: 'http://test.host/people/1/relationships/preferences',
|
1950
1946
|
related: 'http://test.host/people/1/preferences'
|
1951
|
-
},
|
1952
|
-
data: {
|
1953
|
-
type: 'preferences',
|
1954
|
-
id: '1'
|
1955
1947
|
}
|
1956
1948
|
},
|
1957
1949
|
"hair-cut" => {
|
1958
1950
|
"links" => {
|
1959
1951
|
"self" => "http://test.host/people/1/relationships/hair_cut",
|
1960
1952
|
"related" => "http://test.host/people/1/hair_cut"
|
1961
|
-
}
|
1962
|
-
"data" => nil
|
1953
|
+
}
|
1963
1954
|
},
|
1964
1955
|
vehicles: {
|
1965
1956
|
links: {
|
@@ -1975,7 +1966,7 @@ class PeopleControllerTest < ActionController::TestCase
|
|
1975
1966
|
end
|
1976
1967
|
|
1977
1968
|
def test_get_related_resource_nil
|
1978
|
-
get :get_related_resource, {post_id: '17',
|
1969
|
+
get :get_related_resource, {post_id: '17', relationship: 'author', source:'posts'}
|
1979
1970
|
assert_response :success
|
1980
1971
|
assert_hash_equals json_response,
|
1981
1972
|
{
|
@@ -2129,7 +2120,7 @@ class Api::V1::PostsControllerTest < ActionController::TestCase
|
|
2129
2120
|
assert_equal 'joe@xyz.fake', json_response['included'][0]['attributes']['email']
|
2130
2121
|
end
|
2131
2122
|
|
2132
|
-
def
|
2123
|
+
def test_index_filter_on_relationship_namespaced
|
2133
2124
|
get :index, {filter: {writer: '1'}}
|
2134
2125
|
assert_response :success
|
2135
2126
|
assert_equal 3, json_response['data'].size
|
@@ -2160,7 +2151,6 @@ class Api::V1::PostsControllerTest < ActionController::TestCase
|
|
2160
2151
|
|
2161
2152
|
assert_response :created
|
2162
2153
|
assert json_response['data'].is_a?(Hash)
|
2163
|
-
assert_equal '3', json_response['data']['relationships']['writer']['data']['id']
|
2164
2154
|
assert_equal 'JR - now with Namespacing', json_response['data']['attributes']['title']
|
2165
2155
|
assert_equal 'JSONAPIResources is the greatest thing since unsliced bread now that it has namespaced resources.',
|
2166
2156
|
json_response['data']['attributes']['body']
|