aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/cache/cache_store_write_multi_test.rb
blob: 9355dde0f422850b2bb198298cdb521ea2ef1b30 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# frozen_string_literal: true
require "abstract_unit"
require "active_support/cache"

class CacheStoreWriteMultiEntriesStoreProviderInterfaceTest < ActiveSupport::TestCase
  setup do
    @cache = ActiveSupport::Cache.lookup_store(:null_store)
  end

  test "fetch_multi uses write_multi_entries store provider interface" do
    assert_called_with(@cache, :write_multi_entries) do
      @cache.fetch_multi "a", "b", "c" do |key|
        key * 2
      end
    end
  end
end

class CacheStoreWriteMultiInstrumentationTest < ActiveSupport::TestCase
  setup do
    @cache = ActiveSupport::Cache.lookup_store(:null_store)
  end

  test "instrumentation" do
    writes = { "a" => "aa", "b" => "bb" }

    events = with_instrumentation "write_multi" do
      @cache.write_multi(writes)
    end

    assert_equal %w[ cache_write_multi.active_support ], events.map(&:name)
    assert_nil events[0].payload[:super_operation]
    assert_equal({ "a" => "aa", "b" => "bb" }, events[0].payload[:key])
  end

  test "instrumentation with fetch_multi as super operation" do
    skip "fetch_multi isn't instrumented yet"

    events = with_instrumentation "write_multi" do
      @cache.fetch_multi("a", "b") { |key| key * 2 }
    end

    assert_equal %w[ cache_write_multi.active_support ], events.map(&:name)
    assert_nil events[0].payload[:super_operation]
    assert !events[0].payload[:hit]
  end

  private
    def with_instrumentation(method)
      event_name = "cache_#{method}.active_support"

      [].tap do |events|
        ActiveSupport::Notifications.subscribe event_name do |*args|
          events << ActiveSupport::Notifications::Event.new(*args)
        end
        yield
      end
    ensure
      ActiveSupport::Notifications.unsubscribe event_name
    end
end