-
Notifications
You must be signed in to change notification settings - Fork 1
/
rrstat_spec.rb
92 lines (71 loc) · 2.33 KB
/
rrstat_spec.rb
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
require 'spec'
require 'delorean'
require 'rrstat'
require 'time'
describe RRStat do
include Delorean
let(:rr) { RRStat.new(:precision => 10, :buckets => 6) }
before(:each) { time_travel_to("Jan 1 2010") }
before(:each) { rr.flushdb }
it "should initialize db" do
lambda {
RRStat.new(:precision => 10, :buckets => 6)
}.should_not raise_error
end
it "should return score of item" do
rr.score("test", "random_key").should == 0
end
it "should increment buckets within correct epoch" do
rr.epoch("test").should match(/test:0/)
rr.incr("test", "key")
rr.score("test", "key").should == 1
rr.incr("test", "key", 2)
rr.score("test", "key").should == 3
# advance to next epoch
time_travel_to(Time.now + 10) do
rr.epoch("test").should match(/test:1/)
rr.incr("test", "key")
rr.score("test", "key").should == 4
end
# advance 5 epochs, to scroll original incr's off the list
time_travel_to(Time.now + 60) do
rr.epoch("test").should match(/test:0/)
rr.incr("test", "key")
rr.score("test", "key").should == 2
end
end
it "should return top N items from all epochs" do
rr.incr("test", "key1", 1)
rr.incr("test", "key2", 3)
# advance to next epoch
time_travel_to(Time.now + 10) do
rr.epoch("test").should match(/test:1/)
rr.incr("test", "key3", 5)
rr.first("test", 3).should == ["key3", "key2", "key1"]
rr.first("test", 3, :with_scores => true).should == {"key3"=>"5", "key2"=>"3", "key1"=>"1"}
end
end
it "should return last N items from all epochs" do
rr.incr("test", "key1", 1)
rr.incr("test", "key2", 3)
# advance to next epoch
time_travel_to(Time.now + 10) do
rr.epoch("test").should match(/test:1/)
rr.incr("test", "key3", 5)
rr.last("test", 3).should == ["key1", "key2", "key3"]
rr.last("test", 3, :with_scores => true).should == {"key1"=>"1", "key2"=>"3", "key3"=>"5"}
end
end
it "should erase key from all epochs" do
rr.incr("test", "key", 1)
rr.score("test", "key").should == 1
# advance to next epoch
time_travel_to(Time.now + 10) do
rr.epoch("test").should match(/test:1/)
rr.incr("test", "key")
rr.score("test", "key").should == 2
rr.delete("test", "key")
rr.score("test", "key").should == 0
end
end
end