mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-22 22:06:50 +00:00
Status quo in test app:
In Rails
ActionController::Base.cache_store = :memory_store
and then AMS railtie does:
ActiveModelSerializers.config.cache_store = config.action_controller.cache_store
then, in the Railtie
1. ActiveSupport.on_load(:action_controller) fires
- ActiveModelSerializers.config.cache_store #=> nil
- ActionController::Base.cache_store #=> #<ActiveSupport::Cache::FileStore:0x007fe319256760...]
2. After set_configs fires
- ActiveModelSerializers.config.cache_store #+> #<ActiveSupport::Cache::FileStore:0x007fe319256760 ,
3. Tests pass, but notice that we're using the FileStore, not memory store
When we change the config to the test app:
ActionController::Base.cache_store = :memory_store
config = Rails.configuration
config.action_controller.cache_store = :memory_store
then, in the Railtie:
1. ActiveSupport.on_load(:action_controller) fires
- ActiveModelSerializers.config.cache_store #=> nil
- ActionController::Base.cache_store #=> #ActiveSupport::Cache::MemoryStore entries=0, size=0, options={}>]
2. After set_configs fires
- ActiveModelSerializers.config.cache_store #=> :memory_store
3. And we get a lot of failures:
NoMethodError: undefined method `fetch' for :memory_store:Symbol
So, we see that when we set the ActionController::Base.cache_store
directly in our test app, we could set
ActiveModelSerializers.config.cache_store in the :action_controller load
hook, but that would never use the Rails config.
To fix the Rails config, we change the config to the test app:
config = Rails.configuration
config.action_controller.cache_store = :memory_store
and then AMS railtie does:
ActiveModelSerializers.config.cache_store = ActiveSupport::Cache.lookup_store(config.action_controller.cache_store
ActiveSupport.on_load(:action_controller) do
::ActiveModelSerializers.config.cache_store = cache_store
end
then
1. After set_configs fires
- ActiveModelSerializers.config.cache_store #=> <#ActiveSupport::Cache::MemoryStore, object_id 70207113611740
2. ActiveSupport.on_load(:action_controller) fires
- ActionController::Base.cache_store #=> <#ActiveSupport::Cache::MemoryStore, object_id 70207106279660
- ActiveModelSerializers.config.cache_store #=> <#ActiveSupport::Cache::MemoryStore, object_id 70207106279660
(notice the object_id changed)
3. And we get a failure:
1) Failure:
ActiveModelSerializers::CacheTest#test_associations_cache_when_updated
[active_model_serializers/test/cache_test.rb:141]:
--- expected
+++ actual
@@ -1 +1 @@
-{:id=>"post", :title=>"New Post", :body=>"Body"}
+{:id=>"post", :title=>"New Post", :body=>"Body", :comments=>[{:id=>2, :body=>"ZOMG A NEW COMMENT"}], :blog=>{:id=>999, :name=>"Custom blog"}, :author=>{:id=>"author", :name=>"Joao M. D. Moura"}}
If we take out the on_load(:action_controller) hook, we get a ton of
failures. So clearly, our code expects the controller cache to be the
same as the serializer cache.
So, we make sure we use an on_load(:action_controller) hook that runs
after set_configs
And look at the test and see it is filled with direct calls to ActionController::Base.cache_store
assert_equal(new_comment_serializer.attributes, ActionController::Base.cache_store.fetch(new_comment.cache_key))
assert_equal(@post_serializer.attributes, ActionController::Base.cache_store.fetch(@post.cache_key))
But that's not a problem in this case, since they're the same object.
For now, let's remove the :memory_store setting and use the default FileStore
171 lines
6.8 KiB
Ruby
171 lines
6.8 KiB
Ruby
# Execute this test in isolation
|
|
require 'support/isolated_unit'
|
|
|
|
class CachingConfigurationTest < ActiveSupport::TestCase
|
|
include ActiveSupport::Testing::Isolation
|
|
|
|
setup do
|
|
require 'rails'
|
|
# AMS needs to be required before Rails.application is initialized for
|
|
# Railtie's to fire in Rails.application.initialize!
|
|
# (and make_basic_app initializes the app)
|
|
require 'active_model_serializers'
|
|
# Create serializers before Rails.application.initialize!
|
|
# To ensure we're testing that the cache settings depend on
|
|
# the Railtie firing, not on the ActionController being loaded.
|
|
create_serializers
|
|
end
|
|
|
|
def create_serializers
|
|
@cached_serializer = Class.new(ActiveModel::Serializer) do
|
|
cache skip_digest: true
|
|
attributes :id, :name, :title
|
|
end
|
|
@fragment_cached_serializer = Class.new(ActiveModel::Serializer) do
|
|
cache only: :id
|
|
attributes :id, :name, :title
|
|
end
|
|
@non_cached_serializer = Class.new(ActiveModel::Serializer) do
|
|
attributes :id, :name, :title
|
|
end
|
|
end
|
|
|
|
class PerformCachingTrue < CachingConfigurationTest
|
|
setup do
|
|
# Let's make that Rails app and initialize it!
|
|
make_basic_app do |app|
|
|
app.config.action_controller.perform_caching = true
|
|
app.config.action_controller.cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
|
|
end
|
|
controller_cache_store # Force ActiveSupport.on_load(:action_controller) to run
|
|
end
|
|
|
|
test 'it sets perform_caching to true on AMS.config and serializers' do
|
|
assert Rails.configuration.action_controller.perform_caching
|
|
assert ActiveModelSerializers.config.perform_caching
|
|
assert ActiveModel::Serializer.perform_caching?
|
|
assert @cached_serializer.perform_caching?
|
|
assert @non_cached_serializer.perform_caching?
|
|
assert @fragment_cached_serializer.perform_caching?
|
|
end
|
|
|
|
test 'it sets the AMS.config.cache_store to the controller cache_store' do
|
|
assert_equal controller_cache_store, ActiveSupport::Cache::MemoryStore
|
|
assert_equal controller_cache_store, ActiveModelSerializers.config.cache_store.class
|
|
end
|
|
|
|
test 'it sets the cached serializer cache_store to the ActionController::Base.cache_store' do
|
|
assert_equal ActiveSupport::Cache::NullStore, @cached_serializer._cache.class
|
|
assert_equal controller_cache_store, @cached_serializer.cache_store.class
|
|
assert_equal ActiveSupport::Cache::MemoryStore, @cached_serializer._cache.class
|
|
end
|
|
|
|
test 'the cached serializer has cache_enabled?' do
|
|
assert @cached_serializer.cache_enabled?
|
|
end
|
|
|
|
test 'the cached serializer does not have fragment_cache_enabled?' do
|
|
refute @cached_serializer.fragment_cache_enabled?
|
|
end
|
|
|
|
test 'the non-cached serializer cache_store is nil' do
|
|
assert_equal nil, @non_cached_serializer._cache
|
|
assert_equal nil, @non_cached_serializer.cache_store
|
|
assert_equal nil, @non_cached_serializer._cache
|
|
end
|
|
|
|
test 'the non-cached serializer does not have cache_enabled?' do
|
|
refute @non_cached_serializer.cache_enabled?
|
|
end
|
|
|
|
test 'the non-cached serializer does not have fragment_cache_enabled?' do
|
|
refute @non_cached_serializer.fragment_cache_enabled?
|
|
end
|
|
|
|
test 'it sets the fragment cached serializer cache_store to the ActionController::Base.cache_store' do
|
|
assert_equal ActiveSupport::Cache::NullStore, @fragment_cached_serializer._cache.class
|
|
assert_equal controller_cache_store, @fragment_cached_serializer.cache_store.class
|
|
assert_equal ActiveSupport::Cache::MemoryStore, @fragment_cached_serializer._cache.class
|
|
end
|
|
|
|
test 'the fragment cached serializer does not have cache_enabled?' do
|
|
refute @fragment_cached_serializer.cache_enabled?
|
|
end
|
|
|
|
test 'the fragment cached serializer has fragment_cache_enabled?' do
|
|
assert @fragment_cached_serializer.fragment_cache_enabled?
|
|
end
|
|
end
|
|
|
|
class PerformCachingFalse < CachingConfigurationTest
|
|
setup do
|
|
# Let's make that Rails app and initialize it!
|
|
make_basic_app do |app|
|
|
app.config.action_controller.perform_caching = false
|
|
app.config.action_controller.cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
|
|
end
|
|
controller_cache_store # Force ActiveSupport.on_load(:action_controller) to run
|
|
end
|
|
|
|
test 'it sets perform_caching to false on AMS.config and serializers' do
|
|
refute Rails.configuration.action_controller.perform_caching
|
|
refute ActiveModelSerializers.config.perform_caching
|
|
refute ActiveModel::Serializer.perform_caching?
|
|
refute @cached_serializer.perform_caching?
|
|
refute @non_cached_serializer.perform_caching?
|
|
refute @fragment_cached_serializer.perform_caching?
|
|
end
|
|
|
|
test 'it sets the AMS.config.cache_store to the controller cache_store' do
|
|
assert_equal controller_cache_store, ActiveSupport::Cache::MemoryStore
|
|
assert_equal controller_cache_store, ActiveModelSerializers.config.cache_store.class
|
|
end
|
|
|
|
test 'it sets the cached serializer cache_store to the ActionController::Base.cache_store' do
|
|
assert_equal ActiveSupport::Cache::NullStore, @cached_serializer._cache.class
|
|
assert_equal controller_cache_store, @cached_serializer.cache_store.class
|
|
assert_equal ActiveSupport::Cache::MemoryStore, @cached_serializer._cache.class
|
|
end
|
|
|
|
test 'the cached serializer does not have cache_enabled?' do
|
|
refute @cached_serializer.cache_enabled?
|
|
end
|
|
|
|
test 'the cached serializer does not have fragment_cache_enabled?' do
|
|
refute @cached_serializer.fragment_cache_enabled?
|
|
end
|
|
|
|
test 'the non-cached serializer cache_store is nil' do
|
|
assert_equal nil, @non_cached_serializer._cache
|
|
assert_equal nil, @non_cached_serializer.cache_store
|
|
assert_equal nil, @non_cached_serializer._cache
|
|
end
|
|
|
|
test 'the non-cached serializer does not have cache_enabled?' do
|
|
refute @non_cached_serializer.cache_enabled?
|
|
end
|
|
|
|
test 'the non-cached serializer does not have fragment_cache_enabled?' do
|
|
refute @non_cached_serializer.fragment_cache_enabled?
|
|
end
|
|
|
|
test 'it sets the fragment cached serializer cache_store to the ActionController::Base.cache_store' do
|
|
assert_equal ActiveSupport::Cache::NullStore, @fragment_cached_serializer._cache.class
|
|
assert_equal controller_cache_store, @fragment_cached_serializer.cache_store.class
|
|
assert_equal ActiveSupport::Cache::MemoryStore, @fragment_cached_serializer._cache.class
|
|
end
|
|
|
|
test 'the fragment cached serializer does not have cache_enabled?' do
|
|
refute @fragment_cached_serializer.cache_enabled?
|
|
end
|
|
|
|
test 'the fragment cached serializer does not have fragment_cache_enabled?' do
|
|
refute @fragment_cached_serializer.fragment_cache_enabled?
|
|
end
|
|
end
|
|
|
|
def controller_cache_store
|
|
ActionController::Base.cache_store.class
|
|
end
|
|
end
|