Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/support_specs/helpers/redis_commands/recorder_spec.rb')
-rw-r--r--spec/support_specs/helpers/redis_commands/recorder_spec.rb128
1 files changed, 128 insertions, 0 deletions
diff --git a/spec/support_specs/helpers/redis_commands/recorder_spec.rb b/spec/support_specs/helpers/redis_commands/recorder_spec.rb
new file mode 100644
index 00000000000..6f93ed2fcf0
--- /dev/null
+++ b/spec/support_specs/helpers/redis_commands/recorder_spec.rb
@@ -0,0 +1,128 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe RedisCommands::Recorder, :use_clean_rails_redis_caching do
+ subject(:recorder) { described_class.new(pattern: pattern) }
+
+ let(:cache) { Rails.cache }
+ let(:pattern) { nil }
+
+ describe '#initialize' do
+ context 'with a block' do
+ it 'records Redis commands' do
+ recorder = described_class.new { cache.read('key1') }
+
+ expect(recorder.log).to include([:get, 'cache:gitlab:key1'])
+ end
+ end
+
+ context 'without block' do
+ it 'only initializes the recorder' do
+ recorder = described_class.new
+
+ expect(recorder.log).to eq([])
+ end
+ end
+ end
+
+ describe '#record' do
+ it 'records Redis commands' do
+ recorder.record do
+ cache.write('key1', '1')
+ cache.read('key1')
+ cache.read('key2')
+ cache.delete('key1')
+ end
+
+ expect(recorder.log).to include([:set, 'cache:gitlab:key1', anything])
+ expect(recorder.log).to include([:get, 'cache:gitlab:key1'])
+ expect(recorder.log).to include([:get, 'cache:gitlab:key2'])
+ expect(recorder.log).to include([:del, 'cache:gitlab:key1'])
+ end
+
+ it 'does not record commands before the call' do
+ cache.write('key1', 1)
+
+ recorder.record do
+ cache.read('key1')
+ end
+
+ expect(recorder.log).not_to include([:set, anything, anything])
+ expect(recorder.log).to include([:get, 'cache:gitlab:key1'])
+ end
+
+ it 'refreshes recording after reinitialization' do
+ cache.read('key1')
+
+ recorder1 = described_class.new
+ recorder1.record do
+ cache.read('key2')
+ end
+
+ recorder2 = described_class.new
+
+ cache.read('key3')
+
+ recorder2.record do
+ cache.read('key4')
+ end
+
+ expect(recorder1.log).to include([:get, 'cache:gitlab:key2'])
+ expect(recorder1.log).not_to include([:get, 'cache:gitlab:key1'])
+ expect(recorder1.log).not_to include([:get, 'cache:gitlab:key3'])
+ expect(recorder1.log).not_to include([:get, 'cache:gitlab:key4'])
+
+ expect(recorder2.log).to include([:get, 'cache:gitlab:key4'])
+ expect(recorder2.log).not_to include([:get, 'cache:gitlab:key1'])
+ expect(recorder2.log).not_to include([:get, 'cache:gitlab:key2'])
+ expect(recorder2.log).not_to include([:get, 'cache:gitlab:key3'])
+ end
+ end
+
+ describe 'Pattern recording' do
+ let(:pattern) { 'key1' }
+
+ it 'records only matching keys' do
+ recorder.record do
+ cache.write('key1', '1')
+ cache.read('key2')
+ cache.read('key1')
+ cache.delete('key2')
+ end
+
+ expect(recorder.log).to include([:set, 'cache:gitlab:key1', anything])
+ expect(recorder.log).to include([:get, 'cache:gitlab:key1'])
+ expect(recorder.log).not_to include([:get, 'cache:gitlab:key2'])
+ expect(recorder.log).not_to include([:del, 'cache:gitlab:key2'])
+ end
+ end
+
+ describe '#by_command' do
+ it 'returns only matching commands' do
+ recorder.record do
+ cache.write('key1', '1')
+ cache.read('key2')
+ cache.read('key1')
+ cache.delete('key2')
+ end
+
+ expect(recorder.by_command(:del)).to match_array([[:del, 'cache:gitlab:key2']])
+ end
+ end
+
+ describe '#count' do
+ it 'returns the number of recorded commands' do
+ cache.read 'warmup'
+
+ recorder.record do
+ cache.write('key1', '1')
+ cache.read('key2')
+ cache.read('key1')
+ cache.delete('key2')
+ end
+
+ expect(recorder.count).to eq(4)
+ end
+ end
+end