1# frozen_string_literal: true
2
3require "simplecov"
4SimpleCov.start do
5 add_filter "/test/"
6 enable_coverage :branch
7end
8
9require "minitest/autorun"
10require "webmock/minitest"
11
12MMS_PROXY = "https://proxy.test.example.com/"
13
14_saved_argv = ARGV.dup
15ARGV[0] = "component"
16ARGV[6] = MMS_PROXY
17
18require_relative "../sgx-bwmsgsv2"
19ARGV.replace(_saved_argv)
20
21def SGXbwmsgsv2.write_to_stream(s)
22 @written ||= []
23 @written << s
24end
25
26def reset_stanzas!
27 SGXbwmsgsv2.instance_variable_set(:@written, [])
28end
29
30def reset_redis!
31 REDIS.reset!
32 REDIS.set("catapult_jid-", "HERE")
33 REDIS.set("catapult_jid-+15550000000", "test@example.com")
34 REDIS.set("catapult_cred-test@example.com", [
35 'account', 'user', 'password', '+15550000000'
36 ])
37end
38
39def written
40 SGXbwmsgsv2.instance_variable_get(:@written)
41end
42
43begin
44 require "pry-byebug"
45
46 module Minitest
47 class Test
48 alias old_capture_exceptions capture_exceptions
49 def capture_exceptions
50 old_capture_exceptions do
51 yield
52 rescue Minitest::Skip => e
53 failures << e
54 end
55 end
56 end
57 end
58rescue LoadError, NameError
59 # Just helpers for dev, no big deal if missing
60 nil
61end
62
63
64$VERBOSE = nil
65
66class FakeRedis
67 def initialize(values={})
68 @values = values
69 end
70
71 def reset!(values={})
72 @values = values
73 end
74
75 def set(key, value, *)
76 @values[key] = value
77 EMPromise.resolve("OK")
78 end
79
80 def setex(key, _expiry, value)
81 set(key, value)
82 end
83
84 def del(*keys)
85 keys.each { |key| @values.delete(key) }
86 end
87
88 def mget(*keys)
89 EMPromise.all(keys.map(&method(:get)))
90 end
91
92 def get(key)
93 EMPromise.resolve(@values[key])
94 end
95
96 def getbit(key, bit)
97 get(key).then { |v| v.to_i.to_s(2)[bit].to_i }
98 end
99
100 def bitfield(key, *ops)
101 get(key).then do |v|
102 bits = v.to_i.to_s(2)
103 ops.each_slice(3).map do |(op, encoding, offset)|
104 raise "unsupported bitfield op" unless op == "GET"
105 raise "unsupported bitfield op" unless encoding == "u1"
106
107 bits[offset].to_i
108 end
109 end
110 end
111
112 def hget(key, field)
113 @values.dig(key, field)
114 end
115
116 def hincrby(key, field, incrby)
117 @values[key] ||= {}
118 @values[key][field] ||= 0
119 @values[key][field] += incrby
120 end
121
122 def sadd(key, member)
123 @values[key] ||= Set.new
124 @values[key] << member
125 end
126
127 def srem(key, member)
128 @values[key].delete(member)
129 end
130
131 def scard(key)
132 @values[key]&.size || 0
133 end
134
135 def expire(_, _); end
136
137 def exists(*keys)
138 EMPromise.resolve(
139 @values.select { |k, _| keys.include? k }.size.to_s
140 )
141 end
142
143 def lindex(key, index)
144 get(key).then { |v| v&.fetch(index) }
145 end
146
147 def lrange(key, sindex, eindex)
148 get(key).then { |v| v ? v[sindex..eindex] : [] }
149 end
150
151 def rpush(key, *values)
152 @values[key] ||= []
153 values.each { |v| @values[key].push(v) }
154 end
155
156 def multi
157 end
158
159 def exec
160 end
161
162 def discard
163 end
164
165 def xadd(stream, id, *args)
166 @values[stream] ||= []
167 entry_id = id == "*" ? "#{Time.now.to_i}-0" : id
168 fields = Hash[*args]
169 @values[stream] << { id: entry_id, fields: fields }
170 EMPromise.resolve(entry_id)
171 end
172
173 def stream_entries(stream)
174 EMPromise.resolve(@values[stream] || [])
175 end
176end
177
178REDIS = FakeRedis.new
179
180module Minitest
181 class Test
182 def with_stubs(stubs, &block)
183 if stubs.empty?
184 block.call
185 else
186 obj, method, value = stubs.first
187 obj.stub(method, value) do
188 with_stubs(stubs[1..], &block)
189 end
190 end
191 end
192
193 def self.em(m)
194 alias_method "raw_#{m}", m
195 define_method(m) do
196 $panic = nil
197 e = nil
198 EM.run do
199 Fiber.new {
200 ARGV[0] = "component"
201 ARGV[6] = MMS_PROXY
202 begin
203 send("raw_#{m}")
204 rescue
205 e = $!
206 ensure
207 EM.stop
208 end
209 }.resume
210 end
211 raise e if e
212 end
213 end
214 end
215end