/
mixin_test.rb
123 lines (96 loc) · 2.31 KB
/
mixin_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# frozen_string_literal: true
require "test_helper"
module Limiter
class MixinTest < Minitest::Test
include AssertElapsed
COUNT = 50
RATE = 1
INTERVAL = 1
class MixinTestClass
extend Limiter::Mixin
@limited = 0
class << self
attr_reader :limited
end
limit_method :tick, rate: RATE, interval: INTERVAL
limit_method :tock, rate: RATE, interval: INTERVAL
limit_method :ticktock, rate: RATE, interval: INTERVAL do
@limited += 1
end
attr_reader :ticks
def initialize
@ticks = 0
end
def tick(count = 1)
@ticks += count
end
def tock(count: 1)
@ticks += count
end
def ticktock
@ticks += 2
end
end
def setup
super
RateQueue.any_instance.stubs(:clock).returns(FakeClock)
@object = MixinTestClass.new
end
def test_method_is_rate_limited
assert_elapsed(COUNT.to_f / RATE - 1) do
COUNT.times do
@object.tick
end
end
end
def test_method_is_rate_limited_across_instances
assert_elapsed(COUNT.to_f / RATE - 1) do
COUNT.times do
MixinTestClass.new.tick
end
end
end
def test_method_is_not_rate_limited
assert_elapsed(0) do
COUNT.times do
@object.tick
MixinTestClass.reset_tick_limit!
end
end
end
def test_method_is_not_rate_limited_across_instances
assert_elapsed(0) do
COUNT.times do
MixinTestClass.new.tick
MixinTestClass.reset_tick_limit!
end
end
end
def test_original_method_is_called
COUNT.times do
@object.tick
end
assert_equal(COUNT, @object.ticks)
end
def test_arguments_are_passed
@object.tick(123)
assert_equal(123, @object.ticks)
end
def test_default_keyword_arguments_are_passed
COUNT.times do
@object.tock
end
assert_equal(COUNT, @object.ticks)
end
def test_keyword_arguments_are_passed
@object.tock(count: 321)
assert_equal(321, @object.ticks)
end
def test_block_was_called_on_rate_limit
@object.ticktock
@object.ticktock
@object.ticktock
assert_equal(2, @object.class.limited)
end
end
end