aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/cache/behaviors/local_cache_behavior.rb
blob: 6f5d53c1908f455bc6d69529bceabf6cf27b1825 (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# frozen_string_literal: true

module LocalCacheBehavior
  def test_local_writes_are_persistent_on_the_remote_cache
    retval = @cache.with_local_cache do
      @cache.write("foo", "bar")
    end
    assert retval
    assert_equal "bar", @cache.read("foo")
  end

  def test_clear_also_clears_local_cache
    @cache.with_local_cache do
      @cache.write("foo", "bar")
      @cache.clear
      assert_nil @cache.read("foo")
    end

    assert_nil @cache.read("foo")
  end

  def test_cleanup_clears_local_cache_but_not_remote_cache
    begin
      @cache.cleanup
    rescue NotImplementedError
      skip
    end

    @cache.with_local_cache do
      @cache.write("foo", "bar")
      assert_equal "bar", @cache.read("foo")

      @cache.send(:bypass_local_cache) { @cache.write("foo", "baz") }
      assert_equal "bar", @cache.read("foo")

      @cache.cleanup
      assert_equal "baz", @cache.read("foo")
    end
  end

  def test_local_cache_of_write
    @cache.with_local_cache do
      @cache.write("foo", "bar")
      @peek.delete("foo")
      assert_equal "bar", @cache.read("foo")
    end
  end

  def test_local_cache_of_read_returns_a_copy_of_the_entry
    @cache.with_local_cache do
      @cache.write(:foo, type: "bar")
      value = @cache.read(:foo)
      assert_equal("bar", value.delete(:type))
      assert_equal({ type: "bar" }, @cache.read(:foo))
    end
  end

  def test_local_cache_of_read
    @cache.write("foo", "bar")
    @cache.with_local_cache do
      assert_equal "bar", @cache.read("foo")
    end
  end

  def test_local_cache_of_read_nil
    @cache.with_local_cache do
      assert_nil @cache.read("foo")
      @cache.send(:bypass_local_cache) { @cache.write "foo", "bar" }
      assert_nil @cache.read("foo")
    end
  end

  def test_local_cache_fetch
    @cache.with_local_cache do
      @cache.send(:local_cache).write "foo", "bar"
      assert_equal "bar", @cache.send(:local_cache).fetch("foo")
    end
  end

  def test_local_cache_of_write_nil
    @cache.with_local_cache do
      assert @cache.write("foo", nil)
      assert_nil @cache.read("foo")
      @peek.write("foo", "bar")
      assert_nil @cache.read("foo")
    end
  end

  def test_local_cache_of_write_with_unless_exist
    @cache.with_local_cache do
      @cache.write("foo", "bar")
      @cache.write("foo", "baz", unless_exist: true)
      assert_equal @peek.read("foo"), @cache.read("foo")
    end
  end

  def test_local_cache_of_delete
    @cache.with_local_cache do
      @cache.write("foo", "bar")
      @cache.delete("foo")
      assert_nil @cache.read("foo")
    end
  end

  def test_local_cache_of_exist
    @cache.with_local_cache do
      @cache.write("foo", "bar")
      @peek.delete("foo")
      assert @cache.exist?("foo")
    end
  end

  def test_local_cache_of_increment
    @cache.with_local_cache do
      @cache.write("foo", 1, raw: true)
      @peek.write("foo", 2, raw: true)
      @cache.increment("foo")
      assert_equal 3, @cache.read("foo")
    end
  end

  def test_local_cache_of_decrement
    @cache.with_local_cache do
      @cache.write("foo", 1, raw: true)
      @peek.write("foo", 3, raw: true)
      @cache.decrement("foo")
      assert_equal 2, @cache.read("foo")
    end
  end

  def test_local_cache_of_fetch_multi
    @cache.with_local_cache do
      @cache.fetch_multi("foo", "bar") { |_key| true }
      @peek.delete("foo")
      @peek.delete("bar")
      assert_equal true, @cache.read("foo")
      assert_equal true, @cache.read("bar")
    end
  end

  def test_local_cache_of_read_multi
    @cache.with_local_cache do
      @cache.write("foo", "foo", raw: true)
      @cache.write("bar", "bar", raw: true)
      values = @cache.read_multi("foo", "bar")
      assert_equal "foo", @cache.read("foo")
      assert_equal "bar", @cache.read("bar")
      assert_equal "foo", values["foo"]
      assert_equal "bar", values["bar"]
    end
  end

  def test_middleware
    app = lambda { |env|
      result = @cache.write("foo", "bar")
      assert_equal "bar", @cache.read("foo") # make sure 'foo' was written
      assert result
      [200, {}, []]
    }
    app = @cache.middleware.new(app)
    app.call({})
  end
end