cheap_ams 0.10.0.rc2

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 (97) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.travis.yml +26 -0
  4. data/CHANGELOG.md +13 -0
  5. data/CONTRIBUTING.md +31 -0
  6. data/Gemfile +35 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +348 -0
  9. data/Rakefile +12 -0
  10. data/appveyor.yml +25 -0
  11. data/cheap_ams.gemspec +49 -0
  12. data/docs/README.md +27 -0
  13. data/docs/general/adapters.md +51 -0
  14. data/docs/general/getting_started.md +73 -0
  15. data/docs/howto/add_pagination_links.md +112 -0
  16. data/docs/howto/add_root_key.md +51 -0
  17. data/lib/action_controller/serialization.rb +62 -0
  18. data/lib/active_model/serializable_resource.rb +84 -0
  19. data/lib/active_model/serializer/adapter/flatten_json.rb +19 -0
  20. data/lib/active_model/serializer/adapter/fragment_cache.rb +82 -0
  21. data/lib/active_model/serializer/adapter/json/fragment_cache.rb +16 -0
  22. data/lib/active_model/serializer/adapter/json.rb +53 -0
  23. data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +24 -0
  24. data/lib/active_model/serializer/adapter/json_api/pagination_links.rb +58 -0
  25. data/lib/active_model/serializer/adapter/json_api.rb +183 -0
  26. data/lib/active_model/serializer/adapter/null.rb +11 -0
  27. data/lib/active_model/serializer/adapter.rb +98 -0
  28. data/lib/active_model/serializer/array_serializer.rb +35 -0
  29. data/lib/active_model/serializer/association.rb +21 -0
  30. data/lib/active_model/serializer/associations.rb +97 -0
  31. data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
  32. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  33. data/lib/active_model/serializer/configuration.rb +14 -0
  34. data/lib/active_model/serializer/fieldset.rb +42 -0
  35. data/lib/active_model/serializer/has_many_reflection.rb +10 -0
  36. data/lib/active_model/serializer/has_one_reflection.rb +10 -0
  37. data/lib/active_model/serializer/lint.rb +131 -0
  38. data/lib/active_model/serializer/railtie.rb +9 -0
  39. data/lib/active_model/serializer/reflection.rb +74 -0
  40. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  41. data/lib/active_model/serializer/version.rb +5 -0
  42. data/lib/active_model/serializer.rb +205 -0
  43. data/lib/active_model_serializers.rb +29 -0
  44. data/lib/generators/serializer/USAGE +6 -0
  45. data/lib/generators/serializer/resource_override.rb +12 -0
  46. data/lib/generators/serializer/serializer_generator.rb +37 -0
  47. data/lib/generators/serializer/templates/serializer.rb +8 -0
  48. data/test/action_controller/adapter_selector_test.rb +53 -0
  49. data/test/action_controller/explicit_serializer_test.rb +134 -0
  50. data/test/action_controller/json_api/linked_test.rb +180 -0
  51. data/test/action_controller/json_api/pagination_test.rb +116 -0
  52. data/test/action_controller/serialization_scope_name_test.rb +67 -0
  53. data/test/action_controller/serialization_test.rb +426 -0
  54. data/test/adapter/fragment_cache_test.rb +37 -0
  55. data/test/adapter/json/belongs_to_test.rb +47 -0
  56. data/test/adapter/json/collection_test.rb +82 -0
  57. data/test/adapter/json/has_many_test.rb +47 -0
  58. data/test/adapter/json_api/belongs_to_test.rb +157 -0
  59. data/test/adapter/json_api/collection_test.rb +96 -0
  60. data/test/adapter/json_api/has_many_embed_ids_test.rb +45 -0
  61. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
  62. data/test/adapter/json_api/has_many_test.rb +145 -0
  63. data/test/adapter/json_api/has_one_test.rb +81 -0
  64. data/test/adapter/json_api/json_api_test.rb +38 -0
  65. data/test/adapter/json_api/linked_test.rb +283 -0
  66. data/test/adapter/json_api/pagination_links_test.rb +115 -0
  67. data/test/adapter/json_api/resource_type_config_test.rb +59 -0
  68. data/test/adapter/json_test.rb +47 -0
  69. data/test/adapter/null_test.rb +25 -0
  70. data/test/adapter_test.rb +52 -0
  71. data/test/array_serializer_test.rb +97 -0
  72. data/test/capture_warnings.rb +57 -0
  73. data/test/fixtures/active_record.rb +57 -0
  74. data/test/fixtures/poro.rb +266 -0
  75. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  76. data/test/generators/serializer_generator_test.rb +56 -0
  77. data/test/lint_test.rb +44 -0
  78. data/test/poro_test.rb +9 -0
  79. data/test/serializable_resource_test.rb +27 -0
  80. data/test/serializers/adapter_for_test.rb +50 -0
  81. data/test/serializers/association_macros_test.rb +36 -0
  82. data/test/serializers/associations_test.rb +150 -0
  83. data/test/serializers/attribute_test.rb +62 -0
  84. data/test/serializers/attributes_test.rb +63 -0
  85. data/test/serializers/cache_test.rb +164 -0
  86. data/test/serializers/configuration_test.rb +15 -0
  87. data/test/serializers/fieldset_test.rb +26 -0
  88. data/test/serializers/meta_test.rb +121 -0
  89. data/test/serializers/options_test.rb +21 -0
  90. data/test/serializers/root_test.rb +23 -0
  91. data/test/serializers/serializer_for_test.rb +65 -0
  92. data/test/serializers/urls_test.rb +26 -0
  93. data/test/support/rails_app.rb +21 -0
  94. data/test/support/stream_capture.rb +49 -0
  95. data/test/support/test_case.rb +5 -0
  96. data/test/test_helper.rb +41 -0
  97. metadata +287 -0
@@ -0,0 +1,157 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class BelongsToTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @author.bio = nil
11
+ @author.roles = []
12
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
13
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
14
+ @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
15
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
16
+ @post.comments = [@comment]
17
+ @post.blog = @blog
18
+ @anonymous_post.comments = []
19
+ @anonymous_post.blog = nil
20
+ @comment.post = @post
21
+ @comment.author = nil
22
+ @post.author = @author
23
+ @anonymous_post.author = nil
24
+ @blog = Blog.new(id: 1, name: "My Blog!!")
25
+ @blog.writer = @author
26
+ @blog.articles = [@post, @anonymous_post]
27
+ @author.posts = []
28
+
29
+ @serializer = CommentSerializer.new(@comment)
30
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
31
+ ActionController::Base.cache_store.clear
32
+ end
33
+
34
+ def test_includes_post_id
35
+ expected = { data: { type: "posts", id: "42" } }
36
+
37
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:post])
38
+ end
39
+
40
+ def test_includes_linked_post
41
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'post')
42
+ expected = [{
43
+ id: "42",
44
+ type: "posts",
45
+ attributes: {
46
+ title: 'New Post',
47
+ body: 'Body',
48
+ },
49
+ relationships: {
50
+ comments: { data: [ { type: "comments", id: "1" } ] },
51
+ blog: { data: { type: "blogs", id: "999" } },
52
+ author: { data: { type: "authors", id: "1" } }
53
+ }
54
+ }]
55
+ assert_equal expected, @adapter.serializable_hash[:included]
56
+ end
57
+
58
+ def test_limiting_linked_post_fields
59
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'post', fields: {post: [:title]})
60
+ expected = [{
61
+ id: "42",
62
+ type: "posts",
63
+ attributes: {
64
+ title: 'New Post'
65
+ },
66
+ relationships: {
67
+ comments: { data: [ { type: "comments", id: "1" } ] },
68
+ blog: { data: { type: "blogs", id: "999" } },
69
+ author: { data: { type: "authors", id: "1" } }
70
+ }
71
+ }]
72
+ assert_equal expected, @adapter.serializable_hash[:included]
73
+ end
74
+
75
+ def test_include_nil_author
76
+ serializer = PostSerializer.new(@anonymous_post)
77
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
78
+
79
+ assert_equal({comments: { data: [] }, blog: { data: { type: "blogs", id: "999" } }, author: { data: nil }}, adapter.serializable_hash[:data][:relationships])
80
+ end
81
+
82
+ def test_include_type_for_association_when_different_than_name
83
+ serializer = BlogSerializer.new(@blog)
84
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
85
+ relationships = adapter.serializable_hash[:data][:relationships]
86
+ expected = {
87
+ writer: {
88
+ data: {
89
+ type: "authors",
90
+ id: "1"
91
+ }
92
+ },
93
+ articles: {
94
+ data: [
95
+ {
96
+ type: "posts",
97
+ id: "42"
98
+ },
99
+ {
100
+ type: "posts",
101
+ id: "43"
102
+ }
103
+ ]
104
+ }
105
+ }
106
+ assert_equal expected, relationships
107
+ end
108
+
109
+ def test_include_linked_resources_with_type_name
110
+ serializer = BlogSerializer.new(@blog)
111
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer, include: ['writer', 'articles'])
112
+ linked = adapter.serializable_hash[:included]
113
+ expected = [
114
+ {
115
+ id: "1",
116
+ type: "authors",
117
+ attributes: {
118
+ name: "Steve K."
119
+ },
120
+ relationships: {
121
+ posts: { data: [] },
122
+ roles: { data: [] },
123
+ bio: { data: nil }
124
+ }
125
+ },{
126
+ id: "42",
127
+ type: "posts",
128
+ attributes: {
129
+ title: "New Post",
130
+ body: "Body"
131
+ },
132
+ relationships: {
133
+ comments: { data: [ { type: "comments", id: "1" } ] },
134
+ blog: { data: { type: "blogs", id: "999" } },
135
+ author: { data: { type: "authors", id: "1" } }
136
+ }
137
+ }, {
138
+ id: "43",
139
+ type: "posts",
140
+ attributes: {
141
+ title: "Hello!!",
142
+ body: "Hello, world!!"
143
+ },
144
+ relationships: {
145
+ comments: { data: [] },
146
+ blog: { data: { type: "blogs", id: "999" } },
147
+ author: { data: nil }
148
+ }
149
+ }
150
+ ]
151
+ assert_equal expected, linked
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,96 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class CollectionTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @author.bio = nil
11
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
12
+ @first_post = Post.new(id: 1, title: 'Hello!!', body: 'Hello, world!!')
13
+ @second_post = Post.new(id: 2, title: 'New Post', body: 'Body')
14
+ @first_post.comments = []
15
+ @second_post.comments = []
16
+ @first_post.blog = @blog
17
+ @second_post.blog = nil
18
+ @first_post.author = @author
19
+ @second_post.author = @author
20
+ @author.posts = [@first_post, @second_post]
21
+
22
+ @serializer = ArraySerializer.new([@first_post, @second_post])
23
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
24
+ ActionController::Base.cache_store.clear
25
+ end
26
+
27
+ def test_include_multiple_posts
28
+ expected = [
29
+ {
30
+ id: "1",
31
+ type: "posts",
32
+ attributes: {
33
+ title: "Hello!!",
34
+ body: "Hello, world!!"
35
+ },
36
+ relationships: {
37
+ comments: { data: [] },
38
+ blog: { data: { type: "blogs", id: "999" } },
39
+ author: { data: { type: "authors", id: "1" } }
40
+ }
41
+ },
42
+ {
43
+ id: "2",
44
+ type: "posts",
45
+ attributes: {
46
+ title: "New Post",
47
+ body: "Body"
48
+ },
49
+ relationships: {
50
+ comments: { data: [] },
51
+ blog: { data: { type: "blogs", id: "999" } },
52
+ author: { data: { type: "authors", id: "1" } }
53
+ }
54
+ }
55
+ ]
56
+
57
+ assert_equal(expected, @adapter.serializable_hash[:data])
58
+ end
59
+
60
+ def test_limiting_fields
61
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, fields: ['title'])
62
+
63
+ expected = [
64
+ {
65
+ id: "1",
66
+ type: "posts",
67
+ attributes: {
68
+ title: "Hello!!"
69
+ },
70
+ relationships: {
71
+ comments: { data: [] },
72
+ blog: { data: { type: "blogs", id: "999" } },
73
+ author: { data: { type: "authors", id: "1" } }
74
+ }
75
+ },
76
+ {
77
+ id: "2",
78
+ type: "posts",
79
+ attributes: {
80
+ title: "New Post"
81
+ },
82
+ relationships: {
83
+ comments: { data: [] },
84
+ blog: { data: { type: "blogs", id: "999" } },
85
+ author: { data: { type: "authors", id: "1" } }
86
+ }
87
+ }
88
+ ]
89
+ assert_equal(expected, @adapter.serializable_hash[:data])
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class HasManyEmbedIdsTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(name: 'Steve K.')
10
+ @author.bio = nil
11
+ @author.roles = nil
12
+ @first_post = Post.new(id: 1, title: 'Hello!!', body: 'Hello, world!!')
13
+ @second_post = Post.new(id: 2, title: 'New Post', body: 'Body')
14
+ @author.posts = [@first_post, @second_post]
15
+ @first_post.author = @author
16
+ @second_post.author = @author
17
+ @first_post.comments = []
18
+ @second_post.comments = []
19
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
20
+ @first_post.blog = @blog
21
+ @second_post.blog = nil
22
+
23
+ @serializer = AuthorSerializer.new(@author)
24
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
25
+ end
26
+
27
+ def test_includes_comment_ids
28
+ expected = {
29
+ data: [
30
+ { type: "posts", id: "1"},
31
+ { type: "posts", id: "2"}
32
+ ]
33
+ }
34
+
35
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:posts])
36
+ end
37
+
38
+ def test_no_includes_linked_comments
39
+ assert_nil @adapter.serializable_hash[:linked]
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,98 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ # Test 'has_many :assocs, serializer: AssocXSerializer'
8
+ class HasManyExplicitSerializerTest < Minitest::Test
9
+ def setup
10
+ @post = Post.new(title: 'New Post', body: 'Body')
11
+ @author = Author.new(name: 'Jane Blogger')
12
+ @author.posts = [@post]
13
+ @post.author = @author
14
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
15
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
16
+ @post.comments = [@first_comment, @second_comment]
17
+ @first_comment.post = @post
18
+ @first_comment.author = nil
19
+ @second_comment.post = @post
20
+ @second_comment.author = nil
21
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
22
+ @post.blog = @blog
23
+
24
+ @serializer = PostPreviewSerializer.new(@post)
25
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
26
+ @serializer,
27
+ include: ['comments', 'author']
28
+ )
29
+ end
30
+
31
+ def test_includes_comment_ids
32
+ expected = {
33
+ data: [
34
+ { type: 'comments', id: '1' },
35
+ { type: 'comments', id: '2' }
36
+ ]
37
+ }
38
+
39
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
40
+ end
41
+
42
+ def test_includes_linked_data
43
+ # If CommentPreviewSerializer is applied correctly the body text will not be present in the output
44
+ expected = [
45
+ {
46
+ id: '1',
47
+ type: 'comments',
48
+ relationships: {
49
+ post: { data: { type: 'posts', id: @post.id.to_s } }
50
+ }
51
+ },
52
+ {
53
+ id: '2',
54
+ type: 'comments',
55
+ relationships: {
56
+ post: { data: { type: 'posts', id: @post.id.to_s } }
57
+ }
58
+ },
59
+ {
60
+ id: @author.id.to_s,
61
+ type: "authors",
62
+ relationships: {
63
+ posts: { data: [ {type: "posts", id: @post.id.to_s } ] }
64
+ }
65
+ }
66
+ ]
67
+
68
+ assert_equal(expected, @adapter.serializable_hash[:included])
69
+ end
70
+
71
+ def test_includes_author_id
72
+ expected = {
73
+ data: { type: "authors", id: @author.id.to_s }
74
+ }
75
+
76
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:author])
77
+ end
78
+
79
+ def test_explicit_serializer_with_null_resource
80
+ @post.author = nil
81
+
82
+ expected = { data: nil }
83
+
84
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:author])
85
+ end
86
+
87
+ def test_explicit_serializer_with_null_collection
88
+ @post.comments = []
89
+
90
+ expected = { data: [] }
91
+
92
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,145 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class HasManyTest < Minitest::Test
8
+ def setup
9
+ ActionController::Base.cache_store.clear
10
+ @author = Author.new(id: 1, name: 'Steve K.')
11
+ @author.posts = []
12
+ @author.bio = nil
13
+ @post = Post.new(id: 1, title: 'New Post', body: 'Body')
14
+ @post_without_comments = Post.new(id: 2, title: 'Second Post', body: 'Second')
15
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
16
+ @first_comment.author = nil
17
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
18
+ @second_comment.author = nil
19
+ @post.comments = [@first_comment, @second_comment]
20
+ @post_without_comments.comments = []
21
+ @first_comment.post = @post
22
+ @second_comment.post = @post
23
+ @post.author = @author
24
+ @post_without_comments.author = nil
25
+ @blog = Blog.new(id: 1, name: "My Blog!!")
26
+ @blog.writer = @author
27
+ @blog.articles = [@post]
28
+ @post.blog = @blog
29
+ @post_without_comments.blog = nil
30
+ @tag = Tag.new(id: 1, name: "#hash_tag")
31
+ @post.tags = [@tag]
32
+ @serializer = PostSerializer.new(@post)
33
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
34
+
35
+ @virtual_value = VirtualValue.new(id: 1)
36
+ end
37
+
38
+ def test_includes_comment_ids
39
+ expected = { data: [ { type: "comments", id: "1" }, { type: "comments", id: "2" } ] }
40
+
41
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
42
+ end
43
+
44
+ def test_includes_linked_comments
45
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'comments')
46
+ expected = [{
47
+ id: "1",
48
+ type: "comments",
49
+ attributes: {
50
+ body: 'ZOMG A COMMENT'
51
+ },
52
+ relationships: {
53
+ post: { data: { type: "posts", id: "1" } },
54
+ author: { data: nil }
55
+ }
56
+ }, {
57
+ id: "2",
58
+ type: "comments",
59
+ attributes: {
60
+ body: 'ZOMG ANOTHER COMMENT'
61
+ },
62
+ relationships: {
63
+ post: { data: { type: "posts", id: "1" } },
64
+ author: { data: nil }
65
+ }
66
+ }]
67
+ assert_equal expected, @adapter.serializable_hash[:included]
68
+ end
69
+
70
+ def test_limit_fields_of_linked_comments
71
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'comments', fields: {comment: [:id]})
72
+ expected = [{
73
+ id: "1",
74
+ type: "comments",
75
+ relationships: {
76
+ post: { data: { type: "posts", id: "1" } },
77
+ author: { data: nil }
78
+ }
79
+ }, {
80
+ id: "2",
81
+ type: "comments",
82
+ relationships: {
83
+ post: { data: { type: "posts", id: "1" } },
84
+ author: { data: nil }
85
+ }
86
+ }]
87
+ assert_equal expected, @adapter.serializable_hash[:included]
88
+ end
89
+
90
+ def test_no_include_linked_if_comments_is_empty
91
+ serializer = PostSerializer.new(@post_without_comments)
92
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
93
+
94
+ assert_nil adapter.serializable_hash[:linked]
95
+ end
96
+
97
+ def test_include_type_for_association_when_different_than_name
98
+ serializer = BlogSerializer.new(@blog)
99
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
100
+ actual = adapter.serializable_hash[:data][:relationships][:articles]
101
+
102
+ expected = {
103
+ data: [{
104
+ type: "posts",
105
+ id: "1"
106
+ }]
107
+ }
108
+ assert_equal expected, actual
109
+ end
110
+
111
+ def test_has_many_with_no_serializer
112
+ serializer = PostWithTagsSerializer.new(@post)
113
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
114
+
115
+ assert_equal({
116
+ data: {
117
+ id: "1",
118
+ type: "posts",
119
+ relationships: {
120
+ tags: { data: [@tag.as_json]}
121
+ }
122
+ }
123
+ }, adapter.serializable_hash)
124
+ end
125
+
126
+ def test_has_many_with_virtual_value
127
+ serializer = VirtualValueSerializer.new(@virtual_value)
128
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
129
+
130
+ assert_equal({
131
+ data: {
132
+ id: "1",
133
+ type: "virtual_values",
134
+ relationships: {
135
+ maker: {data: {id: 1}},
136
+ reviews: {data: [{id: 1}, {id: 2}]}
137
+ }
138
+ }
139
+ }, adapter.serializable_hash)
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,81 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class HasOneTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @bio = Bio.new(id: 43, content: 'AMS Contributor')
11
+ @author.bio = @bio
12
+ @bio.author = @author
13
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
14
+ @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
15
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
16
+ @post.comments = [@comment]
17
+ @anonymous_post.comments = []
18
+ @comment.post = @post
19
+ @comment.author = nil
20
+ @post.author = @author
21
+ @anonymous_post.author = nil
22
+ @blog = Blog.new(id: 1, name: "My Blog!!")
23
+ @blog.writer = @author
24
+ @blog.articles = [@post, @anonymous_post]
25
+ @author.posts = []
26
+ @author.roles = []
27
+
28
+ @virtual_value = VirtualValue.new(id: 1)
29
+
30
+ @serializer = AuthorSerializer.new(@author)
31
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'bio,posts')
32
+ end
33
+
34
+ def test_includes_bio_id
35
+ expected = { data: { type: "bios", id: "43" } }
36
+
37
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:bio])
38
+ end
39
+
40
+ def test_includes_linked_bio
41
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'bio')
42
+
43
+ expected = [
44
+ {
45
+ id: "43",
46
+ type: "bios",
47
+ attributes: {
48
+ content:"AMS Contributor",
49
+ rating: nil
50
+ },
51
+ relationships: {
52
+ author: { data: { type: "authors", id: "1" } }
53
+ }
54
+ }
55
+ ]
56
+
57
+ assert_equal(expected, @adapter.serializable_hash[:included])
58
+ end
59
+
60
+ def test_has_one_with_virtual_value
61
+ serializer = VirtualValueSerializer.new(@virtual_value)
62
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
63
+
64
+ expected = {
65
+ data: {
66
+ id: "1",
67
+ type: "virtual_values",
68
+ relationships: {
69
+ maker: {data: {id: 1}},
70
+ reviews: {data: [{id: 1}, {id: 2}]}
71
+ }
72
+ }
73
+ }
74
+
75
+ assert_equal(expected, adapter.serializable_hash)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,38 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApiTest < Minitest::Test
7
+ def setup
8
+ ActionController::Base.cache_store.clear
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @post = Post.new(id: 1, title: 'New Post', body: 'Body')
11
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
12
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
13
+ @post.comments = [@first_comment, @second_comment]
14
+ @first_comment.post = @post
15
+ @second_comment.post = @post
16
+ @post.author = @author
17
+ @blog = Blog.new(id: 1, name: "My Blog!!")
18
+ @post.blog = @blog
19
+
20
+ end
21
+
22
+ def test_custom_keys
23
+ serializer = PostWithCustomKeysSerializer.new(@post)
24
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
25
+
26
+ assert_equal({
27
+ reviews: { data: [
28
+ {type: "comments", id: "1"},
29
+ {type: "comments", id: "2"}
30
+ ]},
31
+ writer: { data: {type: "authors", id: "1"} },
32
+ site: { data: {type: "blogs", id: "1" } }
33
+ }, adapter.serializable_hash[:data][:relationships])
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end