chatterbox 0.4.0 → 0.5.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.
- data/CHANGELOG.markdown +15 -0
- data/README.markdown +1 -1
- data/Rakefile +2 -2
- data/chatterbox.gemspec +31 -16
- data/examples/example_helper.rb +13 -3
- data/examples/lib/chatterbox/exception_notification/filter_example.rb +38 -0
- data/examples/lib/chatterbox/exception_notification/presenter_example.rb +89 -0
- data/examples/lib/chatterbox/exception_notification/rails_extracter_example.rb +50 -0
- data/examples/lib/chatterbox/rails_catcher_example.rb +17 -10
- data/examples/lib/chatterbox/services/email/mailer_example.rb +54 -0
- data/examples/lib/chatterbox/services/email_example.rb +89 -0
- data/examples/lib/chatterbox/services_example.rb +0 -0
- data/examples/{chatterbox_example.rb → lib/chatterbox_example.rb} +22 -24
- data/lib/chatterbox/{notification.rb → exception_notification/extracter.rb} +23 -35
- data/lib/chatterbox/exception_notification/presenter.rb +81 -0
- data/lib/chatterbox/exception_notification/rails_extracter.rb +51 -0
- data/lib/chatterbox/exception_notification.rb +8 -0
- data/lib/chatterbox/rails_catcher.rb +11 -1
- data/lib/chatterbox/services/email/mailer.rb +28 -0
- data/lib/chatterbox/services/email/views/chatterbox/services/email/mailer/message.erb +0 -0
- data/lib/chatterbox/services/email.rb +66 -0
- data/lib/chatterbox/services.rb +4 -0
- data/lib/chatterbox.rb +21 -24
- data/todo.markdown +0 -2
- data/version.yml +2 -1
- metadata +26 -12
- data/examples/lib/chatterbox/consumers/email_consumer_example.rb +0 -65
- data/examples/lib/chatterbox/notification_example.rb +0 -147
- data/lib/consumers/email_consumer.rb +0 -64
- data/lib/consumers.rb +0 -2
data/CHANGELOG.markdown
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
HEAD
|
2
|
+
|
3
|
+
0.4.2
|
4
|
+
|
5
|
+
- handle_notice returns the message that was passed in
|
6
|
+
|
7
|
+
0.4.1
|
8
|
+
|
9
|
+
- top level alias `notify` for `handle_notice`
|
10
|
+
- simplified logging - no longer tries to use Rails logger if it exists
|
11
|
+
|
12
|
+
0.4.0
|
13
|
+
|
14
|
+
- removed notification wrapper around messages sent to Chatterbox to simplify things
|
15
|
+
|
data/README.markdown
CHANGED
@@ -34,7 +34,7 @@ Example 1
|
|
34
34
|
Register the email service to handle messages that get sent to Chatterbox:
|
35
35
|
|
36
36
|
Chatterbox::Publishers.register do |notice|
|
37
|
-
Chatterbox::Email.deliver(notice)
|
37
|
+
Chatterbox::Services::Email.deliver(notice)
|
38
38
|
end
|
39
39
|
|
40
40
|
Then, wherever you want to send email, do this:
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ begin
|
|
5
5
|
Jeweler::Tasks.new do |gem|
|
6
6
|
gem.name = "chatterbox"
|
7
7
|
gem.summary = %Q{Notifications and messages}
|
8
|
-
gem.description =
|
8
|
+
gem.description = "Send notifications and messages. However you want."
|
9
9
|
gem.email = "rsanheim@gmail.com"
|
10
10
|
gem.homepage = "http://github.com/rsanheim/chatterbox"
|
11
11
|
gem.authors = ["Rob Sanheim"]
|
@@ -27,7 +27,7 @@ end
|
|
27
27
|
|
28
28
|
Micronaut::RakeTask.new(:rcov) do |examples|
|
29
29
|
examples.pattern = 'examples/**/*_example.rb'
|
30
|
-
examples.rcov_opts =
|
30
|
+
examples.rcov_opts = %[-Ilib -Iexamples --exclude "examples/*,gems/*,db/*,/Library/Ruby/*,config/*" --text-summary --sort coverage]
|
31
31
|
examples.rcov = true
|
32
32
|
end
|
33
33
|
|
data/chatterbox.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{chatterbox}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Rob Sanheim"]
|
12
|
-
s.date = %q{2009-
|
13
|
-
s.description = %q{
|
12
|
+
s.date = %q{2009-11-06}
|
13
|
+
s.description = %q{Send notifications and messages. However you want.}
|
14
14
|
s.email = %q{rsanheim@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
@@ -19,21 +19,31 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.files = [
|
20
20
|
".gitignore",
|
21
21
|
".treasure_map.rb",
|
22
|
+
"CHANGELOG.markdown",
|
22
23
|
"LICENSE",
|
23
24
|
"README.markdown",
|
24
25
|
"Rakefile",
|
25
26
|
"chatterbox.gemspec",
|
26
|
-
"examples/chatterbox_example.rb",
|
27
27
|
"examples/example_helper.rb",
|
28
|
-
"examples/lib/chatterbox/
|
29
|
-
"examples/lib/chatterbox/
|
28
|
+
"examples/lib/chatterbox/exception_notification/filter_example.rb",
|
29
|
+
"examples/lib/chatterbox/exception_notification/presenter_example.rb",
|
30
|
+
"examples/lib/chatterbox/exception_notification/rails_extracter_example.rb",
|
30
31
|
"examples/lib/chatterbox/rails_catcher_example.rb",
|
32
|
+
"examples/lib/chatterbox/services/email/mailer_example.rb",
|
33
|
+
"examples/lib/chatterbox/services/email_example.rb",
|
34
|
+
"examples/lib/chatterbox/services_example.rb",
|
35
|
+
"examples/lib/chatterbox_example.rb",
|
31
36
|
"init.rb",
|
32
37
|
"lib/chatterbox.rb",
|
33
|
-
"lib/chatterbox/
|
38
|
+
"lib/chatterbox/exception_notification.rb",
|
39
|
+
"lib/chatterbox/exception_notification/extracter.rb",
|
40
|
+
"lib/chatterbox/exception_notification/presenter.rb",
|
41
|
+
"lib/chatterbox/exception_notification/rails_extracter.rb",
|
34
42
|
"lib/chatterbox/rails_catcher.rb",
|
35
|
-
"lib/
|
36
|
-
"lib/
|
43
|
+
"lib/chatterbox/services.rb",
|
44
|
+
"lib/chatterbox/services/email.rb",
|
45
|
+
"lib/chatterbox/services/email/mailer.rb",
|
46
|
+
"lib/chatterbox/services/email/views/chatterbox/services/email/mailer/message.erb",
|
37
47
|
"rails/init.rb",
|
38
48
|
"todo.markdown",
|
39
49
|
"version.yml",
|
@@ -45,11 +55,15 @@ Gem::Specification.new do |s|
|
|
45
55
|
s.rubygems_version = %q{1.3.5}
|
46
56
|
s.summary = %q{Notifications and messages}
|
47
57
|
s.test_files = [
|
48
|
-
"examples/
|
49
|
-
"examples/
|
50
|
-
"examples/lib/chatterbox/
|
51
|
-
"examples/lib/chatterbox/
|
52
|
-
"examples/lib/chatterbox/rails_catcher_example.rb"
|
58
|
+
"examples/example_helper.rb",
|
59
|
+
"examples/lib/chatterbox/exception_notification/filter_example.rb",
|
60
|
+
"examples/lib/chatterbox/exception_notification/presenter_example.rb",
|
61
|
+
"examples/lib/chatterbox/exception_notification/rails_extracter_example.rb",
|
62
|
+
"examples/lib/chatterbox/rails_catcher_example.rb",
|
63
|
+
"examples/lib/chatterbox/services/email/mailer_example.rb",
|
64
|
+
"examples/lib/chatterbox/services/email_example.rb",
|
65
|
+
"examples/lib/chatterbox/services_example.rb",
|
66
|
+
"examples/lib/chatterbox_example.rb"
|
53
67
|
]
|
54
68
|
|
55
69
|
if s.respond_to? :specification_version then
|
@@ -74,3 +88,4 @@ Gem::Specification.new do |s|
|
|
74
88
|
s.add_dependency(%q<micronaut-rails>, [">= 0"])
|
75
89
|
end
|
76
90
|
end
|
91
|
+
|
data/examples/example_helper.rb
CHANGED
@@ -3,10 +3,10 @@ require 'action_controller'
|
|
3
3
|
require 'micronaut'
|
4
4
|
require 'micronaut-rails'
|
5
5
|
require 'mocha'
|
6
|
-
|
6
|
+
require 'log_buddy'
|
7
|
+
LogBuddy.init
|
7
8
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
9
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
9
|
-
# $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
10
10
|
|
11
11
|
require 'lib/chatterbox'
|
12
12
|
|
@@ -20,4 +20,14 @@ Micronaut.configure do |c|
|
|
20
20
|
c.filter_run :focused => true
|
21
21
|
c.alias_example_to :fit, :focused => true
|
22
22
|
c.enable_controller_support :behaviour => { :describes => lambda { |dt| dt < ::ActionController::Base } }
|
23
|
-
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def valid_options(overrides = {})
|
26
|
+
options = {
|
27
|
+
:message => { :summary => "here is a message" },
|
28
|
+
:config => {
|
29
|
+
:to => "joe@example.com",
|
30
|
+
:from => "someone@here.com"
|
31
|
+
}
|
32
|
+
}.merge(overrides)
|
33
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'example_helper'
|
2
|
+
require 'chatterbox/exception_notification'
|
3
|
+
|
4
|
+
describe Chatterbox::ExceptionNotification::Extracter do
|
5
|
+
|
6
|
+
def raised_exception
|
7
|
+
raise RuntimeError, "Your zing bats got mixed up with the snosh frazzles."
|
8
|
+
rescue => e
|
9
|
+
e
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "notice" do
|
13
|
+
it "should extract exception info" do
|
14
|
+
exception = raised_exception
|
15
|
+
data = Chatterbox::ExceptionNotification::Extracter.new(exception).notice
|
16
|
+
data[:summary].should == "RuntimeError: Your zing bats got mixed up with the snosh frazzles."
|
17
|
+
data[:error_class].should == "RuntimeError"
|
18
|
+
data[:error_message].should == "Your zing bats got mixed up with the snosh frazzles."
|
19
|
+
data[:backtrace].should == exception.backtrace
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should extract exception info from an exception in a hash" do
|
23
|
+
exception = raised_exception
|
24
|
+
data = Chatterbox::ExceptionNotification::Extracter.new(:exception => exception, :other_info => "yo dawg").notice
|
25
|
+
data[:summary].should == "RuntimeError: Your zing bats got mixed up with the snosh frazzles."
|
26
|
+
data[:error_class].should == "RuntimeError"
|
27
|
+
data[:error_message].should == "Your zing bats got mixed up with the snosh frazzles."
|
28
|
+
data[:backtrace].should == exception.backtrace
|
29
|
+
data[:other_info].should == "yo dawg"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should let extra data win over auto extracted exception data" do
|
33
|
+
exception = raised_exception
|
34
|
+
data = Chatterbox::ExceptionNotification::Extracter.new(:exception => exception, :summary => "I know what I'm doing, and we got an error").notice
|
35
|
+
data[:summary].should == "I know what I'm doing, and we got an error"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'example_helper'
|
2
|
+
require 'chatterbox/exception_notification'
|
3
|
+
|
4
|
+
describe Chatterbox::ExceptionNotification::Presenter do
|
5
|
+
|
6
|
+
describe "body" do
|
7
|
+
it "should render sections in order" do
|
8
|
+
options = {
|
9
|
+
:environment => { "PATH" => "/usr/bin" },
|
10
|
+
:error_message => "ActionView::MissingTemplate: Missing template projects/show.erb in view path app/views",
|
11
|
+
:ruby_info => {
|
12
|
+
:ruby_version => "1.8.6",
|
13
|
+
:ruby_platform => "darwin"
|
14
|
+
}
|
15
|
+
}
|
16
|
+
presenter = Chatterbox::ExceptionNotification::Presenter.new(options)
|
17
|
+
expected =<<EOL
|
18
|
+
Error Message
|
19
|
+
----------
|
20
|
+
"ActionView::MissingTemplate: Missing template projects/show.erb in view path app/views"
|
21
|
+
|
22
|
+
Environment
|
23
|
+
----------
|
24
|
+
PATH: /usr/bin
|
25
|
+
|
26
|
+
Ruby Info
|
27
|
+
----------
|
28
|
+
ruby_platform: darwin
|
29
|
+
ruby_version: 1.8.6
|
30
|
+
EOL
|
31
|
+
presenter.body.strip.should == expected.strip
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "render_section" do
|
36
|
+
it "should humanzie the title of the section" do
|
37
|
+
presenter = Chatterbox::ExceptionNotification::Presenter.new({"environment" => "foo'"})
|
38
|
+
presenter.render_section("environment").should include("Environment\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should inspect the value for the key" do
|
42
|
+
presenter = Chatterbox::ExceptionNotification::Presenter.new({"environment" => "foo"})
|
43
|
+
presenter.render_section("environment").should include(%[foo])
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return nil if the key does not exist in the options" do
|
47
|
+
presenter = Chatterbox::ExceptionNotification::Presenter.new
|
48
|
+
presenter.render_section("environment").should be_nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "inspect_value" do
|
53
|
+
it "outputs hashes in key sorted order" do
|
54
|
+
hash = {
|
55
|
+
"my-key" => "something",
|
56
|
+
"zephyr" => "something",
|
57
|
+
:nanite => "something",
|
58
|
+
"abcdefg" => "foo"
|
59
|
+
}
|
60
|
+
presenter = Chatterbox::ExceptionNotification::Presenter.new
|
61
|
+
expected =<<-EOL
|
62
|
+
abcdefg: foo
|
63
|
+
my-key: something
|
64
|
+
nanite: something
|
65
|
+
zephyr: something
|
66
|
+
EOL
|
67
|
+
presenter.inspect_value(hash).should == expected.strip
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "prettyify_output" do
|
72
|
+
it "should strip leading --- from to_yaml and retrun pretty output for hashes" do
|
73
|
+
hash = { "my-key" => "some string value", "my-other-key" => "something" }
|
74
|
+
presenter = Chatterbox::ExceptionNotification::Presenter.new
|
75
|
+
output = presenter.inspect_value(hash)
|
76
|
+
# NOTE: Handling different hash order below, between 1.8.x and 1.9.1
|
77
|
+
actual_lines = output.split("\n")
|
78
|
+
expected_lines = ["my-key: some string value", "my-other-key: something"]
|
79
|
+
expected_lines.each { |line| actual_lines.should include(line) }
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should strip leading --- from strings" do
|
83
|
+
presenter = Chatterbox::ExceptionNotification::Presenter.new
|
84
|
+
output = presenter.inspect_value("just a simple string")
|
85
|
+
output.should == "just a simple string"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'example_helper'
|
2
|
+
require 'chatterbox/exception_notification'
|
3
|
+
|
4
|
+
describe Chatterbox::ExceptionNotification::RailsExtracter do
|
5
|
+
|
6
|
+
describe "wrap" do
|
7
|
+
describe "when Rails is not defined or not found" do
|
8
|
+
it "returns message unchanged" do
|
9
|
+
Object.expects(:const_defined?).with("Rails").returns(false)
|
10
|
+
original_hash = {:foo => "bar", :something => "else"}
|
11
|
+
hsh = Chatterbox::ExceptionNotification::RailsExtracter.wrap(original_hash)
|
12
|
+
hsh.should == original_hash
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "when Rails is defined" do
|
17
|
+
it "merges in rails root, env, and version" do
|
18
|
+
rails = stub_everything({
|
19
|
+
:env => "production",
|
20
|
+
:root => "/a/blah/current",
|
21
|
+
:version => "2.3.2"
|
22
|
+
})
|
23
|
+
Chatterbox::ExceptionNotification::RailsExtracter.any_instance.stubs(:rails_configuration).returns(rails)
|
24
|
+
details = Chatterbox::ExceptionNotification::RailsExtracter.wrap({})
|
25
|
+
details[:rails_info][:rails_root].should == "/a/blah/current"
|
26
|
+
details[:rails_info][:rails_env].should == "production"
|
27
|
+
details[:rails_info][:rails_version].should == "2.3.2"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "when handed a request as optional data" do
|
32
|
+
it "should inclue url and remote ip" do
|
33
|
+
request = stub_everything(:url => "http://example.com/fail-whale", :remote_ip => "192.5.5.0")
|
34
|
+
details = Chatterbox::ExceptionNotification::RailsExtracter.wrap({:request => request})
|
35
|
+
details[:request][:url].should == "http://example.com/fail-whale"
|
36
|
+
details[:request][:remote_ip].should == "192.5.5.0"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "rails_configuration" do
|
42
|
+
it "returns top level Rails config if defined" do
|
43
|
+
Object.expects(:const_defined?).with("Rails").returns(true)
|
44
|
+
Object.expects(:const_get).with("Rails").returns("fake rails const")
|
45
|
+
extracter = Chatterbox::ExceptionNotification::RailsExtracter.new
|
46
|
+
extracter.rails_configuration.should == "fake rails const"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
require
|
1
|
+
require 'example_helper'
|
2
|
+
require 'chatterbox/exception_notification'
|
2
3
|
require File.expand_path(File.join(File.dirname(__FILE__), *%w[.. .. .. rails init]))
|
3
4
|
|
4
5
|
ActionController::Routing::Routes.draw { |map| map.connect ':controller/:action/:id' }
|
@@ -27,28 +28,34 @@ end
|
|
27
28
|
|
28
29
|
describe WidgetsController do
|
29
30
|
|
30
|
-
describe "
|
31
|
-
|
32
|
-
it "should alias method chain" do
|
31
|
+
describe "controller haxing" do
|
32
|
+
it "chains the chatterbox method to rescue_action_in_public" do
|
33
33
|
exception = RuntimeError.new
|
34
34
|
@controller.expects(:rescue_action_in_public_without_chatterbox).with(exception)
|
35
|
+
@controller.stubs(:extract_exception_details)
|
35
36
|
@controller.rescue_action_in_public(exception)
|
36
37
|
end
|
38
|
+
|
39
|
+
it "should have the catcher included in ApplicationController" do
|
40
|
+
WidgetsController.ancestors.should include(Chatterbox::RailsCatcher)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should hide aliased methods so they are not exposed as actions" do
|
44
|
+
WidgetsController.hidden_actions.should include("rescue_action_in_public_with_chatterbox")
|
45
|
+
WidgetsController.hidden_actions.should include("rescue_action_in_public_without_chatterbox")
|
46
|
+
end
|
37
47
|
end
|
38
|
-
|
48
|
+
|
39
49
|
describe "exception handling" do
|
40
|
-
|
41
50
|
it "should raise on index" do
|
42
51
|
lambda {
|
43
52
|
get :index
|
44
53
|
}.should raise_error(WidgetException, "Bad dog!")
|
45
54
|
end
|
46
55
|
|
47
|
-
it "should send exception
|
48
|
-
Chatterbox.expects(:handle_notice).with(instance_of(
|
56
|
+
it "should send exception notice as hash" do
|
57
|
+
Chatterbox.expects(:handle_notice).with(instance_of(Hash))
|
49
58
|
get :index rescue nil
|
50
59
|
end
|
51
|
-
|
52
60
|
end
|
53
|
-
|
54
61
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'example_helper'
|
2
|
+
require 'chatterbox/services/email'
|
3
|
+
|
4
|
+
describe Chatterbox::Services::Email::Mailer do
|
5
|
+
before { ActionMailer::Base.delivery_method = :test }
|
6
|
+
|
7
|
+
describe "wiring the email" do
|
8
|
+
it "should set subject to the summary" do
|
9
|
+
email = Chatterbox::Services::Email::Mailer.create_message(valid_options.merge(:message => { :summary => "check this out"}))
|
10
|
+
email.subject.should == "check this out"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not require a body (for emails that are subject only)" do
|
14
|
+
email = Chatterbox::Services::Email::Mailer.create_message(valid_options.merge(:message => { :body => nil}))
|
15
|
+
email.body.should be_blank # not nil for some reason -- ActionMailer provides an empty string somewhere
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should set body to the body" do
|
19
|
+
email = Chatterbox::Services::Email::Mailer.create_message(valid_options.merge(:message => { :body => "here is my body"}))
|
20
|
+
email.body.should == "here is my body"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should set from" do
|
24
|
+
email = Chatterbox::Services::Email::Mailer.create_message(valid_options.merge(:config => { :from => ["from@example.com"] }))
|
25
|
+
email.from.should == ["from@example.com"]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "content type" do
|
30
|
+
|
31
|
+
it "can be set" do
|
32
|
+
Chatterbox::Services::Email::Mailer.create_message(valid_options.merge(:config => { :content_type => "text/html"})).content_type.should == "text/html"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should default to text/plain" do
|
36
|
+
Chatterbox::Services::Email::Mailer.create_message(valid_options).content_type.should == "text/plain"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
[:to, :cc, :bcc, :reply_to].each do |field|
|
41
|
+
describe "when configuring the #{field} field that takes one or many email addresses" do
|
42
|
+
it "should allow setting a single address" do
|
43
|
+
email = Chatterbox::Services::Email::Mailer.create_message(valid_options.merge(:config => { field => "joe@exmaple.com"}))
|
44
|
+
email.send(field).should == ["joe@exmaple.com"]
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should allow setting multiple addresses" do
|
48
|
+
email = Chatterbox::Services::Email::Mailer.create_message(valid_options.merge(:config => { field => ["joe@example.com", "frank@example.com"]}))
|
49
|
+
email.send(field).should == ["joe@example.com", "frank@example.com"]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'example_helper'
|
2
|
+
require 'chatterbox/services/email'
|
3
|
+
|
4
|
+
describe Chatterbox::Services::Email do
|
5
|
+
include Chatterbox
|
6
|
+
ActionMailer::Base.delivery_method = :test
|
7
|
+
|
8
|
+
before { Chatterbox::Services::Email.configure({}) }
|
9
|
+
|
10
|
+
describe "creation" do
|
11
|
+
it "is wired with valid options" do
|
12
|
+
lambda {
|
13
|
+
Chatterbox::Services::Email.deliver(valid_options)
|
14
|
+
}.should_not raise_error
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns TMail::Mail instance" do
|
18
|
+
result = Chatterbox::Services::Email.deliver(valid_options)
|
19
|
+
result.should be_instance_of(TMail::Mail)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should preserve HashWithIndifferentAccess with explicit options" do
|
23
|
+
options = { :message => { :summary => "foo" }, :config => {:to => "a", :from => "a"} }.with_indifferent_access
|
24
|
+
service = Chatterbox::Services::Email.new(options)
|
25
|
+
service.options.should be_instance_of(HashWithIndifferentAccess)
|
26
|
+
service.options[:config].should be_instance_of(HashWithIndifferentAccess)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should preserve HashWithIndifferentAccess with default configuration" do
|
30
|
+
options = { :message => { :summary => "foo" } }.with_indifferent_access
|
31
|
+
Chatterbox::Services::Email.configure :to => "default-to@example.com", :from => "default-from@example.com"
|
32
|
+
service = Chatterbox::Services::Email.new(options)
|
33
|
+
service.options.should be_instance_of(HashWithIndifferentAccess)
|
34
|
+
service.options[:config].should be_instance_of(HashWithIndifferentAccess)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "validations" do
|
39
|
+
it "should require :message" do
|
40
|
+
lambda {
|
41
|
+
Chatterbox::Services::Email.deliver(:config => { :from => "foo", :to => "foo"})
|
42
|
+
}.should raise_error(ArgumentError, /Must configure with a :message/)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should require :message => :summary" do
|
46
|
+
lambda {
|
47
|
+
Chatterbox::Services::Email.deliver(:message => {}, :config => { :from => "foo", :to => "foo"})
|
48
|
+
}.should raise_error(ArgumentError, /Must provide :summary in the :message/)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should require :to" do
|
52
|
+
lambda {
|
53
|
+
Chatterbox::Services::Email.deliver(:message => {:summary => ""}, :config => { :from => "anyone" })
|
54
|
+
}.should raise_error(ArgumentError, /Must provide :to in the :config/)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should require from address" do
|
58
|
+
lambda {
|
59
|
+
Chatterbox::Services::Email.deliver(:message => {:summary => ""}, :config => { :to => "anyone"})
|
60
|
+
}.should raise_error(ArgumentError, /Must provide :from in the :config/)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "default_configuration=" do
|
65
|
+
it "should default to empty hash" do
|
66
|
+
Chatterbox::Services::Email.default_configuration.should == {}
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should set a hash of default configuration into :config hash" do
|
70
|
+
Chatterbox::Services::Email.configure :to => "to@example.com", :from => "from@example.com"
|
71
|
+
Chatterbox::Services::Email.default_configuration.should == { :to => "to@example.com", :from => "from@example.com"}
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should use default configuration" do
|
75
|
+
Chatterbox::Services::Email.configure :to => "to@example.com", :from => "from@example.com"
|
76
|
+
mail = Chatterbox::Services::Email.deliver(:message => {:summary => "summary"})
|
77
|
+
mail.to.should == ["to@example.com"]
|
78
|
+
mail.from.should == ["from@example.com"]
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should allow message specific configuration" do
|
82
|
+
Chatterbox::Services::Email.configure :to => "default-to@example.com", :from => "default-from@example.com"
|
83
|
+
mail = Chatterbox::Services::Email.deliver(:message => {:summary => "summary"},
|
84
|
+
:config => { :to => "joe@example.com", :from => "harry@example.com"} )
|
85
|
+
mail.to.should == ["joe@example.com"]
|
86
|
+
mail.from.should == ["harry@example.com"]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
File without changes
|
@@ -1,53 +1,51 @@
|
|
1
|
-
require
|
1
|
+
require "example_helper"
|
2
2
|
|
3
3
|
describe Chatterbox do
|
4
4
|
|
5
|
-
before
|
6
|
-
Chatterbox.logger = Logger.new(nil)
|
7
|
-
Chatterbox::Publishers.clear!
|
8
|
-
end
|
9
|
-
|
10
|
-
after do
|
11
|
-
Chatterbox.logger = nil
|
12
|
-
end
|
5
|
+
before { Chatterbox::Publishers.clear! }
|
13
6
|
|
14
7
|
describe "handle_notice" do
|
15
|
-
|
8
|
+
it "should return notification" do
|
9
|
+
Chatterbox.handle_notice("message").should == "message"
|
10
|
+
end
|
16
11
|
|
17
12
|
it "should publish the notice" do
|
18
|
-
Chatterbox.expects(:publish_notice).with(
|
19
|
-
Chatterbox.handle_notice(
|
13
|
+
Chatterbox.expects(:publish_notice).with({})
|
14
|
+
Chatterbox.handle_notice({})
|
20
15
|
end
|
21
16
|
|
17
|
+
it "should alias to notify" do
|
18
|
+
Chatterbox.expects(:publish_notice).with("message")
|
19
|
+
Chatterbox.notify("message")
|
20
|
+
end
|
22
21
|
end
|
23
22
|
|
24
23
|
describe "logger" do
|
24
|
+
after { Chatterbox.logger = nil }
|
25
25
|
|
26
|
-
it "
|
26
|
+
it "should allow a logger to be set" do
|
27
|
+
logger = Logger.new(nil)
|
28
|
+
Chatterbox.logger = logger
|
29
|
+
Chatterbox.logger.should == logger
|
30
|
+
end
|
31
|
+
|
32
|
+
it "uses logger with nil device by default" do
|
27
33
|
Chatterbox.logger = nil
|
28
|
-
|
29
|
-
Logger.expects(:new).with(STDOUT).returns("logger")
|
30
|
-
Chatterbox.stubs(:rails_default_logger).returns(nil)
|
34
|
+
Logger.expects(:new).with(nil).returns("logger")
|
31
35
|
Chatterbox.logger.should == "logger"
|
32
36
|
end
|
33
37
|
end
|
34
38
|
|
35
39
|
describe "publish" do
|
36
|
-
|
37
|
-
include Chatterbox
|
38
|
-
|
39
40
|
it "should call each publisher with the notice" do
|
40
|
-
notice = stub
|
41
41
|
publisher = Chatterbox::Publishers.register { "i'm in your block" }
|
42
|
-
publisher.expects(:call).with(
|
42
|
+
publisher.expects(:call).with({})
|
43
43
|
|
44
|
-
publish_notice(
|
44
|
+
Chatterbox.publish_notice({})
|
45
45
|
end
|
46
|
-
|
47
46
|
end
|
48
47
|
|
49
48
|
describe "publishers" do
|
50
|
-
|
51
49
|
it "should allow clearing all publishers" do
|
52
50
|
Chatterbox::Publishers.register { "sending your messages" }
|
53
51
|
Chatterbox::Publishers.publishers.size.should == 1
|