msg 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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