test_helper.rb

  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