mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 07:16:49 +00:00
Merge pull request #1650 from bf4/fix_serialization_scope
[FIX] serialization scope options
This commit is contained in:
@@ -1,6 +1,17 @@
|
||||
require 'test_helper'
|
||||
|
||||
module SerializationScopeTesting
|
||||
def self.undef_serializer_dynamic_scope_methods
|
||||
[PostSerializer, PostViewContextSerializer]. each do |serializer_class|
|
||||
instance_method_cache = serializer_class.instance_variable_get(:@_serializer_instance_methods)
|
||||
class_method_cache = serializer_class.class_variable_get(:@@_serializer_instance_methods)[serializer_class]
|
||||
[:view_context, :current_user].each do |scope_method|
|
||||
serializer_class.send(:undef_method, scope_method) if serializer_class.method_defined?(scope_method)
|
||||
instance_method_cache && instance_method_cache.delete(scope_method)
|
||||
class_method_cache && class_method_cache.delete(scope_method)
|
||||
end
|
||||
end
|
||||
end
|
||||
class User < ActiveModelSerializers::Model
|
||||
attr_accessor :id, :name, :admin
|
||||
def admin?
|
||||
@@ -70,6 +81,10 @@ module SerializationScopeTesting
|
||||
class DefaultScopeTest < ActionController::TestCase
|
||||
tests PostTestController
|
||||
|
||||
teardown do
|
||||
SerializationScopeTesting.undef_serializer_dynamic_scope_methods
|
||||
end
|
||||
|
||||
def test_default_serialization_scope
|
||||
assert_equal :current_user, @controller._serialization_scope
|
||||
end
|
||||
@@ -120,6 +135,10 @@ module SerializationScopeTesting
|
||||
end
|
||||
tests PostViewContextTestController
|
||||
|
||||
teardown do
|
||||
SerializationScopeTesting.undef_serializer_dynamic_scope_methods
|
||||
end
|
||||
|
||||
def test_defined_serialization_scope
|
||||
assert_equal :view_context, @controller._serialization_scope
|
||||
end
|
||||
@@ -158,8 +177,6 @@ module SerializationScopeTesting
|
||||
assert_equal expected_json, @response.body
|
||||
end
|
||||
end
|
||||
# FIXME: Has bugs. See comments below and
|
||||
# https://github.com/rails-api/active_model_serializers/issues/1509
|
||||
class NilSerializationScopeTest < ActionController::TestCase
|
||||
class PostViewContextTestController < ActionController::Base
|
||||
serialization_scope nil
|
||||
@@ -171,12 +188,15 @@ module SerializationScopeTesting
|
||||
render json: new_post, serializer: PostSerializer, adapter: :json
|
||||
end
|
||||
|
||||
# TODO: run test when
|
||||
# global state in Serializer._serializer_instance_methods is fixed
|
||||
# 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
|
||||
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
|
||||
|
||||
@@ -186,6 +206,10 @@ module SerializationScopeTesting
|
||||
end
|
||||
tests PostViewContextTestController
|
||||
|
||||
teardown do
|
||||
SerializationScopeTesting.undef_serializer_dynamic_scope_methods
|
||||
end
|
||||
|
||||
def test_nil_serialization_scope
|
||||
assert_nil @controller._serialization_scope
|
||||
end
|
||||
@@ -194,37 +218,35 @@ module SerializationScopeTesting
|
||||
assert_nil @controller.serialization_scope
|
||||
end
|
||||
|
||||
# TODO: change to NoMethodError and match 'admin?' when the
|
||||
# global state in Serializer._serializer_instance_methods is fixed
|
||||
def test_nil_scope
|
||||
if Rails.version.start_with?('4.0')
|
||||
exception_class = NoMethodError
|
||||
exception_matcher = 'admin?'
|
||||
else
|
||||
exception_class = NameError
|
||||
exception_matcher = /admin|current_user/
|
||||
end
|
||||
exception = assert_raises(exception_class) do
|
||||
exception_matcher = /current_user/
|
||||
exception = assert_raises(NameError) do
|
||||
get :render_post_with_no_scope
|
||||
end
|
||||
assert_match exception_matcher, exception.message
|
||||
end
|
||||
|
||||
# TODO: run test when
|
||||
# global state in Serializer._serializer_instance_methods is fixed
|
||||
# def test_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_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
|
||||
|
||||
Reference in New Issue
Block a user