File: serialization_scope_name_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 (237 lines) | stat: -rw-r--r-- 6,405 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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# frozen_string_literal: true

require 'test_helper'

module SerializationScopeTesting
  class User < ActiveModelSerializers::Model
    attributes :id, :name, :admin
    def admin?
      admin
    end
  end
  class Comment < ActiveModelSerializers::Model
    attributes :id, :body
  end
  class Post < ActiveModelSerializers::Model
    attributes :id, :title, :body, :comments
  end
  class PostSerializer < ActiveModel::Serializer
    attributes :id, :title, :body, :comments

    def body
      "The 'scope' is the 'current_user': #{scope == current_user}"
    end

    def comments
      if current_user.admin?
        [Comment.new(id: 1, body: 'Admin')]
      else
        [Comment.new(id: 2, body: 'Scoped')]
      end
    end

    def json_key
      'post'
    end
  end
  class PostTestController < ActionController::Base
    attr_writer :current_user

    def render_post_by_non_admin
      self.current_user = User.new(id: 3, name: 'Pete', admin: false)
      render json: new_post, serializer: serializer, adapter: :json
    end

    def render_post_by_admin
      self.current_user = User.new(id: 3, name: 'Pete', admin: true)
      render json: new_post, serializer: serializer, adapter: :json
    end

    def current_user
      defined?(@current_user) ? @current_user : :current_user_not_set
    end

    private

    def new_post
      Post.new(id: 4, title: 'Title')
    end

    def serializer
      PostSerializer
    end
  end
  class PostViewContextSerializer < PostSerializer
    def body
      "The 'scope' is the 'view_context': #{scope == view_context}"
    end

    def comments
      if view_context.controller.current_user.admin?
        [Comment.new(id: 1, body: 'Admin')]
      else
        [Comment.new(id: 2, body: 'Scoped')]
      end
    end
  end
  class DefaultScopeTest < ActionController::TestCase
    tests PostTestController

    def test_default_serialization_scope
      assert_equal :current_user, @controller._serialization_scope
    end

    def test_default_serialization_scope_object
      assert_equal :current_user_not_set, @controller.current_user
      assert_equal :current_user_not_set, @controller.serialization_scope
    end

    def test_default_scope_non_admin
      get :render_post_by_non_admin
      expected_json = {
        post: {
          id: 4,
          title: 'Title',
          body: "The 'scope' is the 'current_user': true",
          comments: [
            { id: 2, body: 'Scoped' }
          ]
        }
      }.to_json
      assert_equal expected_json, @response.body
    end

    def test_default_scope_admin
      get :render_post_by_admin
      expected_json = {
        post: {
          id: 4,
          title: 'Title',
          body: "The 'scope' is the 'current_user': true",
          comments: [
            { id: 1, body: 'Admin' }
          ]
        }
      }.to_json
      assert_equal expected_json, @response.body
    end
  end
  class SerializationScopeTest < ActionController::TestCase
    class PostViewContextTestController < PostTestController
      serialization_scope :view_context

      private

      def serializer
        PostViewContextSerializer
      end
    end
    tests PostViewContextTestController

    def test_defined_serialization_scope
      assert_equal :view_context, @controller._serialization_scope
    end

    def test_defined_serialization_scope_object
      assert_equal @controller.view_context.controller, @controller.serialization_scope.controller
    end

    def test_serialization_scope_non_admin
      get :render_post_by_non_admin
      expected_json = {
        post: {
          id: 4,
          title: 'Title',
          body: "The 'scope' is the 'view_context': true",
          comments: [
            { id: 2, body: 'Scoped' }
          ]
        }
      }.to_json
      assert_equal expected_json, @response.body
    end

    def test_serialization_scope_admin
      get :render_post_by_admin
      expected_json = {
        post: {
          id: 4,
          title: 'Title',
          body: "The 'scope' is the 'view_context': true",
          comments: [
            { id: 1, body: 'Admin' }
          ]
        }
      }.to_json
      assert_equal expected_json, @response.body
    end
  end
  class NilSerializationScopeTest < ActionController::TestCase
    class PostViewContextTestController < ActionController::Base
      serialization_scope nil

      attr_accessor :current_user

      def render_post_with_no_scope
        self.current_user = User.new(id: 3, name: 'Pete', admin: false)
        render json: new_post, serializer: PostSerializer, adapter: :json
      end

      def render_post_with_passed_in_scope
        self.current_user = User.new(id: 3, name: 'Pete', admin: false)
        render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user, scope_name: :current_user
      end

      def render_post_with_passed_in_scope_without_scope_name
        self.current_user = User.new(id: 3, name: 'Pete', admin: false)
        render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user
      end

      private

      def new_post
        Post.new(id: 4, title: 'Title')
      end
    end
    tests PostViewContextTestController

    def test_nil_serialization_scope
      assert_nil @controller._serialization_scope
    end

    def test_nil_serialization_scope_object
      assert_nil @controller.serialization_scope
    end

    def test_nil_scope
      exception_matcher = /current_user/
      exception = assert_raises(NameError) do
        get :render_post_with_no_scope
      end
      assert_match exception_matcher, exception.message
    end

    def test_serialization_scope_is_and_nil_scope_passed_in_current_user
      get :render_post_with_passed_in_scope
      expected_json = {
        post: {
          id: 4,
          title: 'Title',
          body: "The 'scope' is the 'current_user': true",
          comments: [
            { id: 2, body: 'Scoped' }
          ]
        }
      }.to_json
      assert_equal expected_json, @response.body
    end

    def test_serialization_scope_is_nil_and_scope_passed_in_current_user_without_scope_name
      exception_matcher = /current_user/
      exception = assert_raises(NameError) do
        get :render_post_with_passed_in_scope_without_scope_name
      end
      assert_match exception_matcher, exception.message
    end
  end
end