active_model_serializers/lib/active_model_serializers
Benjamin Fleischer cdab6f2b8a The cache store needs to be the actually store, not e.g. :memory_store
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
2016-03-30 09:52:29 -05:00
..
adapter Move SerializableResource to ActiveModelSerializers namespace 2016-03-30 11:33:04 +02:00
test Create assert_response_schema test helper 2016-01-15 00:45:56 -06:00
adapter.rb Move serializer caching from adapter 2016-03-13 19:57:59 -05:00
cached_serializer.rb Separate enabling of caching and setting the cache store 2016-03-24 22:20:42 -05:00
callbacks.rb Move SerializableResource to ActiveModelSerializers namespace 2016-03-30 11:33:04 +02:00
deprecate.rb Move SerializableResource to ActiveModelSerializers namespace 2016-03-30 11:33:04 +02:00
deserialization.rb Follow up to #1535 2016-03-06 23:15:39 -06:00
fragment_cache.rb Move SerializableResource to ActiveModelSerializers namespace 2016-03-30 11:33:04 +02:00
json_pointer.rb add an extra format token to the primary data string so that JRuby doesn't break 2016-03-06 20:05:25 -06:00
key_transform.rb Provide key case translation 2016-03-15 12:21:10 -06:00
logging.rb Handle render.ams with nil serializer or adapter 2016-03-28 21:33:23 -05:00
model.rb RFC: Json Api Errors (WIP) 2016-03-06 12:03:14 -06:00
railtie.rb The cache store needs to be the actually store, not e.g. :memory_store 2016-03-30 09:52:29 -05:00
register_jsonapi_renderer.rb Spike Jsonapi Renderer registration 2016-03-28 22:04:16 -05:00
serializable_resource.rb Move SerializableResource to ActiveModelSerializers namespace 2016-03-30 11:33:04 +02:00
serialization_context.rb Fix warnings 2016-03-25 10:28:13 -05:00
test.rb Create assert_response_schema test helper 2016-01-15 00:45:56 -06:00