active_model_serializers/test/action_controller/namespace_lookup_test.rb
L. Preston Sego III b29395b0ac 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]
2016-11-09 07:57:39 -05:00

150 lines
4.1 KiB
Ruby

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