msg 0.1.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.
Files changed (119) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +9 -0
  3. data/Rakefile +35 -0
  4. data/app/assets/images/msg/message.png +0 -0
  5. data/app/assets/images/msg/ping.png +0 -0
  6. data/app/assets/images/msg/sending.png +0 -0
  7. data/app/assets/javascripts/lib/jquery.peity.js +261 -0
  8. data/app/assets/javascripts/msg.js.coffee +6 -0
  9. data/app/assets/stylesheets/msg.css.sass +218 -0
  10. data/app/controllers/msg/bounces_controller.rb +67 -0
  11. data/app/controllers/msg/engine_controller.rb +23 -0
  12. data/app/controllers/msg/envelopes_controller.rb +22 -0
  13. data/app/controllers/msg/messages_controller.rb +85 -0
  14. data/app/controllers/msg/sendings_controller.rb +58 -0
  15. data/app/helpers/msg/msg_helper.rb +40 -0
  16. data/app/mailers/msg/devise_mailer.rb +20 -0
  17. data/app/mailers/msg/msg_mailer.rb +23 -0
  18. data/app/models/msg/bounce.rb +19 -0
  19. data/app/models/msg/envelope.rb +56 -0
  20. data/app/models/msg/message.rb +26 -0
  21. data/app/models/msg/sending.rb +54 -0
  22. data/app/views/layouts/msg/default.html.haml +30 -0
  23. data/app/views/layouts/msg/email.html.haml +10 -0
  24. data/app/views/msg/bounces/_listing.html.haml +5 -0
  25. data/app/views/msg/bounces/_report.html.haml +10 -0
  26. data/app/views/msg/bounces/index.html.haml +5 -0
  27. data/app/views/msg/devise_mailer/confirmation_instructions.en.html.haml +1 -0
  28. data/app/views/msg/devise_mailer/reset_password_instructions.en.html.haml +1 -0
  29. data/app/views/msg/envelopes/_listing.html.haml +5 -0
  30. data/app/views/msg/messages/_action_menu.html.haml +10 -0
  31. data/app/views/msg/messages/_form.html.haml +38 -0
  32. data/app/views/msg/messages/_instructions.html.haml +28 -0
  33. data/app/views/msg/messages/_message.html.haml +11 -0
  34. data/app/views/msg/messages/_saved_messages.html.haml +2 -0
  35. data/app/views/msg/messages/_transactional_messages.html.haml +3 -0
  36. data/app/views/msg/messages/edit.html.haml +7 -0
  37. data/app/views/msg/messages/index.html.haml +23 -0
  38. data/app/views/msg/messages/new.html.haml +7 -0
  39. data/app/views/msg/messages/preview.html.haml +4 -0
  40. data/app/views/msg/messages/show.html.haml +25 -0
  41. data/app/views/msg/msg_mailer/message_in_envelope.html.haml +2 -0
  42. data/app/views/msg/sendings/_form.html.haml +45 -0
  43. data/app/views/msg/sendings/_listing.html.haml +17 -0
  44. data/app/views/msg/sendings/_report.html.haml +8 -0
  45. data/app/views/msg/sendings/_sending.html.haml +22 -0
  46. data/app/views/msg/sendings/_sendings.html.haml +2 -0
  47. data/app/views/msg/sendings/index.html.haml +8 -0
  48. data/app/views/msg/sendings/new.html.haml +9 -0
  49. data/app/views/msg/sendings/review.html.haml +2 -0
  50. data/app/views/msg/sendings/show.html.haml +50 -0
  51. data/app/views/msg/shared/_toolbar.html.haml +17 -0
  52. data/config/cucumber.yml +8 -0
  53. data/config/locales/en.yml +76 -0
  54. data/config/routes.rb +26 -0
  55. data/db/migrate/20130320141926_msg_data.rb +54 -0
  56. data/db/migrate/20130327134754_sending_circumstances.rb +6 -0
  57. data/lib/msg.rb +88 -0
  58. data/lib/msg/engine.rb +23 -0
  59. data/lib/msg/receivers.rb +64 -0
  60. data/lib/msg/version.rb +3 -0
  61. data/lib/tasks/cucumber.rake +65 -0
  62. data/lib/tasks/msg_tasks.rake +4 -0
  63. data/spec/controllers/msg/bounces_controller_spec.rb +48 -0
  64. data/spec/controllers/msg/envelopes_controller_spec.rb +22 -0
  65. data/spec/controllers/msg/messages_controller_spec.rb +9 -0
  66. data/spec/controllers/msg/sendings_controller_spec.rb +47 -0
  67. data/spec/dummy/README.rdoc +261 -0
  68. data/spec/dummy/Rakefile +7 -0
  69. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  70. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  71. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  72. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  73. data/spec/dummy/app/models/user.rb +14 -0
  74. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  75. data/spec/dummy/config.ru +4 -0
  76. data/spec/dummy/config/application.rb +59 -0
  77. data/spec/dummy/config/boot.rb +10 -0
  78. data/spec/dummy/config/database.yml +25 -0
  79. data/spec/dummy/config/environment.rb +5 -0
  80. data/spec/dummy/config/environments/development.rb +37 -0
  81. data/spec/dummy/config/environments/production.rb +67 -0
  82. data/spec/dummy/config/environments/test.rb +41 -0
  83. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  84. data/spec/dummy/config/initializers/devise.rb +285 -0
  85. data/spec/dummy/config/initializers/inflections.rb +15 -0
  86. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  87. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  88. data/spec/dummy/config/initializers/session_store.rb +8 -0
  89. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  90. data/spec/dummy/config/locales/en.yml +5 -0
  91. data/spec/dummy/config/routes.rb +9 -0
  92. data/spec/dummy/db/development.sqlite3 +0 -0
  93. data/spec/dummy/db/migrate/2013032210540_users.rb +49 -0
  94. data/spec/dummy/db/migrate/20130326093048_msg_data.msg.rb +55 -0
  95. data/spec/dummy/db/schema.rb +96 -0
  96. data/spec/dummy/db/test.sqlite3 +0 -0
  97. data/spec/dummy/log/development.log +143 -0
  98. data/spec/dummy/log/test.log +1022 -0
  99. data/spec/dummy/public/404.html +26 -0
  100. data/spec/dummy/public/422.html +26 -0
  101. data/spec/dummy/public/500.html +25 -0
  102. data/spec/dummy/public/favicon.ico +0 -0
  103. data/spec/dummy/script/rails +6 -0
  104. data/spec/factories/msg/bounces.rb +9 -0
  105. data/spec/factories/msg/envelopes.rb +10 -0
  106. data/spec/factories/msg/messages.rb +10 -0
  107. data/spec/factories/msg/sendings.rb +7 -0
  108. data/spec/factories/users.rb +11 -0
  109. data/spec/helpers/msg/msg_helper_spec.rb +17 -0
  110. data/spec/lib/msg_spec.rb +15 -0
  111. data/spec/mailers/msg/devise_mailer_spec.rb +21 -0
  112. data/spec/mailers/msg/msg_mailer_spec.rb +36 -0
  113. data/spec/models/msg/bounce_spec.rb +19 -0
  114. data/spec/models/msg/envelope_spec.rb +62 -0
  115. data/spec/models/msg/message_spec.rb +19 -0
  116. data/spec/models/msg/sending_spec.rb +10 -0
  117. data/spec/routing/sendings_routing_spec.rb +31 -0
  118. data/spec/spec_helper.rb +70 -0
  119. metadata +446 -0
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,9 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_girl
2
+
3
+ FactoryGirl.define do
4
+ factory :bounce, :class => 'Msg::Bounce' do
5
+ factory :valid_bounce do
6
+ association :envelope, factory: :valid_envelope
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_girl
2
+
3
+ FactoryGirl.define do
4
+ factory :envelope, :class => 'Msg::Envelope' do
5
+ factory :valid_envelope do
6
+ association :receiver, factory: :user
7
+ sending
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_girl
2
+
3
+ FactoryGirl.define do
4
+ factory :message, :class => 'Msg::Message' do
5
+ from_name "bill"
6
+ from_address "bill@example.com"
7
+ subject "title"
8
+ body "lorem ipsum"
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_girl
2
+
3
+ FactoryGirl.define do
4
+ factory :sending, :class => 'Msg::Sending' do
5
+ message
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_girl
2
+
3
+ FactoryGirl.define do
4
+ factory :user do
5
+ name "bob"
6
+ email "bob@example.com"
7
+ factory :admin do
8
+ admin true
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ # Specs in this file have access to a helper object that includes
4
+ # the SendingsHelper. For example:
5
+ #
6
+ # describe SendingsHelper do
7
+ # describe "string concat" do
8
+ # it "concats two strings with spaces" do
9
+ # helper.concat_strings("this","that").should == "this that"
10
+ # end
11
+ # end
12
+ # end
13
+ module Msg
14
+ describe MsgHelper do
15
+ pending "add some examples to (or delete) #{__FILE__}"
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Msg do
4
+
5
+ it "should provide defaults" do
6
+ Msg.default_from_address = nil
7
+ Msg.default_from_address.should_not be_nil
8
+ end
9
+
10
+ it "should accept overrides" do
11
+ Msg.default_from_address = "my@email.org"
12
+ Msg.default_from_address.should eq "my@email.org"
13
+ end
14
+
15
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ module Msg
4
+ describe DeviseMailer do
5
+
6
+ context "sending a transactional message" do
7
+ before do
8
+ # @email = Msg::DeviseMailer
9
+ # @email.deliver
10
+ end
11
+
12
+ it "should have the right to: address"
13
+ it "should have the right from: address"
14
+ it "should have the right subject"
15
+ it "should have the right body"
16
+ it "should have the right message id"
17
+
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+ include EmailSpec::Helpers
3
+ include EmailSpec::Matchers
4
+ module Msg
5
+ describe MsgMailer do
6
+
7
+ context "sending a message in an envelope" do
8
+ before do
9
+ @envelope = FactoryGirl.create(:valid_envelope)
10
+ @email = Msg::MsgMailer.message_in_envelope(@envelope)
11
+ @email.deliver
12
+ end
13
+
14
+ it "should have the right to: address" do
15
+ @email.should deliver_to "#{@envelope.receiver.name} <#{@envelope.receiver.email}>"
16
+ end
17
+
18
+ it "should have the right from: address" do
19
+ @email.should deliver_from @envelope.from_address
20
+ end
21
+ it "should have the right subject" do
22
+ @email.should have_subject @envelope.subject
23
+ end
24
+
25
+ it "should have the right body" do
26
+ @email.should have_body_text @envelope.send(:render_with_tracker)
27
+ end
28
+
29
+ it "should have the right message id" do
30
+ @email["Message-ID"].should eq @envelope.email_id
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ module Msg
4
+ describe Msg::Bounce do
5
+
6
+ # we get our bounce notifications from SNS so they have a very consistent structure
7
+
8
+ before :each do
9
+ @bounce = FactoryGirl.create(:valid_bounce)
10
+ end
11
+
12
+ it "should require an envelope" do
13
+ @bounce.should be_valid
14
+ @bounce.envelope = nil
15
+ @bounce.should_not be_valid
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ module Msg
4
+ describe Envelope do
5
+
6
+ before :each do
7
+ @envelope = FactoryGirl.create(:valid_envelope)
8
+ @message = @envelope.message
9
+ end
10
+
11
+ it "should require a receiver" do
12
+ @envelope.should be_valid
13
+ @envelope.receiver = nil
14
+ @envelope.should_not be_valid
15
+ end
16
+
17
+ it "should require a sending" do
18
+ @envelope.should be_valid
19
+ @envelope.sending = nil
20
+ @envelope.should_not be_valid
21
+ end
22
+
23
+ it "should generate a tracker url" do
24
+ pending "tracker?"
25
+ end
26
+
27
+ it "should by default be marked unopened" do
28
+ @envelope.opened_at.should be_nil
29
+ end
30
+
31
+ it "should be marked opened once opened" do
32
+ @envelope.open!
33
+ @envelope.opened_at.should_not be_nil
34
+ end
35
+
36
+ it "should store the message subject" do
37
+ @envelope.subject.should_not be_nil
38
+ @envelope.subject.should eq @message.subject
39
+ end
40
+
41
+ it "should store the message to: address" do
42
+ @envelope.to_address.should_not be_nil
43
+ @envelope.to_address.should eq @envelope.receiver.email
44
+ end
45
+
46
+ it "should store the message from: address" do
47
+ @envelope.from_address.should_not be_nil
48
+ @envelope.from_address.should eq "#{@message.from_name} <#{@message.from_address}>"
49
+ end
50
+
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
+ it "should send the message" do
56
+ @envelope.send(:send_email)
57
+ @envelope.sent_at.should_not be_nil
58
+ pending "test for send"
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ module Msg
4
+ describe Message do
5
+
6
+ # Receivers must define a for_email method, which returns the hash we pass to the mustache
7
+ # template. In the dummy we can use any old value just to test that they get through.
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
+ it "should accept tags allowed in Msg configuration"
14
+ it "should reject tags not allowed in Msg configuration"
15
+ it "should accept attributes allowed in Msg configuration"
16
+ it "should reject attributes not allowed in Msg configuration"
17
+
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ module Msg
4
+ describe Sending do
5
+
6
+ # perhaps some basic structural tests should go here, but the sending is really just a glue class:
7
+ # a vehicle for our selection and reporting processes
8
+
9
+ end
10
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+ module Msg
3
+ describe SendingsController do
4
+ describe "routing" do
5
+ it "routes to #index" do
6
+ pending
7
+ get("/sendings").should route_to("msg/sendings#index")
8
+ end
9
+
10
+ it "routes to #show" do
11
+ pending
12
+ get("/sendings/1").should route_to("msg/sendings#show", :id => "1")
13
+ end
14
+
15
+ it "routes to #new" do
16
+ pending
17
+ get("/sendings/new").should route_to("msg/sendings#new")
18
+ end
19
+
20
+ it "routes to #create" do
21
+ pending
22
+ post("/sendings").should route_to("msg/sendings#create")
23
+ end
24
+
25
+ it "routes to #destroy" do
26
+ pending
27
+ delete("/sendings/1").should route_to("msg/sendings#destroy", :id => "1")
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,70 @@
1
+ require 'spork'
2
+ #uncomment the following line to use spork with the debugger
3
+ #require 'spork/ext/ruby-debug'
4
+
5
+ Spork.prefork do
6
+ ENV["RAILS_ENV"] = 'test' #bah
7
+ require File.expand_path("../dummy/config/environment", __FILE__)
8
+
9
+ require 'bundler/setup'
10
+ require 'rspec/rails'
11
+ require 'rspec/autorun'
12
+ require 'factory_girl_rails'
13
+ require 'database_cleaner'
14
+ require 'email_spec'
15
+ # Requires supporting ruby files with custom matchers and macros, etc,
16
+ # in spec/support/ and its subdirectories.
17
+ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
18
+
19
+ RSpec.configure do |config|
20
+ # ## Mock Framework
21
+ #
22
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
23
+ #
24
+ # config.mock_with :mocha
25
+ # config.mock_with :flexmock
26
+ # config.mock_with :rr
27
+
28
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
29
+ # config.fixture_path = "#{::Rails.root}/spec/fixtures"
30
+
31
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
32
+ # examples within a transaction, remove the following line or assign false
33
+ # instead of true.
34
+ config.use_transactional_fixtures = false
35
+
36
+ # If true, the base class of anonymous controllers will be inferred
37
+ # automatically. This will be the default behavior in future versions of
38
+ # rspec-rails.
39
+ config.infer_base_class_for_anonymous_controllers = true
40
+
41
+ # Run specs in random order to surface order dependencies. If you find an
42
+ # order dependency and want to debug it, you can fix the order by providing
43
+ # the seed, which is printed after each run.
44
+ # --seed 1234
45
+ config.order = "random"
46
+
47
+ config.before(:suite) do
48
+ DatabaseCleaner.strategy = :transaction
49
+ DatabaseCleaner.clean_with(:truncation)
50
+ end
51
+ config.before(:each) do
52
+ DatabaseCleaner.start
53
+ end
54
+ config.after(:each) do
55
+ DatabaseCleaner.clean
56
+ end
57
+
58
+ end
59
+
60
+ ## controller methods
61
+ # devise sign_in
62
+ def sign_in_admin
63
+ sign_in FactoryGirl.create(:admin)
64
+ end
65
+
66
+ end
67
+
68
+ Spork.each_run do
69
+
70
+ end