test_helper.rb

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