mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 07:16:49 +00:00
This adds namespace lookup to serializer_for (#1968)
* This adds namespace lookup to serializer_for * address rubocop issue * address @bf4's feedback * add docs * update docs, add more tests * apparently rails master doesn't have before filter * try to address serializer cache issue between tests * update cache for serializer lookup to include namespace in the key, and fix the tests for explicit namespace * update docs, and use better cache key creation method * update docs [ci skip] * update docs [ci skip] * add to changelog [ci skip]
This commit is contained in:
committed by
GitHub
parent
b709cd41e6
commit
b29395b0ac
149
test/action_controller/namespace_lookup_test.rb
Normal file
149
test/action_controller/namespace_lookup_test.rb
Normal file
@@ -0,0 +1,149 @@
|
||||
require 'test_helper'
|
||||
|
||||
module ActionController
|
||||
module Serialization
|
||||
class NamespaceLookupTest < ActionController::TestCase
|
||||
class Book < ::Model; end
|
||||
class Page < ::Model; end
|
||||
class Writer < ::Model; end
|
||||
|
||||
module Api
|
||||
module V2
|
||||
class BookSerializer < ActiveModel::Serializer
|
||||
attributes :title
|
||||
end
|
||||
end
|
||||
|
||||
module V3
|
||||
class BookSerializer < ActiveModel::Serializer
|
||||
attributes :title, :body
|
||||
|
||||
belongs_to :writer
|
||||
end
|
||||
|
||||
class WriterSerializer < ActiveModel::Serializer
|
||||
attributes :name
|
||||
end
|
||||
|
||||
class LookupTestController < ActionController::Base
|
||||
before_action only: [:namespace_set_in_before_filter] do
|
||||
self.namespace_for_serializer = Api::V2
|
||||
end
|
||||
|
||||
def implicit_namespaced_serializer
|
||||
writer = Writer.new(name: 'Bob')
|
||||
book = Book.new(title: 'New Post', body: 'Body', writer: writer)
|
||||
|
||||
render json: book
|
||||
end
|
||||
|
||||
def explicit_namespace_as_module
|
||||
book = Book.new(title: 'New Post', body: 'Body')
|
||||
|
||||
render json: book, namespace: Api::V2
|
||||
end
|
||||
|
||||
def explicit_namespace_as_string
|
||||
book = Book.new(title: 'New Post', body: 'Body')
|
||||
|
||||
# because this is a string, ruby can't auto-lookup the constant, so otherwise
|
||||
# the looku things we mean ::Api::V2
|
||||
render json: book, namespace: 'ActionController::Serialization::NamespaceLookupTest::Api::V2'
|
||||
end
|
||||
|
||||
def explicit_namespace_as_symbol
|
||||
book = Book.new(title: 'New Post', body: 'Body')
|
||||
|
||||
# because this is a string, ruby can't auto-lookup the constant, so otherwise
|
||||
# the looku things we mean ::Api::V2
|
||||
render json: book, namespace: :'ActionController::Serialization::NamespaceLookupTest::Api::V2'
|
||||
end
|
||||
|
||||
def invalid_namespace
|
||||
book = Book.new(title: 'New Post', body: 'Body')
|
||||
|
||||
render json: book, namespace: :api_v2
|
||||
end
|
||||
|
||||
def namespace_set_in_before_filter
|
||||
book = Book.new(title: 'New Post', body: 'Body')
|
||||
render json: book
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
tests Api::V3::LookupTestController
|
||||
|
||||
setup do
|
||||
@test_namespace = self.class.parent
|
||||
end
|
||||
|
||||
test 'implicitly uses namespaced serializer' do
|
||||
get :implicit_namespaced_serializer
|
||||
|
||||
assert_serializer Api::V3::BookSerializer
|
||||
|
||||
expected = { 'title' => 'New Post', 'body' => 'Body', 'writer' => { 'name' => 'Bob' } }
|
||||
actual = JSON.parse(@response.body)
|
||||
|
||||
assert_equal expected, actual
|
||||
end
|
||||
|
||||
test 'explicit namespace as module' do
|
||||
get :explicit_namespace_as_module
|
||||
|
||||
assert_serializer Api::V2::BookSerializer
|
||||
|
||||
expected = { 'title' => 'New Post' }
|
||||
actual = JSON.parse(@response.body)
|
||||
|
||||
assert_equal expected, actual
|
||||
end
|
||||
|
||||
test 'explicit namespace as string' do
|
||||
get :explicit_namespace_as_string
|
||||
|
||||
assert_serializer Api::V2::BookSerializer
|
||||
|
||||
expected = { 'title' => 'New Post' }
|
||||
actual = JSON.parse(@response.body)
|
||||
|
||||
assert_equal expected, actual
|
||||
end
|
||||
|
||||
test 'explicit namespace as symbol' do
|
||||
get :explicit_namespace_as_symbol
|
||||
|
||||
assert_serializer Api::V2::BookSerializer
|
||||
|
||||
expected = { 'title' => 'New Post' }
|
||||
actual = JSON.parse(@response.body)
|
||||
|
||||
assert_equal expected, actual
|
||||
end
|
||||
|
||||
test 'invalid namespace' do
|
||||
get :invalid_namespace
|
||||
|
||||
assert_serializer ActiveModel::Serializer::Null
|
||||
|
||||
expected = { 'title' => 'New Post', 'body' => 'Body' }
|
||||
actual = JSON.parse(@response.body)
|
||||
|
||||
assert_equal expected, actual
|
||||
end
|
||||
|
||||
test 'namespace set in before filter' do
|
||||
get :namespace_set_in_before_filter
|
||||
|
||||
assert_serializer Api::V2::BookSerializer
|
||||
|
||||
expected = { 'title' => 'New Post' }
|
||||
actual = JSON.parse(@response.body)
|
||||
|
||||
assert_equal expected, actual
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user