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
@@ -11,9 +11,11 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
11
11
|
|
12
12
|
JSONAPI.configuration.json_key_format = :camelized_key
|
13
13
|
JSONAPI.configuration.route_format = :camelized_route
|
14
|
+
JSONAPI.configuration.always_include_to_one_linkage_data = false
|
14
15
|
end
|
15
16
|
|
16
17
|
def after_teardown
|
18
|
+
JSONAPI.configuration.always_include_to_one_linkage_data = false
|
17
19
|
JSONAPI.configuration.json_key_format = :underscored_key
|
18
20
|
end
|
19
21
|
|
@@ -42,17 +44,12 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
42
44
|
links: {
|
43
45
|
self: 'http://example.com/posts/1/relationships/section',
|
44
46
|
related: 'http://example.com/posts/1/section'
|
45
|
-
}
|
46
|
-
data: nil
|
47
|
+
}
|
47
48
|
},
|
48
49
|
author: {
|
49
50
|
links: {
|
50
51
|
self: 'http://example.com/posts/1/relationships/author',
|
51
52
|
related: 'http://example.com/posts/1/author'
|
52
|
-
},
|
53
|
-
data: {
|
54
|
-
type: 'people',
|
55
|
-
id: '1'
|
56
53
|
}
|
57
54
|
},
|
58
55
|
tags: {
|
@@ -102,17 +99,12 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
102
99
|
links:{
|
103
100
|
self: 'http://example.com/api/v1/posts/1/relationships/section',
|
104
101
|
related: 'http://example.com/api/v1/posts/1/section'
|
105
|
-
}
|
106
|
-
data: nil
|
102
|
+
}
|
107
103
|
},
|
108
104
|
writer: {
|
109
105
|
links:{
|
110
106
|
self: 'http://example.com/api/v1/posts/1/relationships/writer',
|
111
107
|
related: 'http://example.com/api/v1/posts/1/writer'
|
112
|
-
},
|
113
|
-
data: {
|
114
|
-
type: 'writers',
|
115
|
-
id: '1'
|
116
108
|
}
|
117
109
|
},
|
118
110
|
comments: {
|
@@ -148,10 +140,6 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
148
140
|
links: {
|
149
141
|
self: '/posts/1/relationships/author',
|
150
142
|
related: '/posts/1/author'
|
151
|
-
},
|
152
|
-
data: {
|
153
|
-
type: 'people',
|
154
|
-
id: '1'
|
155
143
|
}
|
156
144
|
}
|
157
145
|
}
|
@@ -186,8 +174,7 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
186
174
|
links: {
|
187
175
|
self: '/posts/1/relationships/section',
|
188
176
|
related: '/posts/1/section'
|
189
|
-
}
|
190
|
-
data: nil
|
177
|
+
}
|
191
178
|
},
|
192
179
|
author: {
|
193
180
|
links: {
|
@@ -242,18 +229,13 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
242
229
|
links: {
|
243
230
|
self: '/people/1/relationships/preferences',
|
244
231
|
related: '/people/1/preferences'
|
245
|
-
},
|
246
|
-
data: {
|
247
|
-
type: 'preferences',
|
248
|
-
id: '1'
|
249
232
|
}
|
250
233
|
},
|
251
234
|
hairCut: {
|
252
235
|
links: {
|
253
236
|
self: "/people/1/relationships/hairCut",
|
254
237
|
related: "/people/1/hairCut"
|
255
|
-
}
|
256
|
-
data: nil
|
238
|
+
}
|
257
239
|
},
|
258
240
|
vehicles: {
|
259
241
|
links: {
|
@@ -294,8 +276,7 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
294
276
|
links: {
|
295
277
|
self: '/posts/1/relationships/section',
|
296
278
|
related: '/posts/1/section'
|
297
|
-
}
|
298
|
-
data: nil
|
279
|
+
}
|
299
280
|
},
|
300
281
|
author: {
|
301
282
|
links: {
|
@@ -350,18 +331,13 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
350
331
|
links: {
|
351
332
|
self: '/people/1/relationships/preferences',
|
352
333
|
related: '/people/1/preferences'
|
353
|
-
},
|
354
|
-
data: {
|
355
|
-
type: 'preferences',
|
356
|
-
id: '1'
|
357
334
|
}
|
358
335
|
},
|
359
336
|
hair_cut: {
|
360
337
|
links: {
|
361
338
|
self: '/people/1/relationships/hairCut',
|
362
339
|
related: '/people/1/hairCut'
|
363
|
-
}
|
364
|
-
data: nil
|
340
|
+
}
|
365
341
|
},
|
366
342
|
vehicles: {
|
367
343
|
links: {
|
@@ -397,17 +373,12 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
397
373
|
links: {
|
398
374
|
self: '/posts/1/relationships/section',
|
399
375
|
related: '/posts/1/section'
|
400
|
-
}
|
401
|
-
data: nil
|
376
|
+
}
|
402
377
|
},
|
403
378
|
author: {
|
404
379
|
links: {
|
405
380
|
self: '/posts/1/relationships/author',
|
406
381
|
related: '/posts/1/author'
|
407
|
-
},
|
408
|
-
data: {
|
409
|
-
type: 'people',
|
410
|
-
id: '1'
|
411
382
|
}
|
412
383
|
},
|
413
384
|
tags: {
|
@@ -497,20 +468,12 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
497
468
|
links: {
|
498
469
|
self: '/comments/1/relationships/author',
|
499
470
|
related: '/comments/1/author'
|
500
|
-
},
|
501
|
-
data: {
|
502
|
-
type: 'people',
|
503
|
-
id: '1'
|
504
471
|
}
|
505
472
|
},
|
506
473
|
post: {
|
507
474
|
links: {
|
508
475
|
self: '/comments/1/relationships/post',
|
509
476
|
related: '/comments/1/post'
|
510
|
-
},
|
511
|
-
data: {
|
512
|
-
type: 'posts',
|
513
|
-
id: '1'
|
514
477
|
}
|
515
478
|
},
|
516
479
|
tags: {
|
@@ -539,20 +502,12 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
539
502
|
links: {
|
540
503
|
self: '/comments/2/relationships/author',
|
541
504
|
related: '/comments/2/author'
|
542
|
-
},
|
543
|
-
data: {
|
544
|
-
type: 'people',
|
545
|
-
id: '2'
|
546
505
|
}
|
547
506
|
},
|
548
507
|
post: {
|
549
508
|
links: {
|
550
509
|
self: '/comments/2/relationships/post',
|
551
510
|
related: '/comments/2/post'
|
552
|
-
},
|
553
|
-
data: {
|
554
|
-
type: 'posts',
|
555
|
-
id: '1'
|
556
511
|
}
|
557
512
|
},
|
558
513
|
tags: {
|
@@ -614,15 +569,13 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
614
569
|
links: {
|
615
570
|
self: "/people/2/relationships/preferences",
|
616
571
|
related: "/people/2/preferences"
|
617
|
-
}
|
618
|
-
data: nil
|
572
|
+
}
|
619
573
|
},
|
620
574
|
hairCut: {
|
621
575
|
links: {
|
622
576
|
self: "/people/2/relationships/hairCut",
|
623
577
|
related: "/people/2/hairCut"
|
624
|
-
}
|
625
|
-
data: nil
|
578
|
+
}
|
626
579
|
},
|
627
580
|
vehicles: {
|
628
581
|
links: {
|
@@ -647,20 +600,12 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
647
600
|
links: {
|
648
601
|
self: '/comments/2/relationships/author',
|
649
602
|
related: '/comments/2/author'
|
650
|
-
},
|
651
|
-
data: {
|
652
|
-
type: 'people',
|
653
|
-
id: '2'
|
654
603
|
}
|
655
604
|
},
|
656
605
|
post: {
|
657
606
|
links: {
|
658
607
|
self: '/comments/2/relationships/post',
|
659
608
|
related: '/comments/2/post'
|
660
|
-
},
|
661
|
-
data: {
|
662
|
-
type: 'posts',
|
663
|
-
id: '1'
|
664
609
|
}
|
665
610
|
},
|
666
611
|
tags: {
|
@@ -685,20 +630,12 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
685
630
|
links: {
|
686
631
|
self: '/comments/3/relationships/author',
|
687
632
|
related: '/comments/3/author'
|
688
|
-
},
|
689
|
-
data: {
|
690
|
-
type: 'people',
|
691
|
-
id: '2'
|
692
633
|
}
|
693
634
|
},
|
694
635
|
post: {
|
695
636
|
links: {
|
696
637
|
self: '/comments/3/relationships/post',
|
697
638
|
related: '/comments/3/post'
|
698
|
-
},
|
699
|
-
data: {
|
700
|
-
type: 'posts',
|
701
|
-
id: '2'
|
702
639
|
}
|
703
640
|
},
|
704
641
|
tags: {
|
@@ -715,13 +652,15 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
715
652
|
)
|
716
653
|
end
|
717
654
|
|
718
|
-
def
|
655
|
+
def test_serializer_array_of_resources_always_include_to_one_linkage_data
|
719
656
|
|
720
657
|
posts = []
|
721
658
|
Post.find(1, 2).each do |post|
|
722
659
|
posts.push PostResource.new(post)
|
723
660
|
end
|
724
661
|
|
662
|
+
JSONAPI.configuration.always_include_to_one_linkage_data = true
|
663
|
+
|
725
664
|
assert_hash_equals(
|
726
665
|
{
|
727
666
|
data: [
|
@@ -1025,6 +964,282 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
1025
964
|
JSONAPI::ResourceSerializer.new(PostResource,
|
1026
965
|
include: ['comments', 'comments.tags']).serialize_to_hash(posts)
|
1027
966
|
)
|
967
|
+
JSONAPI.configuration.always_include_to_one_linkage_data = false
|
968
|
+
end
|
969
|
+
|
970
|
+
def test_serializer_array_of_resources
|
971
|
+
|
972
|
+
posts = []
|
973
|
+
Post.find(1, 2).each do |post|
|
974
|
+
posts.push PostResource.new(post)
|
975
|
+
end
|
976
|
+
|
977
|
+
assert_hash_equals(
|
978
|
+
{
|
979
|
+
data: [
|
980
|
+
{
|
981
|
+
type: 'posts',
|
982
|
+
id: '1',
|
983
|
+
attributes: {
|
984
|
+
title: 'New post',
|
985
|
+
body: 'A body!!!',
|
986
|
+
subject: 'New post'
|
987
|
+
},
|
988
|
+
links: {
|
989
|
+
self: '/posts/1'
|
990
|
+
},
|
991
|
+
relationships: {
|
992
|
+
section: {
|
993
|
+
links: {
|
994
|
+
self: '/posts/1/relationships/section',
|
995
|
+
related: '/posts/1/section'
|
996
|
+
}
|
997
|
+
},
|
998
|
+
author: {
|
999
|
+
links: {
|
1000
|
+
self: '/posts/1/relationships/author',
|
1001
|
+
related: '/posts/1/author'
|
1002
|
+
}
|
1003
|
+
},
|
1004
|
+
tags: {
|
1005
|
+
links: {
|
1006
|
+
self: '/posts/1/relationships/tags',
|
1007
|
+
related: '/posts/1/tags'
|
1008
|
+
}
|
1009
|
+
},
|
1010
|
+
comments: {
|
1011
|
+
links: {
|
1012
|
+
self: '/posts/1/relationships/comments',
|
1013
|
+
related: '/posts/1/comments'
|
1014
|
+
},
|
1015
|
+
data: [
|
1016
|
+
{type: 'comments', id: '1'},
|
1017
|
+
{type: 'comments', id: '2'}
|
1018
|
+
]
|
1019
|
+
}
|
1020
|
+
}
|
1021
|
+
},
|
1022
|
+
{
|
1023
|
+
type: 'posts',
|
1024
|
+
id: '2',
|
1025
|
+
attributes: {
|
1026
|
+
title: 'JR Solves your serialization woes!',
|
1027
|
+
body: 'Use JR',
|
1028
|
+
subject: 'JR Solves your serialization woes!'
|
1029
|
+
},
|
1030
|
+
links: {
|
1031
|
+
self: '/posts/2'
|
1032
|
+
},
|
1033
|
+
relationships: {
|
1034
|
+
section: {
|
1035
|
+
links: {
|
1036
|
+
self: '/posts/2/relationships/section',
|
1037
|
+
related: '/posts/2/section'
|
1038
|
+
}
|
1039
|
+
},
|
1040
|
+
author: {
|
1041
|
+
links: {
|
1042
|
+
self: '/posts/2/relationships/author',
|
1043
|
+
related: '/posts/2/author'
|
1044
|
+
}
|
1045
|
+
},
|
1046
|
+
tags: {
|
1047
|
+
links: {
|
1048
|
+
self: '/posts/2/relationships/tags',
|
1049
|
+
related: '/posts/2/tags'
|
1050
|
+
}
|
1051
|
+
},
|
1052
|
+
comments: {
|
1053
|
+
links: {
|
1054
|
+
self: '/posts/2/relationships/comments',
|
1055
|
+
related: '/posts/2/comments'
|
1056
|
+
},
|
1057
|
+
data: [
|
1058
|
+
{type: 'comments', id: '3'}
|
1059
|
+
]
|
1060
|
+
}
|
1061
|
+
}
|
1062
|
+
}
|
1063
|
+
],
|
1064
|
+
included: [
|
1065
|
+
{
|
1066
|
+
type: 'tags',
|
1067
|
+
id: '1',
|
1068
|
+
attributes: {
|
1069
|
+
name: 'short'
|
1070
|
+
},
|
1071
|
+
links: {
|
1072
|
+
self: '/tags/1'
|
1073
|
+
},
|
1074
|
+
relationships: {
|
1075
|
+
posts: {
|
1076
|
+
links: {
|
1077
|
+
self: '/tags/1/relationships/posts',
|
1078
|
+
related: '/tags/1/posts'
|
1079
|
+
}
|
1080
|
+
}
|
1081
|
+
}
|
1082
|
+
},
|
1083
|
+
{
|
1084
|
+
type: 'tags',
|
1085
|
+
id: '2',
|
1086
|
+
attributes: {
|
1087
|
+
name: 'whiny'
|
1088
|
+
},
|
1089
|
+
links: {
|
1090
|
+
self: '/tags/2'
|
1091
|
+
},
|
1092
|
+
relationships: {
|
1093
|
+
posts: {
|
1094
|
+
links: {
|
1095
|
+
self: '/tags/2/relationships/posts',
|
1096
|
+
related: '/tags/2/posts'
|
1097
|
+
}
|
1098
|
+
}
|
1099
|
+
}
|
1100
|
+
},
|
1101
|
+
{
|
1102
|
+
type: 'tags',
|
1103
|
+
id: '4',
|
1104
|
+
attributes: {
|
1105
|
+
name: 'happy'
|
1106
|
+
},
|
1107
|
+
links: {
|
1108
|
+
self: '/tags/4'
|
1109
|
+
},
|
1110
|
+
relationships: {
|
1111
|
+
posts: {
|
1112
|
+
links: {
|
1113
|
+
self: '/tags/4/relationships/posts',
|
1114
|
+
related: '/tags/4/posts'
|
1115
|
+
}
|
1116
|
+
}
|
1117
|
+
}
|
1118
|
+
},
|
1119
|
+
{
|
1120
|
+
type: 'tags',
|
1121
|
+
id: '5',
|
1122
|
+
attributes: {
|
1123
|
+
name: 'JR'
|
1124
|
+
},
|
1125
|
+
links: {
|
1126
|
+
self: '/tags/5'
|
1127
|
+
},
|
1128
|
+
relationships: {
|
1129
|
+
posts: {
|
1130
|
+
links: {
|
1131
|
+
self: '/tags/5/relationships/posts',
|
1132
|
+
related: '/tags/5/posts'
|
1133
|
+
}
|
1134
|
+
}
|
1135
|
+
}
|
1136
|
+
},
|
1137
|
+
{
|
1138
|
+
type: 'comments',
|
1139
|
+
id: '1',
|
1140
|
+
attributes: {
|
1141
|
+
body: 'what a dumb post'
|
1142
|
+
},
|
1143
|
+
links: {
|
1144
|
+
self: '/comments/1'
|
1145
|
+
},
|
1146
|
+
relationships: {
|
1147
|
+
author: {
|
1148
|
+
links: {
|
1149
|
+
self: '/comments/1/relationships/author',
|
1150
|
+
related: '/comments/1/author'
|
1151
|
+
}
|
1152
|
+
},
|
1153
|
+
post: {
|
1154
|
+
links: {
|
1155
|
+
self: '/comments/1/relationships/post',
|
1156
|
+
related: '/comments/1/post'
|
1157
|
+
}
|
1158
|
+
},
|
1159
|
+
tags: {
|
1160
|
+
links: {
|
1161
|
+
self: '/comments/1/relationships/tags',
|
1162
|
+
related: '/comments/1/tags'
|
1163
|
+
},
|
1164
|
+
data: [
|
1165
|
+
{type: 'tags', id: '1'},
|
1166
|
+
{type: 'tags', id: '2'}
|
1167
|
+
]
|
1168
|
+
}
|
1169
|
+
}
|
1170
|
+
},
|
1171
|
+
{
|
1172
|
+
type: 'comments',
|
1173
|
+
id: '2',
|
1174
|
+
attributes: {
|
1175
|
+
body: 'i liked it'
|
1176
|
+
},
|
1177
|
+
links: {
|
1178
|
+
self: '/comments/2'
|
1179
|
+
},
|
1180
|
+
relationships: {
|
1181
|
+
author: {
|
1182
|
+
links: {
|
1183
|
+
self: '/comments/2/relationships/author',
|
1184
|
+
related: '/comments/2/author'
|
1185
|
+
}
|
1186
|
+
},
|
1187
|
+
post: {
|
1188
|
+
links: {
|
1189
|
+
self: '/comments/2/relationships/post',
|
1190
|
+
related: '/comments/2/post'
|
1191
|
+
}
|
1192
|
+
},
|
1193
|
+
tags: {
|
1194
|
+
links: {
|
1195
|
+
self: '/comments/2/relationships/tags',
|
1196
|
+
related: '/comments/2/tags'
|
1197
|
+
},
|
1198
|
+
data: [
|
1199
|
+
{type: 'tags', id: '4'},
|
1200
|
+
{type: 'tags', id: '1'}
|
1201
|
+
]
|
1202
|
+
}
|
1203
|
+
}
|
1204
|
+
},
|
1205
|
+
{
|
1206
|
+
type: 'comments',
|
1207
|
+
id: '3',
|
1208
|
+
attributes: {
|
1209
|
+
body: 'Thanks man. Great post. But what is JR?'
|
1210
|
+
},
|
1211
|
+
links: {
|
1212
|
+
self: '/comments/3'
|
1213
|
+
},
|
1214
|
+
relationships: {
|
1215
|
+
author: {
|
1216
|
+
links: {
|
1217
|
+
self: '/comments/3/relationships/author',
|
1218
|
+
related: '/comments/3/author'
|
1219
|
+
}
|
1220
|
+
},
|
1221
|
+
post: {
|
1222
|
+
links: {
|
1223
|
+
self: '/comments/3/relationships/post',
|
1224
|
+
related: '/comments/3/post'
|
1225
|
+
}
|
1226
|
+
},
|
1227
|
+
tags: {
|
1228
|
+
links: {
|
1229
|
+
self: '/comments/3/relationships/tags',
|
1230
|
+
related: '/comments/3/tags'
|
1231
|
+
},
|
1232
|
+
data: [
|
1233
|
+
{type: 'tags', id: '5'}
|
1234
|
+
]
|
1235
|
+
}
|
1236
|
+
}
|
1237
|
+
}
|
1238
|
+
]
|
1239
|
+
},
|
1240
|
+
JSONAPI::ResourceSerializer.new(PostResource,
|
1241
|
+
include: ['comments', 'comments.tags']).serialize_to_hash(posts)
|
1242
|
+
)
|
1028
1243
|
end
|
1029
1244
|
|
1030
1245
|
def test_serializer_array_of_resources_limited_fields
|
@@ -1141,10 +1356,6 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
1141
1356
|
links: {
|
1142
1357
|
self: '/comments/1/relationships/post',
|
1143
1358
|
related: '/comments/1/post'
|
1144
|
-
},
|
1145
|
-
data: {
|
1146
|
-
type: 'posts',
|
1147
|
-
id: '1'
|
1148
1359
|
}
|
1149
1360
|
}
|
1150
1361
|
}
|
@@ -1163,10 +1374,6 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
1163
1374
|
links: {
|
1164
1375
|
self: '/comments/2/relationships/post',
|
1165
1376
|
related: '/comments/2/post'
|
1166
|
-
},
|
1167
|
-
data: {
|
1168
|
-
type: 'posts',
|
1169
|
-
id: '1'
|
1170
1377
|
}
|
1171
1378
|
}
|
1172
1379
|
}
|
@@ -1185,10 +1392,6 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
1185
1392
|
links: {
|
1186
1393
|
self: '/comments/3/relationships/post',
|
1187
1394
|
related: '/comments/3/post'
|
1188
|
-
},
|
1189
|
-
data: {
|
1190
|
-
type: 'posts',
|
1191
|
-
id: '2'
|
1192
1395
|
}
|
1193
1396
|
}
|
1194
1397
|
}
|
@@ -1300,8 +1503,7 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
1300
1503
|
links: {
|
1301
1504
|
self: '/planets/8/relationships/planetType',
|
1302
1505
|
related: '/planets/8/planetType'
|
1303
|
-
}
|
1304
|
-
data: nil
|
1506
|
+
}
|
1305
1507
|
},
|
1306
1508
|
tags: {
|
1307
1509
|
links: {
|
@@ -1436,8 +1638,7 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
1436
1638
|
links: {
|
1437
1639
|
self: '/preferences/1/relationships/author',
|
1438
1640
|
related: '/preferences/1/author'
|
1439
|
-
}
|
1440
|
-
data: nil
|
1641
|
+
}
|
1441
1642
|
},
|
1442
1643
|
friends: {
|
1443
1644
|
links: {
|
@@ -1481,4 +1682,54 @@ class SerializerTest < ActionDispatch::IntegrationTest
|
|
1481
1682
|
JSONAPI::ResourceSerializer.new(FactResource).serialize_to_hash(facts)
|
1482
1683
|
)
|
1483
1684
|
end
|
1685
|
+
|
1686
|
+
def test_serializer_to_one
|
1687
|
+
serialized = JSONAPI::ResourceSerializer.new(
|
1688
|
+
Api::V5::AuthorResource,
|
1689
|
+
include: ['author_detail']
|
1690
|
+
).serialize_to_hash(Api::V5::AuthorResource.new(Person.find(1)))
|
1691
|
+
|
1692
|
+
assert_hash_equals(
|
1693
|
+
{
|
1694
|
+
data: {
|
1695
|
+
type: 'authors',
|
1696
|
+
id: '1',
|
1697
|
+
attributes: {
|
1698
|
+
name: 'Joe Author',
|
1699
|
+
},
|
1700
|
+
links: {
|
1701
|
+
self: '/api/v5/authors/1'
|
1702
|
+
},
|
1703
|
+
relationships: {
|
1704
|
+
posts: {
|
1705
|
+
links: {
|
1706
|
+
self: '/api/v5/authors/1/relationships/posts',
|
1707
|
+
related: '/api/v5/authors/1/posts'
|
1708
|
+
}
|
1709
|
+
},
|
1710
|
+
authorDetail: {
|
1711
|
+
links: {
|
1712
|
+
self: '/api/v5/authors/1/relationships/authorDetail',
|
1713
|
+
related: '/api/v5/authors/1/authorDetail'
|
1714
|
+
},
|
1715
|
+
data: {type: 'authorDetails', id: '1'}
|
1716
|
+
}
|
1717
|
+
}
|
1718
|
+
},
|
1719
|
+
included: [
|
1720
|
+
{
|
1721
|
+
type: 'authorDetails',
|
1722
|
+
id: '1',
|
1723
|
+
attributes: {
|
1724
|
+
authorStuff: 'blah blah'
|
1725
|
+
},
|
1726
|
+
links: {
|
1727
|
+
self: '/api/v5/authorDetails/1'
|
1728
|
+
}
|
1729
|
+
}
|
1730
|
+
]
|
1731
|
+
},
|
1732
|
+
serialized
|
1733
|
+
)
|
1734
|
+
end
|
1484
1735
|
end
|