qs 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,30 @@
1
1
  require 'assert'
2
2
  require 'qs/event_handler'
3
3
 
4
- require 'qs/event'
4
+ require 'much-plugin'
5
+ require 'qs'
5
6
  require 'qs/message_handler'
7
+ require 'qs/test_runner'
6
8
 
7
9
  module Qs::EventHandler
8
10
 
9
11
  class UnitTests < Assert::Context
12
+ include Qs::EventHandler::TestHelpers
13
+
10
14
  desc "Qs::EventHandler"
11
15
  setup do
16
+ Qs.init
12
17
  @handler_class = Class.new{ include Qs::EventHandler }
13
18
  end
19
+ teardown do
20
+ Qs.reset!
21
+ end
14
22
  subject{ @handler_class }
15
23
 
24
+ should "use much-plugin" do
25
+ assert_includes MuchPlugin, Qs::Worker
26
+ end
27
+
16
28
  should "be a message handler" do
17
29
  assert_includes Qs::MessageHandler, subject
18
30
  end
@@ -22,42 +34,63 @@ module Qs::EventHandler
22
34
  class InitTests < UnitTests
23
35
  desc "when init"
24
36
  setup do
25
- @runner = FakeRunner.new
26
- @handler = TestEventHandler.new(@runner)
37
+ @event = Factory.event
38
+ @runner = test_runner(TestEventHandler, :message => @event)
39
+ @handler = @runner.handler
27
40
  end
28
41
  subject{ @handler }
29
42
 
30
- should "know its event, channel, name and published at" do
31
- assert_equal @runner.message, subject.public_event
32
- assert_equal subject.public_event.channel, subject.public_event_channel
33
- assert_equal subject.public_event.name, subject.public_event_name
34
- assert_equal subject.public_event.published_at, subject.public_event_published_at
43
+ should "have private helpers for accessing event attrs" do
44
+ assert_equal @event, subject.instance_eval{ event }
45
+ assert_equal @event.channel, subject.instance_eval{ event_channel }
46
+ assert_equal @event.name, subject.instance_eval{ event_name }
47
+ assert_equal @event.published_at, subject.instance_eval{ event_published_at }
35
48
  end
36
49
 
37
- should "have a custom inspect" do
38
- reference = '0x0%x' % (subject.object_id << 1)
39
- expected = "#<#{subject.class}:#{reference} " \
40
- "@event=#{@handler.public_event.inspect}>"
41
- assert_equal expected, subject.inspect
50
+ end
51
+
52
+ class TestHelpersTests < UnitTests
53
+ desc "TestHelpers"
54
+ setup do
55
+ Qs.init
56
+ event = Factory.event
57
+ @args = {
58
+ :message => event,
59
+ :params => event.params
60
+ }
61
+
62
+ context_class = Class.new{ include Qs::EventHandler::TestHelpers }
63
+ @context = context_class.new
42
64
  end
65
+ teardown do
66
+ Qs.reset!
67
+ end
68
+ subject{ @context }
43
69
 
44
- end
70
+ should have_imeths :test_runner, :test_handler
45
71
 
46
- class TestEventHandler
47
- include Qs::EventHandler
72
+ should "build a test runner for a given handler class" do
73
+ runner = subject.test_runner(@handler_class, @args)
48
74
 
49
- def public_event; event; end
50
- def public_event_channel; event_channel; end
51
- def public_event_name; event_name; end
52
- def public_event_published_at; event_published_at; end
53
- end
75
+ assert_kind_of Qs::TestRunner, runner
76
+ assert_equal @handler_class, runner.handler_class
77
+ assert_equal @args[:message], runner.message
78
+ assert_equal @args[:params], runner.params
79
+ end
54
80
 
55
- class FakeRunner
56
- attr_accessor :message
81
+ should "return an initialized handler instance" do
82
+ handler = subject.test_handler(@handler_class, @args)
83
+ assert_kind_of @handler_class, handler
57
84
 
58
- def initialize
59
- @message = Factory.event
85
+ exp = subject.test_runner(@handler_class, @args).handler
86
+ assert_equal exp, handler
60
87
  end
88
+
89
+ end
90
+
91
+ class TestEventHandler
92
+ include Qs::EventHandler
93
+
61
94
  end
62
95
 
63
96
  end
@@ -1,17 +1,30 @@
1
1
  require 'assert'
2
2
  require 'qs/job_handler'
3
3
 
4
+ require 'much-plugin'
5
+ require 'qs'
4
6
  require 'qs/message_handler'
7
+ require 'qs/test_runner'
5
8
 
6
9
  module Qs::JobHandler
7
10
 
8
11
  class UnitTests < Assert::Context
12
+ include Qs::JobHandler::TestHelpers
13
+
9
14
  desc "Qs::JobHandler"
10
15
  setup do
16
+ Qs.init
11
17
  @handler_class = Class.new{ include Qs::JobHandler }
12
18
  end
19
+ teardown do
20
+ Qs.reset!
21
+ end
13
22
  subject{ @handler_class }
14
23
 
24
+ should "use much-plugin" do
25
+ assert_includes MuchPlugin, Qs::Worker
26
+ end
27
+
15
28
  should "be a message handler" do
16
29
  assert_includes Qs::MessageHandler, subject
17
30
  end
@@ -21,40 +34,62 @@ module Qs::JobHandler
21
34
  class InitTests < UnitTests
22
35
  desc "when init"
23
36
  setup do
24
- @runner = FakeRunner.new
25
- @handler = TestJobHandler.new(@runner)
37
+ @job = Factory.job
38
+ @runner = test_runner(TestJobHandler, :message => @job)
39
+ @handler = @runner.handler
26
40
  end
27
41
  subject{ @handler }
28
42
 
29
- should "know its job, job name and job created at" do
30
- assert_equal @runner.message, subject.public_job
31
- assert_equal subject.public_job.name, subject.public_job_name
32
- assert_equal subject.public_job.created_at, subject.public_job_created_at
43
+ should "have private helpers for accessing job attrs" do
44
+ assert_equal @job, subject.instance_eval{ job }
45
+ assert_equal @job.name, subject.instance_eval{ job_name }
46
+ assert_equal @job.created_at, subject.instance_eval{ job_created_at }
33
47
  end
34
48
 
35
- should "have a custom inspect" do
36
- reference = '0x0%x' % (subject.object_id << 1)
37
- exp = "#<#{subject.class}:#{reference} " \
38
- "@job=#{@handler.public_job.inspect}>"
39
- assert_equal exp, subject.inspect
49
+ end
50
+
51
+ class TestHelpersTests < UnitTests
52
+ desc "TestHelpers"
53
+ setup do
54
+ Qs.init
55
+ job = Factory.job
56
+ @args = {
57
+ :message => job,
58
+ :params => job.params
59
+ }
60
+
61
+ context_class = Class.new{ include Qs::JobHandler::TestHelpers }
62
+ @context = context_class.new
40
63
  end
64
+ teardown do
65
+ Qs.reset!
66
+ end
67
+ subject{ @context }
41
68
 
42
- end
69
+ should have_imeths :test_runner, :test_handler
43
70
 
44
- class TestJobHandler
45
- include Qs::JobHandler
71
+ should "build a test runner for a given handler class" do
72
+ runner = subject.test_runner(@handler_class, @args)
46
73
 
47
- def public_job; job; end
48
- def public_job_name; job_name; end
49
- def public_job_created_at; job_created_at; end
50
- end
74
+ assert_kind_of Qs::TestRunner, runner
75
+ assert_equal @handler_class, runner.handler_class
76
+ assert_equal @args[:message], runner.message
77
+ assert_equal @args[:params], runner.params
78
+ end
51
79
 
52
- class FakeRunner
53
- attr_accessor :message
80
+ should "return an initialized handler instance" do
81
+ handler = subject.test_handler(@handler_class, @args)
82
+ assert_kind_of @handler_class, handler
54
83
 
55
- def initialize
56
- @message = Factory.job
84
+ exp = subject.test_runner(@handler_class, @args).handler
85
+ assert_equal exp, handler
57
86
  end
87
+
88
+ end
89
+
90
+ class TestJobHandler
91
+ include Qs::JobHandler
92
+
58
93
  end
59
94
 
60
95
  end
@@ -1,13 +1,22 @@
1
1
  require 'assert'
2
2
  require 'qs/message_handler'
3
3
 
4
+ require 'much-plugin'
5
+ require 'test/support/message_handler'
6
+
4
7
  module Qs::MessageHandler
5
8
 
6
9
  class UnitTests < Assert::Context
10
+ include Qs::MessageHandler::TestHelpers
11
+
7
12
  desc "Qs::MessageHandler"
8
13
  setup do
14
+ Qs.init
9
15
  @handler_class = Class.new{ include Qs::MessageHandler }
10
16
  end
17
+ teardown do
18
+ Qs.reset!
19
+ end
11
20
  subject{ @handler_class }
12
21
 
13
22
  should have_imeths :timeout
@@ -21,6 +30,10 @@ module Qs::MessageHandler
21
30
  should have_imeths :prepend_before_init, :prepend_after_init
22
31
  should have_imeths :prepend_before_run, :prepend_after_run
23
32
 
33
+ should "use much-plugin" do
34
+ assert_includes MuchPlugin, Qs::Worker
35
+ end
36
+
24
37
  should "allow reading/writing its timeout" do
25
38
  assert_nil subject.timeout
26
39
  value = Factory.integer
@@ -147,20 +160,20 @@ module Qs::MessageHandler
147
160
  class InitTests < UnitTests
148
161
  desc "when init"
149
162
  setup do
150
- @runner = FakeRunner.new
151
- @handler = TestMessageHandler.new(@runner)
163
+ @runner = test_runner(TestMessageHandler)
164
+ @handler = @runner.handler
152
165
  end
153
166
  subject{ @handler }
154
167
 
155
- should have_imeths :init, :init!, :run, :run!
168
+ should have_imeths :qs_init, :init!, :qs_run, :run!
169
+ should have_imeths :qs_run_callback
156
170
 
157
171
  should "know its params and logger" do
158
- assert_equal @runner.params, subject.public_params
159
172
  assert_equal @runner.logger, subject.public_logger
173
+ assert_equal @runner.params, subject.public_params
160
174
  end
161
175
 
162
- should "call `init!` and its before/after init callbacks using `init`" do
163
- subject.init
176
+ should "have called `init!` and its before/after init callbacks" do
164
177
  assert_equal 1, subject.first_before_init_call_order
165
178
  assert_equal 2, subject.second_before_init_call_order
166
179
  assert_equal 3, subject.init_call_order
@@ -168,17 +181,65 @@ module Qs::MessageHandler
168
181
  assert_equal 5, subject.second_after_init_call_order
169
182
  end
170
183
 
171
- should "call `run!` and its before/after run callbacks using `run`" do
172
- subject.run
173
- assert_equal 1, subject.first_before_run_call_order
174
- assert_equal 2, subject.second_before_run_call_order
175
- assert_equal 3, subject.run_call_order
176
- assert_equal 4, subject.first_after_run_call_order
177
- assert_equal 5, subject.second_after_run_call_order
184
+ should "not have called `run!` and its before/after run callbacks" do
185
+ assert_nil subject.first_before_run_call_order
186
+ assert_nil subject.second_before_run_call_order
187
+ assert_nil subject.run_call_order
188
+ assert_nil subject.first_after_run_call_order
189
+ assert_nil subject.second_after_run_call_order
190
+ end
191
+
192
+ should "run its callbacks with `qs_run_callback`" do
193
+ subject.qs_run_callback 'before_run'
194
+ assert_equal 6, subject.first_before_run_call_order
195
+ assert_equal 7, subject.second_before_run_call_order
196
+ end
197
+
198
+ should "know if it is equal to another message handler" do
199
+ handler = TestMessageHandler.new(@runner)
200
+ assert_equal handler, subject
201
+
202
+ handler = Class.new{ include Qs::MessageHandler }.new(Factory.string)
203
+ assert_not_equal handler, subject
204
+ end
205
+
206
+ end
207
+
208
+ class RunTests < InitTests
209
+ desc "and run"
210
+ setup do
211
+ @handler.qs_run
212
+ end
213
+
214
+ should "call `run!` and it's callbacks" do
215
+ assert_equal 6, subject.first_before_run_call_order
216
+ assert_equal 7, subject.second_before_run_call_order
217
+ assert_equal 8, subject.run_call_order
218
+ assert_equal 9, subject.first_after_run_call_order
219
+ assert_equal 10, subject.second_after_run_call_order
220
+ end
221
+
222
+ end
223
+
224
+ class PrivateHelpersTests < InitTests
225
+ setup do
226
+ @something = Factory.string
227
+ end
228
+
229
+ should "call to the runner for its logger" do
230
+ stub_runner_with_something_for(:logger)
231
+ assert_equal @runner.logger, subject.instance_eval{ logger }
178
232
  end
179
233
 
180
- should "raise a not implemented error when `run!` by default" do
181
- assert_raises(NotImplementedError){ @handler_class.new(@runner).run! }
234
+ should "call to the runner for its params" do
235
+ stub_runner_with_something_for(:params)
236
+ assert_equal @runner.params, subject.instance_eval{ params }
237
+ end
238
+
239
+ private
240
+
241
+ def stub_runner_with_something_for(meth)
242
+ Assert.stub(@runner, meth){ @something }
182
243
  end
183
244
 
184
245
  end
@@ -223,13 +284,4 @@ module Qs::MessageHandler
223
284
  end
224
285
  end
225
286
 
226
- class FakeRunner
227
- attr_accessor :params, :logger
228
-
229
- def initialize
230
- @params = Factory.string
231
- @logger = Factory.string
232
- end
233
- end
234
-
235
287
  end
@@ -142,21 +142,6 @@ class Qs::PayloadHandler
142
142
 
143
143
  end
144
144
 
145
- class RunWithExceptionWhileDebuggingTests < RunWithExceptionSetupTests
146
- desc "and run with an exception"
147
- setup do
148
- ENV['QS_DEBUG'] = '1'
149
- end
150
- teardown do
151
- ENV.delete('QS_DEBUG')
152
- end
153
-
154
- should "raise the exception" do
155
- assert_raises(@route_exception.class){ @payload_handler.run }
156
- end
157
-
158
- end
159
-
160
145
  class LoggingJobSetupTests < InitSetupTests
161
146
  desc "and run with a job queue item"
162
147
  setup do
@@ -210,9 +195,11 @@ class Qs::PayloadHandler
210
195
  should "log the error" do
211
196
  logger_spy = subject.logger
212
197
  exception = @queue_item.exception
213
- backtrace = exception.backtrace.join("\n")
214
- exp = "[Qs] #{exception.class}: #{exception.message}\n#{backtrace}"
198
+ exp = "[Qs] #{exception.class}: #{exception.message}"
215
199
  assert_equal exp, logger_spy.verbose.error_logged.first
200
+ exception.backtrace.each do |l|
201
+ assert_includes "[Qs] #{l}", logger_spy.verbose.error_logged
202
+ end
216
203
 
217
204
  exp = JobSummaryLine.new(@job, {
218
205
  'time' => @queue_item.time_taken,
@@ -282,9 +269,11 @@ class Qs::PayloadHandler
282
269
  should "log the error" do
283
270
  logger_spy = subject.logger
284
271
  exception = @queue_item.exception
285
- backtrace = exception.backtrace.join("\n")
286
- exp = "[Qs] #{exception.class}: #{exception.message}\n#{backtrace}"
272
+ exp = "[Qs] #{exception.class}: #{exception.message}"
287
273
  assert_equal exp, logger_spy.verbose.error_logged.first
274
+ exception.backtrace.each do |l|
275
+ assert_includes "[Qs] #{l}", logger_spy.verbose.error_logged
276
+ end
288
277
 
289
278
  exp = EventSummaryLine.new(@event, {
290
279
  'time' => @queue_item.time_taken,
@@ -320,9 +309,11 @@ class Qs::PayloadHandler
320
309
 
321
310
  logger_spy = subject.logger
322
311
  exception = @queue_item.exception
323
- backtrace = exception.backtrace.join("\n")
324
- exp = "[Qs] #{exception.class}: #{exception.message}\n#{backtrace}"
312
+ exp = "[Qs] #{exception.class}: #{exception.message}"
325
313
  assert_equal exp, logger_spy.verbose.error_logged.first
314
+ exception.backtrace.each do |l|
315
+ assert_includes "[Qs] #{l}", logger_spy.verbose.error_logged
316
+ end
326
317
 
327
318
  exp = UnknownSummaryLine.new({
328
319
  'time' => @queue_item.time_taken,
@@ -10,7 +10,8 @@ class Qs::QsRunner
10
10
  desc "Qs::QsRunner"
11
11
  setup do
12
12
  Qs.config.timeout = Factory.integer
13
- @runner_class = Qs::QsRunner
13
+ @handler_class = TestMessageHandler
14
+ @runner_class = Qs::QsRunner
14
15
  end
15
16
  teardown do
16
17
  Qs.reset!
@@ -27,7 +28,6 @@ class Qs::QsRunner
27
28
  class InitTests < UnitTests
28
29
  desc "when init"
29
30
  setup do
30
- @handler_class = TestMessageHandler
31
31
  @runner = @runner_class.new(@handler_class)
32
32
  end
33
33
  subject{ @runner }
@@ -66,17 +66,17 @@ class Qs::QsRunner
66
66
  assert_equal [@runner.timeout], @timeout_called_with
67
67
  end
68
68
 
69
- should "run the handlers before callbacks" do
69
+ should "run the handler's before callbacks" do
70
70
  assert_equal 1, @handler.first_before_call_order
71
71
  assert_equal 2, @handler.second_before_call_order
72
72
  end
73
73
 
74
- should "call the handlers init and run methods" do
74
+ should "call the handler's init and run methods" do
75
75
  assert_equal 3, @handler.init_call_order
76
76
  assert_equal 4, @handler.run_call_order
77
77
  end
78
78
 
79
- should "run the handlers after callbacks" do
79
+ should "run the handler's after callbacks" do
80
80
  assert_equal 5, @handler.first_after_call_order
81
81
  assert_equal 6, @handler.second_after_call_order
82
82
  end
@@ -157,10 +157,8 @@ class Qs::QsRunner
157
157
 
158
158
  private
159
159
 
160
- def next_call_order
161
- @order ||= 0
162
- @order += 1
163
- end
160
+ def next_call_order; @order ||= 0; @order += 1; end
161
+
164
162
  end
165
163
 
166
164
  end
@@ -24,7 +24,7 @@ class Qs::Runner
24
24
  subject{ @runner }
25
25
 
26
26
  should have_readers :handler_class, :handler
27
- should have_readers :message, :params, :logger
27
+ should have_readers :logger, :message, :params
28
28
  should have_imeths :run
29
29
 
30
30
  should "know its handler class and handler" do
@@ -32,25 +32,27 @@ class Qs::Runner
32
32
  assert_instance_of @handler_class, subject.handler
33
33
  end
34
34
 
35
- should "not set its message, params or logger by default" do
35
+ should "default its attrs" do
36
+ assert_instance_of Qs::NullLogger, subject.logger
36
37
  assert_nil subject.message
37
38
  assert_equal({}, subject.params)
38
- assert_instance_of Qs::NullLogger, subject.logger
39
39
  end
40
40
 
41
- should "allow passing a message, params and logger" do
41
+ should "know its attrs" do
42
42
  args = {
43
+ :logger => Factory.string,
43
44
  :message => Factory.string,
44
- :params => Factory.string,
45
- :logger => Factory.string
45
+ :params => Factory.string
46
46
  }
47
+
47
48
  runner = @runner_class.new(@handler_class, args)
49
+
50
+ assert_equal args[:logger], runner.logger
48
51
  assert_equal args[:message], runner.message
49
52
  assert_equal args[:params], runner.params
50
- assert_equal args[:logger], runner.logger
51
53
  end
52
54
 
53
- should "raise a not implemented error when run" do
55
+ should "not implement its run method" do
54
56
  assert_raises(NotImplementedError){ subject.run }
55
57
  end
56
58
 
@@ -58,6 +60,7 @@ class Qs::Runner
58
60
 
59
61
  class TestJobHandler
60
62
  include Qs::JobHandler
63
+
61
64
  end
62
65
 
63
66
  end
@@ -28,10 +28,10 @@ class Qs::TestRunner
28
28
  setup do
29
29
  @handler_class = TestMessageHandler
30
30
  @args = {
31
- :message => Factory.message,
32
- :params => { Factory.string => Factory.string },
33
- :logger => Factory.string,
34
- :flag => Factory.boolean
31
+ :logger => Factory.string,
32
+ :message => Factory.message,
33
+ :params => { Factory.string => Factory.string },
34
+ :custom_value => Factory.integer
35
35
  }
36
36
  @original_args = @args.dup
37
37
  @runner = @runner_class.new(@handler_class, @args)
@@ -41,33 +41,33 @@ class Qs::TestRunner
41
41
 
42
42
  should have_imeths :run
43
43
 
44
- should "know its message, params and logger" do
44
+ should "know its standard args" do
45
+ assert_equal @args[:logger], subject.logger
45
46
  assert_equal @args[:message], subject.message
46
47
  assert_equal @args[:params], subject.params
47
- assert_equal @args[:logger], subject.logger
48
48
  end
49
49
 
50
- should "write extra args to its message handler" do
51
- assert_equal @args[:flag], @handler.flag
50
+ should "write any non-standard args to its handler" do
51
+ assert_equal @args[:custom_value], @handler.custom_value
52
52
  end
53
53
 
54
54
  should "not alter the args passed to it" do
55
55
  assert_equal @original_args, @args
56
56
  end
57
57
 
58
- should "not call its message handler's before callbacks" do
58
+ should "not call its handler's before callbacks" do
59
59
  assert_nil @handler.before_called
60
60
  end
61
61
 
62
- should "call its message handler's init" do
62
+ should "call its handler's init" do
63
63
  assert_true @handler.init_called
64
64
  end
65
65
 
66
- should "not run its message handler" do
66
+ should "not call its handler's run" do
67
67
  assert_nil @handler.run_called
68
68
  end
69
69
 
70
- should "not call its message handler's after callbacks" do
70
+ should "not call its handler's after callbacks" do
71
71
  assert_nil @handler.after_called
72
72
  end
73
73
 
@@ -194,7 +194,7 @@ class Qs::TestRunner
194
194
 
195
195
  attr_reader :before_called, :after_called
196
196
  attr_reader :init_called, :run_called
197
- attr_accessor :flag
197
+ attr_accessor :custom_value
198
198
 
199
199
  before{ @before_called = true }
200
200
  after{ @after_called = true }
@@ -206,6 +206,7 @@ class Qs::TestRunner
206
206
  def run!
207
207
  @run_called = true
208
208
  end
209
+
209
210
  end
210
211
 
211
212
  class TestJobHandler