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