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
 12begin
 13	require "pry-rescue/minitest"
 14	require "pry-reload"
 15
 16	module Minitest
 17		class Test
 18			alias old_capture_exceptions capture_exceptions
 19			def capture_exceptions
 20				old_capture_exceptions do
 21					yield
 22				rescue Minitest::Skip => e
 23					failures << e
 24				end
 25			end
 26		end
 27	end
 28rescue LoadError
 29	# Just helpers for dev, no big deal if missing
 30	nil
 31end
 32
 33$VERBOSE = nil
 34ARGV[0] = "component"
 35
 36class FakeRedis
 37	def initialize(values={})
 38		@values = values
 39	end
 40
 41	def set(key, value, *)
 42		@values[key] = value
 43		EMPromise.resolve("OK")
 44	end
 45
 46	def setex(key, _expiry, value)
 47		set(key, value)
 48	end
 49
 50	def mget(*keys)
 51		EMPromise.all(keys.map(&method(:get)))
 52	end
 53
 54	def get(key)
 55		EMPromise.resolve(@values[key])
 56	end
 57
 58	def getbit(key, bit)
 59		get(key).then { |v| v.to_i.to_s(2)[bit].to_i }
 60	end
 61
 62	def bitfield(key, *ops)
 63		get(key).then do |v|
 64			bits = v.to_i.to_s(2)
 65			ops.each_slice(3).map do |(op, encoding, offset)|
 66				raise "unsupported bitfield op" unless op == "GET"
 67				raise "unsupported bitfield op" unless encoding == "u1"
 68
 69				bits[offset].to_i
 70			end
 71		end
 72	end
 73
 74	def hget(key, field)
 75		@values.dig(key, field)
 76	end
 77
 78	def hincrby(key, field, incrby)
 79		@values[key] ||= {}
 80		@values[key][field] ||= 0
 81		@values[key][field] += incrby
 82	end
 83
 84	def sadd(key, member)
 85		@values[key] ||= Set.new
 86		@values[key] << member
 87	end
 88
 89	def srem(key, member)
 90		@values[key].delete(member)
 91	end
 92
 93	def scard(key)
 94		@values[key]&.size || 0
 95	end
 96
 97	def expire(_, _); end
 98
 99	def exists(*keys)
100		EMPromise.resolve(
101			@values.select { |k, _| keys.include? k }.size.to_s
102		)
103	end
104
105	def lindex(key, index)
106		get(key).then { |v| v&.fetch(index) }
107	end
108
109	def lrange(key, sindex, eindex)
110		get(key).then { |v| v ? v[sindex..eindex] : [] }
111	end
112end
113
114REDIS = FakeRedis.new
115
116module Minitest
117	class Test
118		def self.em(m)
119			alias_method "raw_#{m}", m
120			define_method(m) do
121				$panic = nil
122				e = nil
123				EM.run do
124					Fiber.new {
125						begin
126							send("raw_#{m}")
127						rescue
128							e = $!
129						ensure
130							EM.stop
131						end
132					}.resume
133				end
134				raise e if e
135			end
136		end
137	end
138end