banter 1.4.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +1 -1
- data/Gemfile +1 -4
- data/README.md +0 -33
- data/Rakefile +0 -28
- data/banter.gemspec +2 -5
- data/lib/banter.rb +1 -1
- data/lib/banter/configuration.rb +2 -4
- data/lib/banter/notifier.rb +16 -0
- data/lib/banter/publisher.rb +1 -1
- data/lib/banter/railtie.rb +0 -4
- data/lib/banter/server/client_queue_listener.rb +4 -37
- data/lib/banter/server/rabbit_mq_subscriber.rb +6 -6
- data/lib/banter/server/subscriber_server.rb +0 -13
- data/lib/banter/version.rb +1 -1
- data/spec/banter/notifier_spec.rb +40 -0
- data/spec/banter/server/client_queue_listener_spec.rb +36 -84
- data/spec/banter/server/rabbitmq_subscriber_spec.rb +14 -10
- data/spec/banter/server/subscriber_server_spec.rb +0 -60
- data/spec/banter/subscriber_spec.rb +0 -81
- data/spec/spec_helper.rb +1 -8
- data/spec/support/test_notifier.rb +17 -0
- metadata +33 -100
- data/.ruby-version +0 -1
- data/lib/banter/web.rb +0 -34
- data/lib/banter/web/application.rb +0 -85
- data/lib/banter/web/helpers.rb +0 -13
- data/lib/banter/web/models/banter_message.rb +0 -124
- data/lib/banter/web/models/banter_worker.rb +0 -72
- data/lib/banter/web/serializers/banter_message_serializer.rb +0 -35
- data/lib/banter/web/serializers/banter_worker_serializer.rb +0 -40
- data/lib/banter/web/serializers/subscriber_serializer.rb +0 -26
- data/spec/banter/web/application_spec.rb +0 -181
- data/spec/banter/web/serializers/banter_message_serializer_spec.rb +0 -42
- data/spec/banter/web/serializers/banter_worker_serializer_spec.rb +0 -44
- data/spec/factories/banter_messages.rb +0 -28
- data/spec/factories/banter_workers.rb +0 -17
- data/spec/mongoid.yml +0 -7
- data/web/assets/javascripts/banter.js +0 -449
- data/web/assets/javascripts/dashboard_app/app.coffee +0 -4
- data/web/assets/javascripts/dashboard_app/controllers/message_controller.coffee +0 -28
- data/web/assets/javascripts/dashboard_app/controllers/messages_controller.coffee +0 -58
- data/web/assets/javascripts/dashboard_app/controllers/subscribers_controller.coffee +0 -25
- data/web/assets/javascripts/dashboard_app/controllers/worker_controller.coffee +0 -30
- data/web/assets/javascripts/dashboard_app/controllers/workers_list_controller.coffee +0 -28
- data/web/assets/javascripts/dashboard_app/routes.coffee +0 -82
- data/web/assets/javascripts/dashboard_app/services/common_methods_service.coffee +0 -6
- data/web/assets/javascripts/dashboard_app/services/message_methods_service.coffee +0 -18
- data/web/assets/javascripts/dashboard_app/services/messages_service.coffee +0 -17
- data/web/assets/javascripts/dashboard_app/services/subscribers_service.coffee +0 -8
- data/web/assets/javascripts/dashboard_app/services/worker_methods_service.coffee +0 -11
- data/web/assets/javascripts/dashboard_app/services/worker_service.coffee +0 -15
- data/web/assets/javascripts/ng-prettyjson.js +0 -15
- data/web/assets/stylesheets/banter.css +0 -78
- data/web/views/_message.haml +0 -74
- data/web/views/_messages.haml +0 -77
- data/web/views/_subscribers.haml +0 -22
- data/web/views/_worker.haml +0 -52
- data/web/views/_workers_list.haml +0 -35
- data/web/views/index.haml +0 -19
- data/web/views/layout.haml +0 -51
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.0
|
data/lib/banter/web.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'sinatra/base'
|
3
|
-
rescue LoadError
|
4
|
-
raise "sinatra must be installed for banter/web to work. Add gem 'sinatra' to your Gemfile"
|
5
|
-
end
|
6
|
-
|
7
|
-
begin
|
8
|
-
require 'haml'
|
9
|
-
rescue LoadError
|
10
|
-
raise "haml must be installed for banter/web to work. Add gem 'haml' to your Gemfile"
|
11
|
-
end
|
12
|
-
|
13
|
-
begin
|
14
|
-
require 'mongoid'
|
15
|
-
rescue LoadError
|
16
|
-
raise "mongoid must be installed for banter/web to work. Add gem 'mongoid' to your Gemfile"
|
17
|
-
end
|
18
|
-
|
19
|
-
module Banter
|
20
|
-
module Web
|
21
|
-
autoload :Application, 'banter/web/application'
|
22
|
-
autoload :Helpers, 'banter/web/helpers'
|
23
|
-
|
24
|
-
module Serializers
|
25
|
-
autoload :BanterWorkerSerializer, 'banter/web/serializers/banter_worker_serializer'
|
26
|
-
autoload :BanterMessageSerializer, 'banter/web/serializers/banter_message_serializer'
|
27
|
-
autoload :SubscriberSerializer, 'banter/web/serializers/subscriber_serializer'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
require 'banter'
|
33
|
-
require 'banter/web/models/banter_worker'
|
34
|
-
require 'banter/web/models/banter_message'
|
@@ -1,85 +0,0 @@
|
|
1
|
-
module Banter
|
2
|
-
module Web
|
3
|
-
class Application < Sinatra::Base
|
4
|
-
set :root, File.expand_path(File.dirname(__FILE__) + "/../../../web")
|
5
|
-
set :public_folder, Proc.new { "#{root}/assets" }
|
6
|
-
set :views, Proc.new { "#{root}/views" }
|
7
|
-
|
8
|
-
helpers Banter::Web::Helpers
|
9
|
-
|
10
|
-
get '/' do
|
11
|
-
redirect "#{root_path}dashboard"
|
12
|
-
end
|
13
|
-
|
14
|
-
get '/dashboard*', provides: :html do
|
15
|
-
haml :index
|
16
|
-
end
|
17
|
-
|
18
|
-
get '/workers.json' do
|
19
|
-
content_type :json
|
20
|
-
workers = BanterWorker.running.ordered.map { |w| serialize_worker(w) }
|
21
|
-
{ workers: workers }.to_json
|
22
|
-
end
|
23
|
-
|
24
|
-
get '/workers/:id.json' do
|
25
|
-
content_type :json
|
26
|
-
worker = BanterWorker.find(params[:id])
|
27
|
-
{ worker: serialize_worker(worker) }.to_json
|
28
|
-
end
|
29
|
-
|
30
|
-
get '/messages/:message_id.json' do
|
31
|
-
content_type :json
|
32
|
-
message = BanterMessage.find(params[:message_id])
|
33
|
-
{
|
34
|
-
message: serialize_message(message, true)
|
35
|
-
}.to_json
|
36
|
-
end
|
37
|
-
|
38
|
-
get '/messages.json' do
|
39
|
-
content_type :json
|
40
|
-
offset = 0
|
41
|
-
worker = nil
|
42
|
-
offset = 50 * (params[:page].to_i - 1) if params[:page]
|
43
|
-
messages = BanterMessage.ordered.limit(50).offset(offset)
|
44
|
-
if params[:worker_id].present?
|
45
|
-
worker = BanterWorker.find(params[:worker_id])
|
46
|
-
messages = messages.where(worker_id: worker.id).ordered
|
47
|
-
end
|
48
|
-
|
49
|
-
if params[:subscriber].present?
|
50
|
-
messages = messages.where(subscriber_class: params[:subscriber])
|
51
|
-
end
|
52
|
-
|
53
|
-
hash = {
|
54
|
-
messages: messages.map { |m| serialize_message(m, true) }
|
55
|
-
}
|
56
|
-
hash[:worker] = serialize_worker(worker) if worker
|
57
|
-
hash.to_json
|
58
|
-
end
|
59
|
-
|
60
|
-
get '/subscribers.json' do
|
61
|
-
content_type :json
|
62
|
-
{
|
63
|
-
subscribers: BanterWorker.subscribers.map { |s| serialize_subscriber(s) }
|
64
|
-
}.to_json
|
65
|
-
end
|
66
|
-
|
67
|
-
private
|
68
|
-
|
69
|
-
def serialize_message(message, include_worker = false)
|
70
|
-
Banter::Web::Serializers::BanterMessageSerializer.new(message).to_hash.tap do |hash|
|
71
|
-
hash[:worker] = serialize_worker(message.worker) if include_worker
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def serialize_worker(worker)
|
76
|
-
Banter::Web::Serializers::BanterWorkerSerializer.new(worker).to_hash
|
77
|
-
end
|
78
|
-
|
79
|
-
def serialize_subscriber(subscriber)
|
80
|
-
Banter::Web::Serializers::SubscriberSerializer.new(subscriber).to_hash
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
data/lib/banter/web/helpers.rb
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
class BanterMessage
|
2
|
-
include Mongoid::Document
|
3
|
-
|
4
|
-
field :subscriber_class, type: String
|
5
|
-
field :queue_name, type: String
|
6
|
-
field :subscribed_key, type: String
|
7
|
-
field :payload_key, type: String
|
8
|
-
field :routing_data
|
9
|
-
field :properties
|
10
|
-
field :payload
|
11
|
-
field :context
|
12
|
-
field :started_at, type: Time
|
13
|
-
field :done_at, type: Time
|
14
|
-
field :status, type: String
|
15
|
-
field :error_message, type: String
|
16
|
-
field :error_backtrace
|
17
|
-
field :worker_id
|
18
|
-
field :progress_at, type: Integer
|
19
|
-
field :progress_total, type: Integer
|
20
|
-
field :progress
|
21
|
-
|
22
|
-
STATUS_STARTED = 'started'
|
23
|
-
STATUS_SUCCESS = 'success'
|
24
|
-
STATUS_ERROR = 'error'
|
25
|
-
STATUS_VALIDATION_FAILED = 'validation_failed'
|
26
|
-
|
27
|
-
cattr_reader :current
|
28
|
-
|
29
|
-
scope :ordered, ->() { order_by(:started_at.desc) }
|
30
|
-
scope :for_subscriber, ->(subscriber) { where(subscriber_class: subscriber) }
|
31
|
-
scope :successful, ->() { where(status: STATUS_SUCCESS) }
|
32
|
-
scope :errored, ->() { where(status: STATUS_ERROR) }
|
33
|
-
scope :validation_failed, ->() { where(status: STATUS_VALIDATION_FAILED) }
|
34
|
-
scope :started, ->() { where(status: STATUS_STARTED) }
|
35
|
-
|
36
|
-
# Creates a BanterMessage to record a message that is received by a subscriber.
|
37
|
-
# It records the created message as BanterMessage.current
|
38
|
-
# @param [Subscriber] subscriber_class
|
39
|
-
# @param [Banter::Server::ClientQueueListener] worker
|
40
|
-
# @param [Object] payload
|
41
|
-
def self.message_received(subscriber_class, worker, payload)
|
42
|
-
return unless BanterWorker.current
|
43
|
-
|
44
|
-
obj = new(
|
45
|
-
subscriber_class: subscriber_class.name,
|
46
|
-
queue_name: subscriber_class.subscribed_queue,
|
47
|
-
subscribed_key: subscriber_class.subscribed_key,
|
48
|
-
payload_key: worker.routing_key,
|
49
|
-
# routing_data: worker.delivery_routing_data.to_hash,
|
50
|
-
# properties: worker.delivery_properties.to_hash,
|
51
|
-
payload: payload,
|
52
|
-
context: worker.context,
|
53
|
-
started_at: Time.now,
|
54
|
-
status: STATUS_STARTED,
|
55
|
-
worker_id: BanterWorker.current.id
|
56
|
-
)
|
57
|
-
|
58
|
-
obj.save!
|
59
|
-
@@current = obj
|
60
|
-
BanterWorker.record_current!(obj)
|
61
|
-
end
|
62
|
-
|
63
|
-
# Records the current message as successful. Clears the BanterMessage.current
|
64
|
-
def self.message_successful
|
65
|
-
current.status = STATUS_SUCCESS
|
66
|
-
current.done_at = Time.now
|
67
|
-
current.save!
|
68
|
-
BanterWorker.clear_current_message!(true)
|
69
|
-
@@current = nil
|
70
|
-
end
|
71
|
-
|
72
|
-
# Records the current message as errored or validation failed with error message. Clears the BanterMessage.current
|
73
|
-
# @param [String] error_message
|
74
|
-
# @param [String] status
|
75
|
-
def self.message_failed(error, status)
|
76
|
-
current.status = status
|
77
|
-
current.done_at = Time.now
|
78
|
-
current.error_message = error.message
|
79
|
-
current.error_backtrace = error.backtrace
|
80
|
-
current.save!
|
81
|
-
BanterWorker.clear_current_message!(false)
|
82
|
-
@@current = nil
|
83
|
-
end
|
84
|
-
|
85
|
-
# Records the current progress as a number for the current message.
|
86
|
-
# @param [Integer] num Current progress
|
87
|
-
def self.update_progress_at(num)
|
88
|
-
return unless current
|
89
|
-
current.progress_at = num
|
90
|
-
current.save!
|
91
|
-
end
|
92
|
-
|
93
|
-
# Records the number of objects expected to be processed for the current message.
|
94
|
-
# @param [Integer] num Total number of objects expected to be processed.
|
95
|
-
def self.update_progress_total(num)
|
96
|
-
return unless current
|
97
|
-
current.progress_total = num
|
98
|
-
current.save!
|
99
|
-
end
|
100
|
-
|
101
|
-
# @param [Object] object Any object that indicates the progress of the message
|
102
|
-
def self.update_progress(object)
|
103
|
-
return unless current
|
104
|
-
current.progress = object
|
105
|
-
current.save!
|
106
|
-
end
|
107
|
-
|
108
|
-
def executing?
|
109
|
-
self.status == STATUS_STARTED
|
110
|
-
end
|
111
|
-
|
112
|
-
def succeeded?
|
113
|
-
self.status == STATUS_SUCCESS
|
114
|
-
end
|
115
|
-
|
116
|
-
def failed?
|
117
|
-
self.status == STATUS_ERROR || self.status == STATUS_VALIDATION_FAILED
|
118
|
-
end
|
119
|
-
|
120
|
-
# @return [BanterWorker] The worker that is responsible for executing the current message
|
121
|
-
def worker
|
122
|
-
@worker ||= BanterWorker.find(self['worker_id'].to_s)
|
123
|
-
end
|
124
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
class BanterWorker
|
2
|
-
include Mongoid::Document
|
3
|
-
field :process_name, type: String
|
4
|
-
field :pid, type: Integer
|
5
|
-
field :worker_classes
|
6
|
-
field :hostname, type: String
|
7
|
-
field :started_at, type: Time
|
8
|
-
field :stopped_at, type: Time
|
9
|
-
field :current_message
|
10
|
-
field :job_count, type: Integer, default: 0
|
11
|
-
field :success_count, type: Integer, default: 0
|
12
|
-
field :failed_count, type: Integer, default: 0
|
13
|
-
|
14
|
-
cattr_reader :current
|
15
|
-
|
16
|
-
scope :running, ->() { where(:stopped_at => nil) }
|
17
|
-
scope :ordered, ->() { order_by(:started_at.desc) }
|
18
|
-
|
19
|
-
# @param [String] process_name
|
20
|
-
# @param [String] process_pid
|
21
|
-
# @param [String] hostname
|
22
|
-
# @param [Array(Subscriber)] workers The subscriber classes that are being started by this worker
|
23
|
-
def self.worker_started
|
24
|
-
server_instance = Banter::Server::SubscriberServer.instance
|
25
|
-
worker = new(process_name: server_instance.process_name,
|
26
|
-
pid: server_instance.pid,
|
27
|
-
hostname: server_instance.hostname,
|
28
|
-
started_at: Time.now,
|
29
|
-
worker_classes: Array.wrap(server_instance.workers).map(&:worker_class).map(&:name))
|
30
|
-
worker.save!
|
31
|
-
@@current = worker
|
32
|
-
worker
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.worker_stopped
|
36
|
-
current.try(:stop!)
|
37
|
-
@@current = nil
|
38
|
-
end
|
39
|
-
|
40
|
-
# @return [Array] Unique subscriber classes
|
41
|
-
def self.subscribers
|
42
|
-
distinct("worker_classes")
|
43
|
-
end
|
44
|
-
|
45
|
-
# @param [BanterMessage] banter_message Message that is currently being executed
|
46
|
-
def self.record_current!(banter_message)
|
47
|
-
current.current_message = banter_message.attributes
|
48
|
-
current.save!
|
49
|
-
end
|
50
|
-
|
51
|
-
# Clears the current message key for the worker
|
52
|
-
# @param [Boolean] success Indicate whether the job was successful or not
|
53
|
-
def self.clear_current_message!(success = true)
|
54
|
-
current.current_message = nil
|
55
|
-
current.job_count += 1
|
56
|
-
if success
|
57
|
-
current.success_count += 1
|
58
|
-
else
|
59
|
-
current.failed_count += 1
|
60
|
-
end
|
61
|
-
current.save!
|
62
|
-
end
|
63
|
-
|
64
|
-
def executing?
|
65
|
-
current_message.present?
|
66
|
-
end
|
67
|
-
|
68
|
-
def stop!
|
69
|
-
self.stopped_at = Time.now
|
70
|
-
save!
|
71
|
-
end
|
72
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Banter
|
2
|
-
module Web
|
3
|
-
|
4
|
-
module Serializers
|
5
|
-
class BanterMessageSerializer
|
6
|
-
attr_accessor :message
|
7
|
-
|
8
|
-
def initialize(message)
|
9
|
-
@message = message
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_hash
|
13
|
-
{
|
14
|
-
id: message.id.to_s,
|
15
|
-
subscriber_class: message.subscriber_class,
|
16
|
-
queue_name: message.queue_name,
|
17
|
-
subscribed_key: message.subscribed_key,
|
18
|
-
payload_key: message.payload_key,
|
19
|
-
payload: message.payload,
|
20
|
-
context: message.context,
|
21
|
-
started_at: message.started_at,
|
22
|
-
done_at: message.done_at,
|
23
|
-
status: message.status,
|
24
|
-
error_message: message.error_message,
|
25
|
-
error_backtrace: message.error_backtrace,
|
26
|
-
worker_id: message.worker_id,
|
27
|
-
progress_total: message.progress_total,
|
28
|
-
progress_at: message.progress_at,
|
29
|
-
progress: message.progress
|
30
|
-
}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module Banter
|
2
|
-
module Web
|
3
|
-
|
4
|
-
module Serializers
|
5
|
-
class BanterWorkerSerializer
|
6
|
-
attr_accessor :worker
|
7
|
-
|
8
|
-
def initialize(worker)
|
9
|
-
@worker = worker
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_hash
|
13
|
-
{
|
14
|
-
id: worker.id.to_s,
|
15
|
-
process_name: worker.process_name,
|
16
|
-
pid: worker.pid,
|
17
|
-
started_at: worker.started_at,
|
18
|
-
stopped_at: worker.stopped_at,
|
19
|
-
worker_classes: Array.wrap(worker.worker_classes),
|
20
|
-
hostname: worker.hostname,
|
21
|
-
current_message: current_message_serialized,
|
22
|
-
job_count: worker.job_count,
|
23
|
-
success_count: worker.success_count,
|
24
|
-
failed_count: worker.failed_count
|
25
|
-
}
|
26
|
-
end
|
27
|
-
|
28
|
-
def current_message_serialized
|
29
|
-
return if worker.current_message.blank?
|
30
|
-
worker.current_message.tap do |hash|
|
31
|
-
_id = hash.delete('_id')
|
32
|
-
if _id
|
33
|
-
hash["id"] = _id.to_s
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Banter
|
2
|
-
module Web
|
3
|
-
|
4
|
-
module Serializers
|
5
|
-
class SubscriberSerializer
|
6
|
-
attr_accessor :subscriber_class_name
|
7
|
-
|
8
|
-
def initialize(subscriber_class_name)
|
9
|
-
@subscriber_class_name = subscriber_class_name
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_hash
|
13
|
-
messages = BanterMessage.for_subscriber(subscriber_class_name)
|
14
|
-
{
|
15
|
-
class_name: subscriber_class_name,
|
16
|
-
total: messages.count,
|
17
|
-
success_count: messages.successful.count,
|
18
|
-
started_count: messages.started.count,
|
19
|
-
errored_count: messages.errored.count,
|
20
|
-
validation_failed_count: messages.validation_failed.count
|
21
|
-
}
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,181 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Banter::Web::Application do
|
4
|
-
let(:response_json) { JSON.parse(last_response.body) }
|
5
|
-
describe 'GET /' do
|
6
|
-
before { get '/' }
|
7
|
-
it 'redirects to dashboard' do
|
8
|
-
expect(last_response.status).to eq 302
|
9
|
-
end
|
10
|
-
|
11
|
-
it { expect(last_response.location).to include("/dashboard") }
|
12
|
-
end
|
13
|
-
|
14
|
-
describe "GET /dashboard*" do
|
15
|
-
context "GET /dashboard" do
|
16
|
-
before { get '/dashboard' }
|
17
|
-
it "is successful" do
|
18
|
-
expect(last_response.status).to be(200)
|
19
|
-
end
|
20
|
-
it "includes dashboardApp" do
|
21
|
-
expect(last_response.body).to include('dashboardApp')
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context "GET /dashboard/workers/123" do
|
26
|
-
before { get '/dashboard/workers/123' }
|
27
|
-
it "is successful" do
|
28
|
-
expect(last_response.status).to be(200)
|
29
|
-
end
|
30
|
-
it "includes dashboardApp" do
|
31
|
-
expect(last_response.body).to include('dashboardApp')
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "GET /dashboard/wtf" do
|
36
|
-
before { get '/dashboard/wtf' }
|
37
|
-
it "is successful" do
|
38
|
-
expect(last_response.status).to be(200)
|
39
|
-
end
|
40
|
-
it "includes dashboardApp" do
|
41
|
-
expect(last_response.body).to include('dashboardApp')
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe "GET /workers.json" do
|
47
|
-
let!(:worker_1) { FactoryGirl.create(:banter_worker) }
|
48
|
-
let!(:worker_2) { FactoryGirl.create(:banter_worker) }
|
49
|
-
let!(:worker_3) { FactoryGirl.create(:banter_worker, :stopped) }
|
50
|
-
let(:workers_json) { response_json['workers'] }
|
51
|
-
|
52
|
-
before { get "/workers.json" }
|
53
|
-
it 'is successful' do
|
54
|
-
expect(last_response.status).to be(200)
|
55
|
-
end
|
56
|
-
|
57
|
-
it "includes only running workers" do
|
58
|
-
expect(workers_json.size).to eq(2)
|
59
|
-
end
|
60
|
-
|
61
|
-
it do
|
62
|
-
worker_ids = workers_json.map { |worker| worker['id'] }
|
63
|
-
expect(worker_ids).to match_array([worker_1.id.to_s, worker_2.id.to_s])
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "GET /workers/:worker_id.json" do
|
68
|
-
let(:worker_json) { response_json['worker'] }
|
69
|
-
|
70
|
-
def self.it_works
|
71
|
-
before { get "/workers/#{worker.id.to_s}.json" }
|
72
|
-
it 'is successful' do
|
73
|
-
expect(last_response.status).to be 200
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'includes worker data' do
|
77
|
-
expect(worker_json['id']).to eq(worker.id.to_s)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe "alive worker" do
|
82
|
-
let(:worker) { FactoryGirl.create(:banter_worker) }
|
83
|
-
it_works
|
84
|
-
end
|
85
|
-
|
86
|
-
describe "dead worker" do
|
87
|
-
let(:worker) { FactoryGirl.create(:banter_worker, :stopped) }
|
88
|
-
it_works
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
describe "GET /messages/:message_id.json" do
|
93
|
-
let(:message_json) { response_json['message'] }
|
94
|
-
let(:message) { FactoryGirl.create(:banter_message) }
|
95
|
-
|
96
|
-
before { get "/messages/#{message.id.to_s}.json" }
|
97
|
-
|
98
|
-
it 'is successful' do
|
99
|
-
expect(last_response.status).to be 200
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'includes message' do
|
103
|
-
expect(message_json['id']).to eq(message.id.to_s)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
describe "GET /messages.json" do
|
108
|
-
let(:messages_json) { response_json['messages'] }
|
109
|
-
let(:worker_id) { nil }
|
110
|
-
|
111
|
-
def includes_messages(*messages)
|
112
|
-
message_ids = messages_json.map { |m| m['id']}
|
113
|
-
expect(message_ids).to match_array(messages.map(&:id).map(&:to_s))
|
114
|
-
end
|
115
|
-
|
116
|
-
context "all messages" do
|
117
|
-
let!(:message_1) { FactoryGirl.create(:banter_message) }
|
118
|
-
let!(:message_2) { FactoryGirl.create(:banter_message) }
|
119
|
-
let!(:message_3) { FactoryGirl.create(:banter_message, :errored) }
|
120
|
-
before { get "/messages.json?worker_id=#{worker_id}" }
|
121
|
-
|
122
|
-
it 'is successful' do
|
123
|
-
expect(last_response.status).to be 200
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'includes messages' do
|
127
|
-
includes_messages(message_1, message_2, message_3)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
context "by worker" do
|
132
|
-
let(:worker) { FactoryGirl.create(:banter_worker) }
|
133
|
-
let(:worker_id) { worker.id }
|
134
|
-
let!(:message_1) { FactoryGirl.create(:banter_message, worker_id: worker.id ) }
|
135
|
-
let!(:message_2) { FactoryGirl.create(:banter_message, worker_id: worker.id) }
|
136
|
-
let!(:message_3) { FactoryGirl.create(:banter_message, :errored, worker_id: worker.id) }
|
137
|
-
let!(:message_4) { FactoryGirl.create(:banter_message) }
|
138
|
-
before { get "/messages.json?worker_id=#{worker_id}" }
|
139
|
-
it 'is successful' do
|
140
|
-
expect(last_response.status).to be 200
|
141
|
-
end
|
142
|
-
|
143
|
-
it 'includes messages' do
|
144
|
-
includes_messages(message_1, message_2, message_3)
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
context "by subscriber" do
|
149
|
-
let(:subscriber) { 'MyTestClass' }
|
150
|
-
let!(:message_1) { FactoryGirl.create(:banter_message, subscriber_class: subscriber ) }
|
151
|
-
let!(:message_2) { FactoryGirl.create(:banter_message, subscriber_class: subscriber) }
|
152
|
-
let!(:message_3) { FactoryGirl.create(:banter_message, :errored) }
|
153
|
-
let!(:message_4) { FactoryGirl.create(:banter_message, :errored, subscriber_class: subscriber) }
|
154
|
-
before { get "/messages.json?subscriber=#{subscriber}" }
|
155
|
-
it 'is successful' do
|
156
|
-
expect(last_response.status).to be 200
|
157
|
-
end
|
158
|
-
|
159
|
-
it 'includes messages' do
|
160
|
-
includes_messages(message_1, message_2, message_4)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
describe "GET /subscribers.json" do
|
166
|
-
let!(:worker_1) { FactoryGirl.create(:banter_worker, worker_classes: [ 'FooWorker1', 'BarWorker2'])}
|
167
|
-
let!(:worker_2) { FactoryGirl.create(:banter_worker, :stopped, worker_classes: [ 'FooWorker2', 'BarWorker1'])}
|
168
|
-
|
169
|
-
let(:subscribers_json) { response_json['subscribers'] }
|
170
|
-
|
171
|
-
before { get '/subscribers.json'}
|
172
|
-
it 'is successful' do
|
173
|
-
expect(last_response.status).to be 200
|
174
|
-
end
|
175
|
-
|
176
|
-
it 'includes message' do
|
177
|
-
subscribers = subscribers_json.map { |s| s['class_name']}.sort
|
178
|
-
expect(subscribers).to eq(['BarWorker1', 'BarWorker2', 'FooWorker1', 'FooWorker2'])
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|