msg 0.1.0 → 0.2.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/app/assets/stylesheets/msg.css.sass +24 -17
- data/app/controllers/msg/bounces_controller.rb +29 -46
- data/app/controllers/msg/messages_controller.rb +3 -1
- data/app/mailers/msg/devise_mailer.rb +3 -2
- data/app/models/msg/bounce.rb +3 -2
- data/app/views/msg/bounces/index.html.haml +4 -0
- data/app/views/msg/messages/index.html.haml +6 -3
- data/app/views/msg/sendings/index.html.haml +4 -0
- data/app/views/msg/sendings/show.html.haml +5 -0
- data/db/migrate/20130423091642_bounced_recipients.rb +7 -0
- data/lib/msg.rb +1 -0
- data/lib/msg/version.rb +1 -1
- data/spec/controllers/msg/bounces_controller_spec.rb +35 -8
- data/spec/controllers/msg/sendings_controller_spec.rb +2 -1
- data/spec/dummy/db/schema.rb +8 -3
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +3 -0
- data/spec/dummy/log/test.log +13798 -0
- data/spec/factories/msg/bounces.rb +1 -0
- data/spec/models/msg/bounce_spec.rb +2 -2
- data/spec/models/msg/envelope_spec.rb +4 -9
- data/spec/models/msg/message_spec.rb +0 -4
- data/spec/requests/bounce_notification_spec.rb +41 -0
- data/spec/requests/sns_confirmation_spec.rb +25 -0
- data/spec/routing/sendings_routing_spec.rb +5 -10
- data/spec/spec_helper.rb +5 -0
- metadata +8 -5
- data/spec/dummy/db/migrate/20130326093048_msg_data.msg.rb +0 -55
@@ -9,9 +9,9 @@ module Msg
|
|
9
9
|
@bounce = FactoryGirl.create(:valid_bounce)
|
10
10
|
end
|
11
11
|
|
12
|
-
it "should require an
|
12
|
+
it "should require an email address" do
|
13
13
|
@bounce.should be_valid
|
14
|
-
@bounce.
|
14
|
+
@bounce.email = nil
|
15
15
|
@bounce.should_not be_valid
|
16
16
|
end
|
17
17
|
|
@@ -20,10 +20,6 @@ module Msg
|
|
20
20
|
@envelope.should_not be_valid
|
21
21
|
end
|
22
22
|
|
23
|
-
it "should generate a tracker url" do
|
24
|
-
pending "tracker?"
|
25
|
-
end
|
26
|
-
|
27
23
|
it "should by default be marked unopened" do
|
28
24
|
@envelope.opened_at.should be_nil
|
29
25
|
end
|
@@ -48,14 +44,13 @@ module Msg
|
|
48
44
|
@envelope.from_address.should eq "#{@message.from_name} <#{@message.from_address}>"
|
49
45
|
end
|
50
46
|
|
51
|
-
it "should render the message contents and append a tracker dot" do
|
52
|
-
@envelope.send(:render_with_tracker).should eq "#{@message.body}<img src=\"#{@envelope.url_to_open}\" />"
|
53
|
-
end
|
54
|
-
|
55
47
|
it "should send the message" do
|
56
48
|
@envelope.send(:send_email)
|
57
49
|
@envelope.sent_at.should_not be_nil
|
58
|
-
|
50
|
+
mail = ActionMailer::Base.deliveries.last
|
51
|
+
mail[:from].to_s.should == @envelope.from_address
|
52
|
+
mail[:subject].to_s.should == @envelope.subject
|
53
|
+
mail[:message_id].to_s.should == @envelope.email_id.to_s
|
59
54
|
end
|
60
55
|
|
61
56
|
end
|
@@ -6,10 +6,6 @@ module Msg
|
|
6
6
|
# Receivers must define a for_email method, which returns the hash we pass to the mustache
|
7
7
|
# template. In the dummy we can use any old value just to test that they get through.
|
8
8
|
it "should interpolate values provided by the receiver"
|
9
|
-
|
10
|
-
# after rendering and before sending we have to strip out anything foolish or malicious
|
11
|
-
# that has been entered by a user.
|
12
|
-
it "should sanitize html in the rendered template"
|
13
9
|
it "should accept tags allowed in Msg configuration"
|
14
10
|
it "should reject tags not allowed in Msg configuration"
|
15
11
|
it "should accept attributes allowed in Msg configuration"
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Bounce notification" do
|
4
|
+
|
5
|
+
it "creates some Bounce objects" do
|
6
|
+
envelope = FactoryGirl.create(:valid_envelope)
|
7
|
+
bounce = {
|
8
|
+
"notificationType" => "Bounce",
|
9
|
+
"bounce" => {
|
10
|
+
"bounceType" => "Permanent",
|
11
|
+
"reportingMTA" => "dns; email.example.com",
|
12
|
+
"bouncedRecipients" => [
|
13
|
+
{
|
14
|
+
"emailAddress" => "username@example.com",
|
15
|
+
"status" => "5.1.1",
|
16
|
+
"action" => "failed",
|
17
|
+
"diagnosticCode" => "smtp; 550 5.1.1 <username@example.com>... User"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"emailAddress" => "othername@example.com"
|
21
|
+
}
|
22
|
+
],
|
23
|
+
"bounceSubType" => "General",
|
24
|
+
"timestamp" => "2012-06-19T01:07:52.000Z",
|
25
|
+
"feedbackId" => "00000138111222aa-33322211-cccc-cccc-cccc-ddddaaaa068a-000000"
|
26
|
+
},
|
27
|
+
"mail" => {
|
28
|
+
"timestamp" => "2012-06-19T01:05:45.000Z",
|
29
|
+
"source" => "sender@example.com",
|
30
|
+
"messageId" => envelope.email_id,
|
31
|
+
"destination" => [
|
32
|
+
"username@example.com"
|
33
|
+
]
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
post msg.bounces_url, bounce.to_json, {'x-amz-sns-message-type' => "Notification", 'Content-Type' => 'text/plain; charset=UTF-8'}
|
38
|
+
expect(response).to be_success
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "SNS subscription confirmation" do
|
4
|
+
|
5
|
+
it "calls the given url" do
|
6
|
+
envelope = FactoryGirl.create(:valid_envelope)
|
7
|
+
confirmation = {
|
8
|
+
"Type" => "SubscriptionConfirmation",
|
9
|
+
"MessageId" => "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
|
10
|
+
"Token" => "2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736",
|
11
|
+
"TopicArn" => "arn:aws:sns:us-east-1:123456789012:MyTopic",
|
12
|
+
"Message" => "You have chosen to subscribe to the topic arn:aws:sns:us-east-1:123456789012:MyTopic. To confirm the subscription, visit the SubscribeURL included in this message.",
|
13
|
+
"SubscribeURL" => "https://amazonses.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-1:123456789012:MyTopic&Token=2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736",
|
14
|
+
"Timestamp" => "2012-04-26T20:45:04.751Z",
|
15
|
+
"SignatureVersion" => "1",
|
16
|
+
"Signature" => "EXAMPLEpH+DcEwjAPg8O9mY8dReBSwksfg2S7WKQcikcNKWLQjwu6A4VbeS0QHVCkhRS7fUQvi2egU3N858fiTDN6bkkOxYDVrY0Ad8L10Hs3zH81mtnPk5uvvolIC1CXGu43obcgFxeL3khZl8IKvO61GWB6jI9b5+gLPoBc1Q=",
|
17
|
+
"SigningCertURL" => "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
|
18
|
+
}
|
19
|
+
|
20
|
+
post msg.bounces_url, confirmation.to_json, {'x-amz-sns-message-type' => "SubscriptionConfirmation", 'Content-Type' => 'text/plain; charset=UTF-8'}
|
21
|
+
expect(response).to be_success
|
22
|
+
FakeWeb.should have_requested(:get, "https://amazonses.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-1:123456789012:MyTopic&Token=2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736")
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -3,28 +3,23 @@ module Msg
|
|
3
3
|
describe SendingsController do
|
4
4
|
describe "routing" do
|
5
5
|
it "routes to #index" do
|
6
|
-
|
7
|
-
get("/sendings").should route_to("msg/sendings#index")
|
6
|
+
get("/msg/sendings").should route_to("msg/sendings#index")
|
8
7
|
end
|
9
8
|
|
10
9
|
it "routes to #show" do
|
11
|
-
|
12
|
-
get("/sendings/1").should route_to("msg/sendings#show", :id => "1")
|
10
|
+
get("/msg/sendings/1").should route_to("msg/sendings#show", :id => "1")
|
13
11
|
end
|
14
12
|
|
15
13
|
it "routes to #new" do
|
16
|
-
|
17
|
-
get("/sendings/new").should route_to("msg/sendings#new")
|
14
|
+
get("/msg/sendings/new").should route_to("msg/sendings#new")
|
18
15
|
end
|
19
16
|
|
20
17
|
it "routes to #create" do
|
21
|
-
|
22
|
-
post("/sendings").should route_to("msg/sendings#create")
|
18
|
+
post("/msg/sendings").should route_to("msg/sendings#create")
|
23
19
|
end
|
24
20
|
|
25
21
|
it "routes to #destroy" do
|
26
|
-
|
27
|
-
delete("/sendings/1").should route_to("msg/sendings#destroy", :id => "1")
|
22
|
+
delete("/msg/sendings/1").should route_to("msg/sendings#destroy", :id => "1")
|
28
23
|
end
|
29
24
|
end
|
30
25
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -12,6 +12,9 @@ Spork.prefork do
|
|
12
12
|
require 'factory_girl_rails'
|
13
13
|
require 'database_cleaner'
|
14
14
|
require 'email_spec'
|
15
|
+
require 'fakeweb'
|
16
|
+
require 'fakeweb_matcher'
|
17
|
+
|
15
18
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
16
19
|
# in spec/support/ and its subdirectories.
|
17
20
|
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
@@ -47,6 +50,8 @@ Spork.prefork do
|
|
47
50
|
config.before(:suite) do
|
48
51
|
DatabaseCleaner.strategy = :transaction
|
49
52
|
DatabaseCleaner.clean_with(:truncation)
|
53
|
+
FakeWeb.allow_net_connect = false
|
54
|
+
FakeWeb.register_uri(:get, %r|https://amazonses\.com/\?|, :body => "What ho!")
|
50
55
|
end
|
51
56
|
config.before(:each) do
|
52
57
|
DatabaseCleaner.start
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: msg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -140,7 +140,7 @@ dependencies:
|
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
142
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
143
|
+
name: httparty
|
144
144
|
requirement: !ruby/object:Gem::Requirement
|
145
145
|
none: false
|
146
146
|
requirements:
|
@@ -298,6 +298,7 @@ files:
|
|
298
298
|
- config/routes.rb
|
299
299
|
- db/migrate/20130320141926_msg_data.rb
|
300
300
|
- db/migrate/20130327134754_sending_circumstances.rb
|
301
|
+
- db/migrate/20130423091642_bounced_recipients.rb
|
301
302
|
- lib/msg/engine.rb
|
302
303
|
- lib/msg/receivers.rb
|
303
304
|
- lib/msg/version.rb
|
@@ -336,7 +337,6 @@ files:
|
|
336
337
|
- spec/dummy/config.ru
|
337
338
|
- spec/dummy/db/development.sqlite3
|
338
339
|
- spec/dummy/db/migrate/2013032210540_users.rb
|
339
|
-
- spec/dummy/db/migrate/20130326093048_msg_data.msg.rb
|
340
340
|
- spec/dummy/db/schema.rb
|
341
341
|
- spec/dummy/db/test.sqlite3
|
342
342
|
- spec/dummy/log/development.log
|
@@ -361,6 +361,8 @@ files:
|
|
361
361
|
- spec/models/msg/envelope_spec.rb
|
362
362
|
- spec/models/msg/message_spec.rb
|
363
363
|
- spec/models/msg/sending_spec.rb
|
364
|
+
- spec/requests/bounce_notification_spec.rb
|
365
|
+
- spec/requests/sns_confirmation_spec.rb
|
364
366
|
- spec/routing/sendings_routing_spec.rb
|
365
367
|
- spec/spec_helper.rb
|
366
368
|
homepage: https://github.com/spanner/msg
|
@@ -417,7 +419,6 @@ test_files:
|
|
417
419
|
- spec/dummy/config.ru
|
418
420
|
- spec/dummy/db/development.sqlite3
|
419
421
|
- spec/dummy/db/migrate/2013032210540_users.rb
|
420
|
-
- spec/dummy/db/migrate/20130326093048_msg_data.msg.rb
|
421
422
|
- spec/dummy/db/schema.rb
|
422
423
|
- spec/dummy/db/test.sqlite3
|
423
424
|
- spec/dummy/log/development.log
|
@@ -442,5 +443,7 @@ test_files:
|
|
442
443
|
- spec/models/msg/envelope_spec.rb
|
443
444
|
- spec/models/msg/message_spec.rb
|
444
445
|
- spec/models/msg/sending_spec.rb
|
446
|
+
- spec/requests/bounce_notification_spec.rb
|
447
|
+
- spec/requests/sns_confirmation_spec.rb
|
445
448
|
- spec/routing/sendings_routing_spec.rb
|
446
449
|
- spec/spec_helper.rb
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# This migration comes from msg (originally 20130320141926)
|
2
|
-
class MsgData < ActiveRecord::Migration
|
3
|
-
def change
|
4
|
-
create_table :msg_messages do |t|
|
5
|
-
t.string :subject
|
6
|
-
t.string :from_address
|
7
|
-
t.string :from_name
|
8
|
-
t.text :body
|
9
|
-
t.string :function
|
10
|
-
t.text :description
|
11
|
-
t.boolean :transactional, :default => false
|
12
|
-
t.boolean :saved, :default => false
|
13
|
-
t.integer :created_by_id
|
14
|
-
t.timestamps
|
15
|
-
end
|
16
|
-
|
17
|
-
create_table :msg_sendings do |t|
|
18
|
-
t.integer :message_id
|
19
|
-
t.integer :created_by_id
|
20
|
-
t.datetime :sent_at
|
21
|
-
t.timestamps
|
22
|
-
end
|
23
|
-
add_index :msg_sendings, :message_id
|
24
|
-
add_index :msg_sendings, :created_by_id
|
25
|
-
|
26
|
-
create_table :msg_envelopes do |t|
|
27
|
-
t.integer :sending_id
|
28
|
-
t.integer :receiver_id
|
29
|
-
t.integer :email_id
|
30
|
-
t.string :receiver_type
|
31
|
-
t.string :to_address
|
32
|
-
t.string :from_address
|
33
|
-
t.string :subject
|
34
|
-
t.text :contents
|
35
|
-
t.datetime :sent_at
|
36
|
-
t.datetime :opened_at
|
37
|
-
t.timestamps
|
38
|
-
end
|
39
|
-
add_index :msg_envelopes, :sending_id
|
40
|
-
add_index :msg_envelopes, :email_id
|
41
|
-
add_index :msg_envelopes, :receiver_id
|
42
|
-
add_index :msg_envelopes, [:receiver_id, :receiver_type]
|
43
|
-
|
44
|
-
create_table :msg_bounces do |t|
|
45
|
-
t.integer :envelope_id
|
46
|
-
t.string :bounce_type
|
47
|
-
t.string :bounce_subtype
|
48
|
-
t.string :reporter
|
49
|
-
t.text :raw_message
|
50
|
-
t.timestamps
|
51
|
-
end
|
52
|
-
add_index :msg_bounces, :envelope_id
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|