-
-
Notifications
You must be signed in to change notification settings - Fork 273
/
digests_spec.rb
180 lines (147 loc) · 4.89 KB
/
digests_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
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# frozen_string_literal: true
require "spec_helper"
RSpec.describe SidekiqUniqueJobs::Digests, redis: :redis do
shared_context "with a regular job" do
let(:expected_keys) do
%w[
uniquejobs:e739dadc23533773b920936336341d01
uniquejobs:56c68cab5038eb57959538866377560d
uniquejobs:8d9e83be14c033be4496295ec2740b91
uniquejobs:23e8715233c2e8f7b578263fcb8ac657
uniquejobs:6722965def15faf3c45cb9e66f994a49
uniquejobs:5bdd20fbbdda2fc28d6461e0eb1f76ee
uniquejobs:c658060a30b761bb12f2133cb7c3f294
uniquejobs:b34294c4802ee2d61c9e3e8dd7f2bab4
uniquejobs:06c3a5b63038c7b724b8603bb02ace99
uniquejobs:62c11d32fd69c691802579682409a483
]
end
before do
(1..10).each do |arg|
MyUniqueJob.perform_async(arg, arg)
end
end
end
shared_context "with a runtime job" do
before do
(1..10).each do |arg|
SimulateLock.lock_while_executing("uniquejobs:abcde#{arg}", arg.to_s)
end
end
let(:expected_keys) do
%w[
uniquejobs:abcde1:RUN
uniquejobs:abcde10:RUN
uniquejobs:abcde2:RUN
uniquejobs:abcde3:RUN
uniquejobs:abcde4:RUN
uniquejobs:abcde5:RUN
uniquejobs:abcde6:RUN
uniquejobs:abcde7:RUN
uniquejobs:abcde8:RUN
uniquejobs:abcde9:RUN
]
end
end
describe ".all" do
subject(:all) { described_class.all(pattern: "*", count: 1000) }
include_context "with a regular job"
it { is_expected.to match_array(expected_keys) }
end
describe ".del" do
subject(:del) { described_class.del(digest: digest, pattern: pattern, count: count) }
let(:digest) { nil }
let(:pattern) { nil }
let(:count) { 1000 }
include_context "with a regular job"
before do
allow(described_class).to receive(:log_info)
end
context "when given a pattern" do
let(:pattern) { "*" }
it "deletes all matching digests" do
expect(del).to eq(10)
expect(described_class.all).to match_array([])
end
it "logs performance info" do
del
expect(described_class)
.to have_received(:log_info).with(
a_string_starting_with("delete_by_pattern(*, count: 1000)")
.and(matching(/completed in (\d\.\d+)ms/)),
)
end
end
context "when given a digest" do
let(:digest) { expected_keys.last }
it "deletes just the specific digest" do
expect(del).to eq(9)
expect(described_class.all).to match_array(expected_keys - [digest])
end
it "logs performance info" do
del
expect(described_class).to have_received(:log_info)
.with(
a_string_starting_with("delete_by_digest(#{digest})")
.and(matching(/completed in (\d\.\d+)ms/)),
)
end
end
end
describe ".delete_by_digest" do
subject(:delete_by_digest) { described_class.delete_by_digest(digest) }
context "when with a regular job" do
include_context "with a regular job"
let(:digest) { expected_keys.last }
before do
allow(described_class).to receive(:log_info)
end
it "deletes just the specific digest" do
expect(delete_by_digest).to eq(9)
expect(described_class.all).to match_array(expected_keys - [digest])
end
it "logs performance info" do
delete_by_digest
expect(described_class).to have_received(:log_info)
.with(
a_string_starting_with("delete_by_digest(#{digest})")
.and(matching(/completed in (\d\.\d+)ms/)),
)
end
end
context "when given a runtime job" do
include_context "with a runtime job"
let(:digest) { expected_keys.last }
it "deletes just the specific digest" do
expect(delete_by_digest).to eq(9)
expect(unique_keys).not_to include(%W[
#{digest}
#{digest}:EXISTS
#{digest}:GRABBED
])
expect(described_class.all).to match_array(expected_keys - [digest])
end
end
end
describe ".delete_by_pattern" do
subject(:delete_by_pattern) { described_class.delete_by_pattern(pattern, count: count) }
let(:pattern) { "*" }
let(:count) { 1000 }
include_context "with a regular job"
before do
allow(described_class).to receive(:log_info)
end
it "deletes all matching digests" do
expect(delete_by_pattern).to eq(10)
expect(described_class.all).to match_array([])
end
it "logs performance info" do
delete_by_pattern
expect(described_class)
.to have_received(:log_info).with(
a_string_starting_with("delete_by_pattern(*, count: 1000)")
.and(matching(/completed in (\d\.\d+)ms/)),
)
end
end
end