File: has_many_test.rb

package info (click to toggle)
ruby-active-model-serializers 0.10.12-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,752 kB
  • sloc: ruby: 13,138; sh: 53; makefile: 6
file content (175 lines) | stat: -rw-r--r-- 6,093 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# frozen_string_literal: true

require 'test_helper'

module ActiveModelSerializers
  module Adapter
    class JsonApi
      class HasManyTest < ActiveSupport::TestCase
        class ModelWithoutSerializer < ::Model
          attributes :id, :name
        end

        def setup
          ActionController::Base.cache_store.clear
          @author = Author.new(id: 1, name: 'Steve K.')
          @author.posts = []
          @author.bio = nil
          @post = Post.new(id: 1, title: 'New Post', body: 'Body')
          @post_without_comments = Post.new(id: 2, title: 'Second Post', body: 'Second')
          @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
          @first_comment.author = nil
          @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
          @second_comment.author = nil
          @post.comments = [@first_comment, @second_comment]
          @post_without_comments.comments = []
          @first_comment.post = @post
          @second_comment.post = @post
          @post.author = @author
          @post_without_comments.author = nil
          @blog = Blog.new(id: 1, name: 'My Blog!!')
          @blog.writer = @author
          @blog.articles = [@post]
          @post.blog = @blog
          @post_without_comments.blog = nil
          @tag = ModelWithoutSerializer.new(id: 1, name: '#hash_tag')
          @post.tags = [@tag]
          @serializer = PostSerializer.new(@post)
          @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer)

          @virtual_value = VirtualValue.new(id: 1)
        end

        def test_includes_comment_ids
          expected = { data: [{ type: 'comments', id: '1' }, { type: 'comments', id: '2' }] }

          assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:comments])
        end

        test 'relationships can be whitelisted via fields' do
          @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, fields: { posts: [:author] })
          result = @adapter.serializable_hash
          expected = {
            data: {
              id: '1',
              type: 'posts',
              relationships: {
                author: {
                  data: {
                    id: '1',
                    type: 'authors'
                  }
                }
              }
            }
          }

          assert_equal expected, result
        end

        def test_includes_linked_comments
          @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:comments])
          expected = [{
            id: '1',
            type: 'comments',
            attributes: {
              body: 'ZOMG A COMMENT'
            },
            relationships: {
              post: { data: { type: 'posts', id: '1' } },
              author: { data: nil }
            }
          }, {
            id: '2',
            type: 'comments',
            attributes: {
              body: 'ZOMG ANOTHER COMMENT'
            },
            relationships: {
              post: { data: { type: 'posts', id: '1' } },
              author: { data: nil }
            }
          }]
          assert_equal expected, @adapter.serializable_hash[:included]
        end

        def test_limit_fields_of_linked_comments
          @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:comments], fields: { comment: [:id, :post, :author] })
          expected = [{
            id: '1',
            type: 'comments',
            relationships: {
              post: { data: { type: 'posts', id: '1' } },
              author: { data: nil }
            }
          }, {
            id: '2',
            type: 'comments',
            relationships: {
              post: { data: { type: 'posts', id: '1' } },
              author: { data: nil }
            }
          }]
          assert_equal expected, @adapter.serializable_hash[:included]
        end

        def test_no_include_linked_if_comments_is_empty
          serializer = PostSerializer.new(@post_without_comments)
          adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)

          assert_nil adapter.serializable_hash[:linked]
        end

        def test_include_type_for_association_when_different_than_name
          serializer = BlogSerializer.new(@blog)
          adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
          actual = adapter.serializable_hash[:data][:relationships][:articles]

          expected = {
            data: [{
              type: 'posts',
              id: '1'
            }]
          }
          assert_equal expected, actual
        end

        def test_has_many_with_no_serializer
          post_serializer_class = Class.new(ActiveModel::Serializer) do
            attributes :id
            has_many :tags
          end
          serializer = post_serializer_class.new(@post)
          adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)

          assert_equal({
                         data: {
                           id: '1',
                           type: 'posts',
                           relationships: {
                             tags: { data: [@tag.as_json] }
                           }
                         }
                       }, adapter.serializable_hash)
        end

        def test_has_many_with_virtual_value
          serializer = VirtualValueSerializer.new(@virtual_value)
          adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)

          assert_equal({
                         data: {
                           id: '1',
                           type: 'virtual-values',
                           relationships: {
                             maker: { data: { type: 'makers', id: '1' } },
                             reviews: { data: [{ type: 'reviews', id: '1' },
                                               { type: 'reviews', id: '2' }] }
                           }
                         }
                       }, adapter.serializable_hash)
        end
      end
    end
  end
end