cfe19b795e
This new class uses a Redis Hash instead of a Sorted Set. Signed-off-by: Rémy Coutable <remy@rymai.me>
127 lines
3.4 KiB
Ruby
127 lines
3.4 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe Gitlab::UserActivities, :redis, lib: true do
|
|
let(:now) { Time.now }
|
|
|
|
describe '.record' do
|
|
context 'with no time given' do
|
|
it 'uses Time.now and records an activity in Redis' do
|
|
Timecop.freeze do
|
|
now # eager-load now
|
|
described_class.record(42)
|
|
end
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', [['42', now.to_i.to_s]]])
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with a time given' do
|
|
it 'uses the given time and records an activity in Redis' do
|
|
described_class.record(42, now)
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', [['42', now.to_i.to_s]]])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '.delete' do
|
|
context 'with a single key' do
|
|
context 'and key exists' do
|
|
it 'removes the pair from Redis' do
|
|
described_class.record(42, now)
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', [['42', now.to_i.to_s]]])
|
|
end
|
|
|
|
subject.delete(42)
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', []])
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'and key does not exist' do
|
|
it 'removes the pair from Redis' do
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', []])
|
|
end
|
|
|
|
subject.delete(42)
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', []])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with multiple keys' do
|
|
context 'and all keys exist' do
|
|
it 'removes the pair from Redis' do
|
|
described_class.record(41, now)
|
|
described_class.record(42, now)
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', [['41', now.to_i.to_s], ['42', now.to_i.to_s]]])
|
|
end
|
|
|
|
subject.delete(41, 42)
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', []])
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'and some keys does not exist' do
|
|
it 'removes the existing pair from Redis' do
|
|
described_class.record(42, now)
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', [['42', now.to_i.to_s]]])
|
|
end
|
|
|
|
subject.delete(41, 42)
|
|
|
|
Gitlab::Redis.with do |redis|
|
|
expect(redis.hscan(described_class::KEY, 0)).to eq(['0', []])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'Enumerable' do
|
|
before do
|
|
described_class.record(40, now)
|
|
described_class.record(41, now)
|
|
described_class.record(42, now)
|
|
end
|
|
|
|
it 'allows to read the activities sequentially' do
|
|
expected = { '40' => now.to_i.to_s, '41' => now.to_i.to_s, '42' => now.to_i.to_s }
|
|
|
|
actual = described_class.new.each_with_object({}) do |(key, time), actual|
|
|
actual[key] = time
|
|
end
|
|
|
|
expect(actual).to eq(expected)
|
|
end
|
|
|
|
context 'with many records' do
|
|
before do
|
|
1_000.times { |i| described_class.record(i, now) }
|
|
end
|
|
|
|
it 'is possible to loop through all the records' do
|
|
expect(described_class.new.count).to eq(1_000)
|
|
end
|
|
end
|
|
end
|
|
end
|