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, NameError
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 reset!(values={})
42 @values = values
43 end
44
45 def set(key, value, *)
46 @values[key] = value
47 EMPromise.resolve("OK")
48 end
49
50 def setex(key, _expiry, value)
51 set(key, value)
52 end
53
54 def del(*keys)
55 keys.each { |key| @values.delete(key) }
56 end
57
58 def mget(*keys)
59 EMPromise.all(keys.map(&method(:get)))
60 end
61
62 def get(key)
63 EMPromise.resolve(@values[key])
64 end
65
66 def getbit(key, bit)
67 get(key).then { |v| v.to_i.to_s(2)[bit].to_i }
68 end
69
70 def bitfield(key, *ops)
71 get(key).then do |v|
72 bits = v.to_i.to_s(2)
73 ops.each_slice(3).map do |(op, encoding, offset)|
74 raise "unsupported bitfield op" unless op == "GET"
75 raise "unsupported bitfield op" unless encoding == "u1"
76
77 bits[offset].to_i
78 end
79 end
80 end
81
82 def hget(key, field)
83 @values.dig(key, field)
84 end
85
86 def hincrby(key, field, incrby)
87 @values[key] ||= {}
88 @values[key][field] ||= 0
89 @values[key][field] += incrby
90 end
91
92 def sadd(key, member)
93 @values[key] ||= Set.new
94 @values[key] << member
95 end
96
97 def srem(key, member)
98 @values[key].delete(member)
99 end
100
101 def scard(key)
102 @values[key]&.size || 0
103 end
104
105 def expire(_, _); end
106
107 def exists(*keys)
108 EMPromise.resolve(
109 @values.select { |k, _| keys.include? k }.size.to_s
110 )
111 end
112
113 def lindex(key, index)
114 get(key).then { |v| v&.fetch(index) }
115 end
116
117 def lrange(key, sindex, eindex)
118 get(key).then { |v| v ? v[sindex..eindex] : [] }
119 end
120
121 def rpush(key, *values)
122 @values[key] ||= []
123 values.each { |v| @values[key].push(v) }
124 end
125
126 def multi
127 end
128
129 def exec
130 end
131
132 def discard
133 end
134end
135
136REDIS = FakeRedis.new
137
138module Minitest
139 class Test
140 def self.em(m)
141 alias_method "raw_#{m}", m
142 define_method(m) do
143 $panic = nil
144 e = nil
145 EM.run do
146 Fiber.new {
147 begin
148 send("raw_#{m}")
149 rescue
150 e = $!
151 ensure
152 EM.stop
153 end
154 }.resume
155 end
156 raise e if e
157 end
158 end
159 end
160end