@@ -28,6 +28,137 @@ module QueueBus
28
28
end . not_to raise_error
29
29
end
30
30
31
+ describe '#on_heartbeat' do
32
+ let ( :dispatch ) { Dispatch . new ( 'heartbeat' ) }
33
+ let ( :event ) { { bus_event_type : :heartbeat_minutes } }
34
+ let ( :event_name ) { 'my-event' }
35
+
36
+ context 'when not declaring anything' do
37
+ before do
38
+ dispatch . on_heartbeat event_name do |_event |
39
+ Runner2 . run ( { } )
40
+ end
41
+ end
42
+
43
+ it 'runs on every heart beat' do
44
+ ( 0 ..24 ) . each do |hour |
45
+ ( 0 ..60 ) . each do |minute |
46
+ expect do
47
+ dispatch . execute (
48
+ event_name , event . merge ( 'hour' => hour , 'minute' => minute )
49
+ )
50
+ end . to change ( Runner2 , :value ) . by ( 1 )
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ context 'when running on hour 8' do
57
+ before do
58
+ dispatch . on_heartbeat event_name , hour : 8 do |_event |
59
+ Runner2 . run ( { } )
60
+ end
61
+ end
62
+
63
+ it 'subscribes to hour 8' do
64
+ expect ( dispatch . subscriptions . all . first . matcher . filters ) . to eq ( 'bus_event_type' => 'heartbeat_minutes' , 'hour' => '8' )
65
+ end
66
+ end
67
+
68
+ context 'when running on minute 4' do
69
+ before do
70
+ dispatch . on_heartbeat event_name , minute : 4 do |_event |
71
+ Runner2 . run ( { } )
72
+ end
73
+ end
74
+
75
+ it 'subscribes to minute 4' do
76
+ expect ( dispatch . subscriptions . all . first . matcher . filters ) . to eq ( 'bus_event_type' => 'heartbeat_minutes' , 'minute' => '4' )
77
+ end
78
+ end
79
+
80
+ context 'when running on minute 4 and hour 8' do
81
+ before do
82
+ dispatch . on_heartbeat event_name , hour : 8 , minute : 4 do |_event |
83
+ Runner2 . run ( { } )
84
+ end
85
+ end
86
+
87
+ it 'subscribes to minute 4 and hour 8' do
88
+ expect ( dispatch . subscriptions . all . first . matcher . filters )
89
+ . to eq ( 'bus_event_type' => 'heartbeat_minutes' , 'minute' => '4' , 'hour' => '8' )
90
+ end
91
+ end
92
+
93
+ context 'when declaring minute intervals' do
94
+ before do
95
+ dispatch . on_heartbeat event_name , minute_interval : 5 do |_event |
96
+ Runner2 . run ( { } )
97
+ end
98
+ end
99
+
100
+ it 'runs the runner when the minute buzzes (modulos to 5)' do
101
+ ( 0 ..60 ) . each do |minute |
102
+ if minute % 5 == 0
103
+ expect { dispatch . execute ( event_name , event . merge ( 'minute' => minute ) ) }
104
+ . to change ( Runner2 , :value ) . by ( 1 )
105
+ else
106
+ expect { dispatch . execute ( event_name , event . merge ( 'minute' => minute ) ) }
107
+ . not_to change ( Runner2 , :value )
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ context 'when declaring hour intervals' do
114
+ before do
115
+ dispatch . on_heartbeat event_name , hour_interval : 3 do |_event |
116
+ Runner2 . run ( { } )
117
+ end
118
+ end
119
+
120
+ it 'runs the runner when the hour fizzes (modulos to 3)' do
121
+ ( 0 ..60 ) . each do |hour |
122
+ if hour % 3 == 0
123
+ expect { dispatch . execute ( event_name , event . merge ( 'hour' => hour ) ) }
124
+ . to change ( Runner2 , :value ) . by ( 1 )
125
+ else
126
+ expect { dispatch . execute ( event_name , event . merge ( 'hour' => hour ) ) }
127
+ . not_to change ( Runner2 , :value )
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ context 'when declaring hour and minute intervals' do
134
+ before do
135
+ dispatch . on_heartbeat event_name , minute_interval : 5 , hour_interval : 3 do |_event |
136
+ Runner2 . run ( { } )
137
+ end
138
+ end
139
+
140
+ it 'runs the runner when the time fizzbuzzes (modulos to 3 and 5)' do
141
+ ( 0 ..24 ) . each do |hour |
142
+ ( 0 ..60 ) . each do |minute |
143
+ if hour % 3 == 0 && minute % 5 == 0
144
+ expect do
145
+ dispatch . execute (
146
+ event_name , event . merge ( 'hour' => hour , 'minute' => minute )
147
+ )
148
+ end . to change ( Runner2 , :value ) . by ( 1 )
149
+ else
150
+ expect do
151
+ dispatch . execute (
152
+ event_name , event . merge ( 'hour' => hour , 'minute' => minute )
153
+ )
154
+ end . not_to change ( Runner2 , :value )
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
161
+
31
162
describe 'Top Level' do
32
163
before ( :each ) do
33
164
QueueBus . dispatch ( 'testit' ) do
0 commit comments