mail_manager 3.0.0 → 3.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.
Files changed (204) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +5 -0
  3. data/.rspec +1 -0
  4. data/.ruby-version +1 -1
  5. data/Gemfile +27 -10
  6. data/LICENSE.txt +2 -2
  7. data/MIT-LICENSE +1 -1
  8. data/README.md +97 -15
  9. data/{features/bounce_management.feature → app/assets/images/mail_manager/.gitkeep} +0 -0
  10. data/app/assets/images/mail_manager/BottomRight.gif +0 -0
  11. data/app/assets/images/mail_manager/MidRight.gif +0 -0
  12. data/app/assets/images/mail_manager/TopCenter.gif +0 -0
  13. data/app/assets/images/mail_manager/TopRight.gif +0 -0
  14. data/app/assets/images/mail_manager/calendar_date_select/calendar.gif +0 -0
  15. data/app/assets/images/mail_manager/iReach_logo.gif +0 -0
  16. data/app/assets/images/mail_manager/spacer.gif +0 -0
  17. data/app/assets/images/mail_manager/topMid.gif +0 -0
  18. data/app/assets/javascripts/mail_manager/application.js +19 -1
  19. data/app/assets/javascripts/mail_manager/jquery-ui-timepicker-addon.js +2134 -0
  20. data/app/assets/stylesheets/mail_manager/admin.css +261 -0
  21. data/app/assets/stylesheets/mail_manager/application.css +3 -1
  22. data/app/assets/stylesheets/mail_manager/nav.css +68 -0
  23. data/app/assets/stylesheets/mail_manager/timepicker.css +11 -0
  24. data/app/controllers/mail_manager/application_controller.rb +7 -2
  25. data/app/controllers/mail_manager/bounces_controller.rb +5 -10
  26. data/app/controllers/mail_manager/contacts_controller.rb +42 -20
  27. data/app/controllers/mail_manager/mailing_lists_controller.rb +5 -12
  28. data/app/controllers/mail_manager/mailings_controller.rb +18 -18
  29. data/app/controllers/mail_manager/messages_controller.rb +3 -10
  30. data/app/controllers/mail_manager/subscriptions_controller.rb +16 -75
  31. data/app/helpers/mail_manager/layout_helper.rb +43 -0
  32. data/app/models/mail_manager/bounce.rb +16 -5
  33. data/app/models/mail_manager/contact.rb +64 -1
  34. data/app/models/mail_manager/mailable.rb +14 -0
  35. data/app/models/mail_manager/mailer.rb +48 -81
  36. data/app/models/mail_manager/mailing.rb +23 -42
  37. data/app/models/mail_manager/message.rb +52 -8
  38. data/app/models/mail_manager/subscription.rb +9 -3
  39. data/app/models/status_history.rb +3 -2
  40. data/app/views/layouts/mail_manager/application.html.erb +33 -5
  41. data/app/views/layouts/mail_manager/layout.html.erb +15 -0
  42. data/app/views/mail_manager/bounces/index.html.erb +6 -4
  43. data/app/views/mail_manager/bounces/show.html.erb +3 -3
  44. data/app/views/mail_manager/contacts/_form.html.erb +7 -23
  45. data/app/views/mail_manager/contacts/edit.html.erb +3 -3
  46. data/app/views/mail_manager/contacts/index.html.erb +14 -28
  47. data/app/views/mail_manager/contacts/new.html.erb +2 -2
  48. data/app/views/mail_manager/contacts/show.html.erb +5 -5
  49. data/app/views/mail_manager/contacts/subscribe.html.erb +1 -1
  50. data/app/views/mail_manager/mailer/double_opt_in.erb +1 -1
  51. data/app/views/mail_manager/mailer/double_opt_in.html.erb +6 -0
  52. data/app/views/mail_manager/mailer/unsubscribed.erb +1 -1
  53. data/app/views/mail_manager/mailer/unsubscribed.html.erb +1 -1
  54. data/app/views/mail_manager/mailing_lists/_form.html.erb +8 -17
  55. data/app/views/mail_manager/mailing_lists/edit.html.erb +4 -4
  56. data/app/views/mail_manager/mailing_lists/index.html.erb +6 -5
  57. data/app/views/mail_manager/mailing_lists/new.html.erb +3 -3
  58. data/app/views/mail_manager/mailings/_form.html.erb +22 -44
  59. data/app/views/mail_manager/mailings/edit.html.erb +3 -3
  60. data/app/views/mail_manager/mailings/index.html.erb +23 -27
  61. data/app/views/mail_manager/mailings/new.html.erb +2 -2
  62. data/app/views/mail_manager/mailings/test.html.erb +3 -3
  63. data/app/views/mail_manager/messages/index.html.erb +2 -2
  64. data/app/views/mail_manager/subscriptions/_form.html.erb +1 -1
  65. data/app/views/mail_manager/subscriptions/_subscriptions.html.erb +2 -2
  66. data/app/views/mail_manager/subscriptions/edit.html.erb +2 -2
  67. data/app/views/mail_manager/subscriptions/index.html.erb +3 -3
  68. data/app/views/mail_manager/subscriptions/new.html.erb +1 -1
  69. data/app/views/mail_manager/subscriptions/unsubscribe.html.erb +1 -1
  70. data/app/views/mail_manager/subscriptions/unsubscribe_by_email_address.html.erb +3 -3
  71. data/config/locales/en.yml +13 -0
  72. data/config/locales/mailings.en.yml +52 -0
  73. data/config/routes.rb +21 -19
  74. data/db/migrate/008_add_bounces_count_to_mailings.rb +14 -0
  75. data/db/migrate/009_add_messages_count_to_mailings.rb +14 -0
  76. data/db/migrate/010_add_login_token_to_contact.rb +11 -0
  77. data/db/migrate/011_add_deleted_at_to_mailing.rb +11 -0
  78. data/lib/delayed/mailer.rb +9 -5
  79. data/lib/delayed/status.rb +6 -2
  80. data/lib/delayed_overrides/worker.rb +21 -0
  81. data/lib/deleteable.rb +13 -14
  82. data/lib/mail_manager/config.rb +3 -3
  83. data/lib/mail_manager/engine.rb +136 -7
  84. data/lib/mail_manager/lock.rb +1 -0
  85. data/lib/mail_manager/version.rb +1 -1
  86. data/lib/tasks/mail_manager.rake +92 -56
  87. data/mail_manager.gemspec +4 -0
  88. data/spec/rails_helper.rb +50 -0
  89. data/spec/spec_helper.rb +87 -48
  90. data/spec/test_app/.env.development +3 -0
  91. data/spec/test_app/.env.test +2 -0
  92. data/spec/test_app/.rspec +1 -0
  93. data/spec/test_app/Procfile +3 -0
  94. data/spec/test_app/app/controllers/application_controller.rb +4 -0
  95. data/spec/test_app/app/models/ability.rb +7 -0
  96. data/spec/test_app/app/models/user.rb +8 -2
  97. data/spec/test_app/app/models/user_with_role.rb +22 -0
  98. data/spec/test_app/config/database.postgres.yml +21 -0
  99. data/spec/test_app/config/database.sqlite.yml +2 -2
  100. data/spec/test_app/config/environment.rb +2 -2
  101. data/spec/test_app/config/environments/test.rb +13 -0
  102. data/spec/test_app/config/mail_manager.yml +66 -2
  103. data/spec/test_app/config/routes.rb +0 -1
  104. data/spec/test_app/db/migrate/20150420163235_add_bounces_count_to_mailings.rb +14 -0
  105. data/spec/test_app/db/migrate/20150420163804_add_messages_count_to_mailings.rb +14 -0
  106. data/spec/test_app/db/migrate/20150421151457_add_login_token_to_contact.rb +11 -0
  107. data/spec/test_app/db/migrate/20150423143754_add_deleted_at_to_mailing.rb +11 -0
  108. data/spec/test_app/db/schema.rb +10 -5
  109. data/spec/test_app/db/structure.sql +150 -15
  110. data/spec/test_app/features/bounce_management.feature +11 -0
  111. data/spec/test_app/features/contact_management.feature +91 -0
  112. data/{features → spec/test_app/features}/mailable.feature +3 -1
  113. data/spec/test_app/features/mailing_list_management.feature +39 -0
  114. data/spec/test_app/features/mailing_management.feature +60 -0
  115. data/{features → spec/test_app/features}/message.feature +4 -4
  116. data/spec/test_app/features/message_management.feature +22 -0
  117. data/spec/test_app/features/step_definitions/bounce_steps.rb +4 -0
  118. data/spec/test_app/features/step_definitions/contact_steps.rb +63 -0
  119. data/spec/test_app/features/step_definitions/debugging_steps.rb +3 -0
  120. data/spec/test_app/features/step_definitions/email_steps.rb +6 -0
  121. data/spec/test_app/features/step_definitions/job_steps.rb +25 -0
  122. data/spec/test_app/features/step_definitions/login_steps.rb +4 -0
  123. data/spec/test_app/features/step_definitions/mailing_list.rb +17 -0
  124. data/spec/test_app/features/step_definitions/mailing_steps.rb +51 -0
  125. data/spec/test_app/features/step_definitions/subscription_steps.rb +26 -0
  126. data/{features → spec/test_app/features}/step_definitions/webrat_steps.rb +10 -6
  127. data/spec/test_app/features/subscription_management.feature +62 -0
  128. data/spec/test_app/features/support/env.rb +37 -0
  129. data/spec/test_app/features/support/paths.rb +36 -0
  130. data/spec/test_app/lib/debugging.rb +61 -0
  131. data/spec/test_app/lib/post_office_manager.rb +71 -0
  132. data/spec/test_app/public/subscribe.html +40 -0
  133. data/spec/test_app/script/full_suite +50 -0
  134. data/spec/test_app/script/post_office +25 -0
  135. data/spec/test_app/script/rails +20 -0
  136. data/spec/test_app/script/rspec_multi_db +34 -0
  137. data/spec/test_app/spec/controllers/mail_manager/bounces_controller_spec.rb +59 -0
  138. data/spec/test_app/spec/controllers/mail_manager/contacts_controller_spec.rb +178 -0
  139. data/spec/test_app/spec/controllers/mail_manager/mailing_lists_controller_spec.rb +164 -0
  140. data/spec/test_app/spec/controllers/mail_manager/mailings_controller_spec.rb +184 -0
  141. data/spec/test_app/spec/controllers/users_controller_spec.rb +47 -46
  142. data/spec/test_app/spec/factories/_functions.rb +27 -0
  143. data/spec/test_app/spec/factories/contacts.rb +7 -0
  144. data/spec/test_app/spec/factories/mail_manager_bounces.rb +13 -0
  145. data/spec/test_app/spec/factories/mailable.rb +8 -0
  146. data/spec/test_app/spec/factories/mailings.rb +7 -1
  147. data/spec/test_app/spec/factories/message.rb +7 -0
  148. data/spec/test_app/spec/factories/users.rb +19 -7
  149. data/spec/test_app/spec/features/mail_manager/bounce_spec.rb +73 -0
  150. data/spec/test_app/spec/features/mail_manager/double_opt_in_spec.rb +62 -0
  151. data/spec/test_app/spec/features/mail_manager/mailing_spec.rb +46 -0
  152. data/spec/test_app/spec/features/navigation_spec.rb +9 -0
  153. data/spec/test_app/spec/helpers/mail_manager/layout_helper_spec.rb +41 -0
  154. data/spec/test_app/spec/helpers/mail_manager/subscriptions_helper_spec.rb +14 -0
  155. data/spec/test_app/spec/models/delayed/mailer_spec.rb +27 -0
  156. data/spec/test_app/spec/models/delayed/status_job_spec.rb +13 -0
  157. data/spec/test_app/spec/models/delayed/status_spec.rb +37 -0
  158. data/spec/test_app/spec/models/mail_manager/bounce_spec.rb +23 -3
  159. data/spec/test_app/spec/models/mail_manager/engine_spec.rb +79 -0
  160. data/spec/test_app/spec/models/mail_manager/mailable_spec.rb +10 -0
  161. data/spec/test_app/spec/models/mail_manager/mailer_spec.rb +35 -3
  162. data/spec/test_app/spec/models/mail_manager/mailing_list_spec.rb +5 -5
  163. data/spec/test_app/spec/models/mail_manager/mailing_spec.rb +58 -0
  164. data/spec/test_app/spec/models/mail_manager/message_spec.rb +112 -0
  165. data/spec/test_app/spec/models/user_spec.rb +10 -8
  166. data/spec/test_app/spec/rails_helper.rb +86 -0
  167. data/spec/test_app/spec/requests/users_spec.rb +3 -3
  168. data/spec/test_app/spec/routing/mail_manager/bounces_routing_spec.rb +27 -0
  169. data/spec/test_app/spec/routing/mail_manager/contacts_routing_spec.rb +36 -0
  170. data/spec/test_app/spec/routing/mail_manager/mailing_lists_routing_spec.rb +36 -0
  171. data/spec/test_app/spec/routing/mail_manager/mailings_routing_spec.rb +36 -0
  172. data/spec/test_app/spec/spec_helper.rb +82 -32
  173. data/spec/test_app/spec/support/continuance.rb +18 -0
  174. data/spec/test_app/spec/support/custom_matchers.rb +17 -0
  175. data/spec/test_app/spec/support/database_cleaner.rb +10 -1
  176. data/spec/test_app/spec/views/mail_manager/bounces/index.html.erb_spec.rb +32 -0
  177. data/spec/test_app/spec/views/mail_manager/bounces/show.html.erb_spec.rb +12 -0
  178. data/spec/test_app/spec/views/users/edit.html.erb_spec.rb +8 -5
  179. data/spec/test_app/spec/views/users/index.html.erb_spec.rb +10 -19
  180. data/spec/test_app/spec/views/users/new.html.erb_spec.rb +9 -6
  181. data/spec/test_app/spec/views/users/show.html.erb_spec.rb +8 -9
  182. metadata +231 -75
  183. data/.DS_Store +0 -0
  184. data/README.rdoc +0 -3
  185. data/app/.DS_Store +0 -0
  186. data/app/controllers/mail_manager/base_controller.rb +0 -22
  187. data/app/models/.DS_Store +0 -0
  188. data/features/contact_management.feature +0 -24
  189. data/features/mailing_management.feature +0 -78
  190. data/features/step_definitions/email_steps.rb +0 -50
  191. data/features/step_definitions/mlm_steps.rb +0 -11
  192. data/features/step_definitions/pickle_steps.rb +0 -41
  193. data/features/subscription_management.feature +0 -17
  194. data/features/support/env.rb +0 -11
  195. data/features/support/paths.rb +0 -44
  196. data/lib/tasks/mail_manager_tasks.rake +0 -4
  197. data/lib/tasks/rspec.rake +0 -165
  198. data/spec/test_app/bin/cucumber +0 -7
  199. data/spec/test_app/bin/rails +0 -10
  200. data/spec/test_app/bin/rake +0 -7
  201. data/spec/test_app/bin/rspec +0 -7
  202. data/spec/test_app/bin/spring +0 -18
  203. data/spec/test_app/spec/routing/users_routing_spec.rb +0 -35
  204. data/spec/test_app/spec/support/post_office.rb +0 -13
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  # This spec was generated by rspec-rails when you ran the scaffold generator.
4
4
  # It demonstrates how one might use RSpec to specify the controller code that
@@ -18,51 +18,57 @@ require 'spec_helper'
18
18
  # Message expectations are only used when there is no simpler way to specify
19
19
  # that an instance is receiving a specific message.
20
20
 
21
- describe UsersController do
21
+ RSpec.describe UsersController, :type => :controller do
22
22
 
23
23
  # This should return the minimal set of attributes required to create a valid
24
24
  # User. As you add validations to User, be sure to
25
25
  # adjust the attributes here as well.
26
- let(:valid_attributes) { FactoryGirl.attributes_for(:user) }
26
+ let(:valid_attributes) {
27
+ FactoryGirl.attributes_for(:user)
28
+ }
29
+
30
+ let(:invalid_attributes) {
31
+ FactoryGirl.attributes_for(:user, email: nil)
32
+ }
27
33
 
28
34
  # This should return the minimal set of values that should be in the session
29
35
  # in order to pass any filters (e.g. authentication) defined in
30
36
  # UsersController. Be sure to keep this updated too.
31
37
  let(:valid_session) { {} }
32
38
 
33
- describe "GET index" do
39
+ describe "GET #index" do
34
40
  it "assigns all users as @users" do
35
41
  user = User.create! valid_attributes
36
42
  get :index, {}, valid_session
37
- assigns(:users).should eq([user])
43
+ expect(assigns(:users)).to eq([user])
38
44
  end
39
45
  end
40
46
 
41
- describe "GET show" do
47
+ describe "GET #show" do
42
48
  it "assigns the requested user as @user" do
43
49
  user = User.create! valid_attributes
44
50
  get :show, {:id => user.to_param}, valid_session
45
- assigns(:user).should eq(user)
51
+ expect(assigns(:user)).to eq(user)
46
52
  end
47
53
  end
48
54
 
49
- describe "GET new" do
55
+ describe "GET #new" do
50
56
  it "assigns a new user as @user" do
51
57
  get :new, {}, valid_session
52
- assigns(:user).should be_a_new(User)
58
+ expect(assigns(:user)).to be_a_new(User)
53
59
  end
54
60
  end
55
61
 
56
- describe "GET edit" do
62
+ describe "GET #edit" do
57
63
  it "assigns the requested user as @user" do
58
64
  user = User.create! valid_attributes
59
65
  get :edit, {:id => user.to_param}, valid_session
60
- assigns(:user).should eq(user)
66
+ expect(assigns(:user)).to eq(user)
61
67
  end
62
68
  end
63
69
 
64
- describe "POST create" do
65
- describe "with valid params" do
70
+ describe "POST #create" do
71
+ context "with valid params" do
66
72
  it "creates a new User" do
67
73
  expect {
68
74
  post :create, {:user => valid_attributes}, valid_session
@@ -71,78 +77,73 @@ describe UsersController do
71
77
 
72
78
  it "assigns a newly created user as @user" do
73
79
  post :create, {:user => valid_attributes}, valid_session
74
- assigns(:user).should be_a(User)
75
- assigns(:user).should be_persisted
80
+ expect(assigns(:user)).to be_a(User)
81
+ expect(assigns(:user)).to be_persisted
76
82
  end
77
83
 
78
84
  it "redirects to the created user" do
79
85
  post :create, {:user => valid_attributes}, valid_session
80
- response.should redirect_to(User.last)
86
+ expect(response).to redirect_to(User.last)
81
87
  end
82
88
  end
83
89
 
84
- describe "with invalid params" do
90
+ context "with invalid params" do
85
91
  it "assigns a newly created but unsaved user as @user" do
86
- # Trigger the behavior that occurs when invalid params are submitted
87
- User.any_instance.stub(:save).and_return(false)
88
- post :create, {:user => { "first_name" => "invalid value" }}, valid_session
89
- assigns(:user).should be_a_new(User)
92
+ post :create, {:user => invalid_attributes}, valid_session
93
+ expect(assigns(:user)).to be_a_new(User)
90
94
  end
91
95
 
92
96
  it "re-renders the 'new' template" do
93
- # Trigger the behavior that occurs when invalid params are submitted
94
- User.any_instance.stub(:save).and_return(false)
95
- post :create, {:user => { "first_name" => "invalid value" }}, valid_session
96
- response.should render_template("new")
97
+ post :create, {:user => invalid_attributes}, valid_session
98
+ expect(response).to render_template("new")
97
99
  end
98
100
  end
99
101
  end
100
102
 
101
- describe "PUT update" do
102
- describe "with valid params" do
103
+ describe "PUT #update" do
104
+ context "with valid params" do
105
+ let(:new_attributes) {
106
+ FactoryGirl.attributes_for(:user)
107
+ }
108
+
103
109
  it "updates the requested user" do
104
110
  user = User.create! valid_attributes
105
- # Assuming there are no other users in the database, this
106
- # specifies that the User created on the previous line
107
- # receives the :update_attributes message with whatever params are
108
- # submitted in the request.
109
- User.any_instance.should_receive(:update_attributes).with({ "first_name" => "MyString" })
110
- put :update, {:id => user.to_param, :user => { "first_name" => "MyString" }}, valid_session
111
+ put :update, {:id => user.to_param, :user => new_attributes}, valid_session
112
+ user = User.find(user.id)
113
+ new_attributes.each_pair do |key,value|
114
+ expect(user.send(key)).to eq(value)
115
+ end
111
116
  end
112
117
 
113
118
  it "assigns the requested user as @user" do
114
119
  user = User.create! valid_attributes
115
120
  put :update, {:id => user.to_param, :user => valid_attributes}, valid_session
116
- assigns(:user).should eq(user)
121
+ expect(assigns(:user)).to eq(user)
117
122
  end
118
123
 
119
124
  it "redirects to the user" do
120
125
  user = User.create! valid_attributes
121
126
  put :update, {:id => user.to_param, :user => valid_attributes}, valid_session
122
- response.should redirect_to(user)
127
+ expect(response).to redirect_to(user)
123
128
  end
124
129
  end
125
130
 
126
- describe "with invalid params" do
131
+ context "with invalid params" do
127
132
  it "assigns the user as @user" do
128
133
  user = User.create! valid_attributes
129
- # Trigger the behavior that occurs when invalid params are submitted
130
- User.any_instance.stub(:save).and_return(false)
131
- put :update, {:id => user.to_param, :user => { "first_name" => "invalid value" }}, valid_session
132
- assigns(:user).should eq(user)
134
+ put :update, {:id => user.to_param, :user => invalid_attributes}, valid_session
135
+ expect(assigns(:user)).to eq(user)
133
136
  end
134
137
 
135
138
  it "re-renders the 'edit' template" do
136
139
  user = User.create! valid_attributes
137
- # Trigger the behavior that occurs when invalid params are submitted
138
- User.any_instance.stub(:save).and_return(false)
139
- put :update, {:id => user.to_param, :user => { "first_name" => "invalid value" }}, valid_session
140
- response.should render_template("edit")
140
+ put :update, {:id => user.to_param, :user => invalid_attributes}, valid_session
141
+ expect(response).to render_template("edit")
141
142
  end
142
143
  end
143
144
  end
144
145
 
145
- describe "DELETE destroy" do
146
+ describe "DELETE #destroy" do
146
147
  it "destroys the requested user" do
147
148
  user = User.create! valid_attributes
148
149
  expect {
@@ -153,7 +154,7 @@ describe UsersController do
153
154
  it "redirects to the users list" do
154
155
  user = User.create! valid_attributes
155
156
  delete :destroy, {:id => user.to_param}, valid_session
156
- response.should redirect_to(users_url)
157
+ expect(response).to redirect_to(users_url)
157
158
  end
158
159
  end
159
160
 
@@ -0,0 +1,27 @@
1
+ def random_bool
2
+ Kernel.rand(2) == 1
3
+ end
4
+
5
+ def random_int(min,max)
6
+ count = max - min + 1
7
+ Kernel.rand(count) + min
8
+ end
9
+
10
+ def random_decimal(min,max,precision=2)
11
+ multiplier = 10 ** precision
12
+ count = max - min + 1
13
+ puts "multiplier: #{multiplier}"
14
+ (Kernel.rand(count * multiplier) + min * multiplier).to_f / multiplier
15
+ end
16
+
17
+ def random_value(values)
18
+ values[random_int(0,(values.length-1))]
19
+ end
20
+
21
+ def generate_plain_text_from_html(html)
22
+ IO.popen('lynx -stdin --dump','w+') do |lynx|
23
+ lynx.write html
24
+ lynx.close_write
25
+ lynx.readlines.join
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :contact, class: MailManager::Contact do
3
+ first_name {Faker::Name.first_name}
4
+ last_name {Faker::Name.first_name}
5
+ email_address {Faker::Internet.email}
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ FactoryGirl.define do
2
+ factory :bounce, :class => 'MailManager::Bounce' do
3
+ status {random_value([:needs_manual_intervention,:unprocessed,:dismissed,
4
+ :resolved,:invalid
5
+ ])}
6
+ #status_changed_at {Time.now}
7
+ #bounce_message
8
+ #comments
9
+ #message nil
10
+ #mailing nil
11
+ end
12
+
13
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+ factory :mailable, class: MailManager::Mailable do
3
+ name {Faker::Company.bs.split(/\s+/).map(&:capitalize).join(" ")}
4
+ email_html {|a| %Q|<html><head><title>#{a.name}</title></head><body><h1>#{a.name}</h1><p><img src="file://#{MailManager::PLUGIN_ROOT}/app/assets/images/mail_manager/iReach_logo.gif"/><br/>#{Faker::Lorem.paragraphs.join("</p><p>")}</p></body></html>|}
5
+ email_text {|a| generate_plain_text_from_html(a.email_html)}
6
+ end
7
+ end
8
+
@@ -1,6 +1,12 @@
1
1
  # Read about factories at https://github.com/thoughtbot/factory_girl
2
2
 
3
3
  FactoryGirl.define do
4
- factory :mailing do
4
+ factory :mailing, class: MailManager::Mailing do
5
+ subject {Faker::Company.bs.split(/\s+/).map(&:capitalize).join(' ')}
6
+ from_email_address {Faker::Internet.email}
7
+ scheduled_at {Time.now.utc}
8
+ mailable_type "MailManager::Mailable"
9
+ mailable_id {(MailManager::Mailable.first || FactoryGirl.create(:mailable)).id}
10
+ include_images {random_int(0,1)}
5
11
  end
6
12
  end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :message, class: MailManager::Message do
3
+ mailing {MailManager::Mailing.first || FactoryGirl.create(:mailing)}
4
+ contact {MailManager::Contact.first || FactoryGirl.create(:contact)}
5
+ from_email_address {|a| a.contact.email_address}
6
+ end
7
+ end
@@ -1,10 +1,22 @@
1
1
  # Read about factories at https://github.com/thoughtbot/factory_girl
2
-
3
- FactoryGirl.define do
4
- factory :user do
5
- first_name {Faker::Name.first_name}
6
- last_name {Faker::Name.last_name}
7
- email {Faker::Internet.email}
8
- phone {Faker::PhoneNumber.phone_number}
2
+ begin
3
+ FactoryGirl.define do
4
+ factory :user do
5
+ first_name {Faker::Name.first_name}
6
+ last_name {Faker::Name.last_name}
7
+ email {Faker::Internet.email}
8
+ phone {Faker::PhoneNumber.phone_number}
9
+ factory :admin_user do
10
+ last_name 'admin'
11
+ end
12
+ end
13
+ factory :admin_user_with_role, class: UserWithRole do
14
+ first_name {Faker::Name.first_name}
15
+ last_name 'admin'
16
+ email {Faker::Internet.email}
17
+ phone {Faker::PhoneNumber.phone_number}
18
+ end
9
19
  end
20
+ rescue FactoryGirl::DuplicateDefinitionError => e
21
+ # this is ok ... duplicates when iReach uses it
10
22
  end
@@ -0,0 +1,73 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.feature MailManager::Bounce do
4
+ context "without any bounces" do
5
+ it "should render the page" do
6
+ visit mail_manager.bounces_path
7
+ expect(page.status_code).to eq(200)
8
+ expect(page.body).to match /Listing Bounces/
9
+ end
10
+ it "should render the page when an unsent mailing exists" do
11
+ FactoryGirl.create(:mailing)
12
+ visit mail_manager.bounces_path
13
+ expect(page.status_code).to eq(200)
14
+ expect(page.body).to match /Listing Bounces/
15
+ end
16
+ context "when searching", js: true do
17
+ before(:each) do
18
+ @mailing1 = FactoryGirl.create(:mailing)
19
+ @mailing2 = FactoryGirl.create(:mailing)
20
+ @bounce1 = FactoryGirl.create(:bounce, mailing_id: @mailing1.id, status: 'needs_manual_intervention')
21
+ @bounce2 = FactoryGirl.create(:bounce, mailing_id: @mailing2.id, status: 'resolved')
22
+ @bounce3 = FactoryGirl.create(:bounce, status: 'invalid')
23
+ @mailing1.reload
24
+ @mailing2.reload
25
+ end
26
+ it "filters by mailing", js: true do
27
+ visit "/mail_manager/bounces"
28
+ select "#{@mailing1.subject} (#{I18n.l @mailing1.status_changed_at}) (#{@mailing1.bounces.size})", from: "Mailing:"
29
+ expect(page).to have_css("#view_bounce_#{@bounce1.id}", count: 1)
30
+ expect(page).to have_content("View",count: 1)
31
+ end
32
+ it "shows them all", js: true do
33
+ visit "/mail_manager/bounces"
34
+ expect(page).to have_css("#view_bounce_#{@bounce1.id}", count: 1)
35
+ expect(page).to have_css("#view_bounce_#{@bounce2.id}", count: 1)
36
+ expect(page).to have_css("#view_bounce_#{@bounce3.id}", count: 1)
37
+ expect(page).to have_content("View",count: 3)
38
+ end
39
+ it "filters by 'Needs Attention' status" do
40
+ visit "/mail_manager/bounces"
41
+ select "Needs Attention", from: "Status:"
42
+ expect(page).to have_css("#view_bounce_#{@bounce1.id}", count: 1)
43
+ expect(page).to have_content("View",count: 1)
44
+ end
45
+ it "filters by 'Resolved' status" do
46
+ visit "/mail_manager/bounces"
47
+ select "Resolved", from: "Status:"
48
+ expect(page).to have_css("#view_bounce_#{@bounce2.id}", count: 1)
49
+ expect(page).to have_content("View",count: 1)
50
+ end
51
+ it "doesn't show 'invalid' status" do
52
+ visit "/mail_manager/bounces"
53
+ expect{select "Invalid", from: "Status:"}.to raise_error
54
+ end
55
+ it "filters by 'Resolved' status and mailing" do
56
+ visit "/mail_manager/bounces"
57
+ select "Needs Attention", from: "Status:"
58
+ select "#{@mailing1.subject} (#{I18n.l @mailing1.status_changed_at}) (#{@mailing1.bounces.size})", from: "Mailing:"
59
+ expect(page).to have_css("#view_bounce_#{@bounce1.id}", count: 1)
60
+ expect(page).to have_content("View",count: 1)
61
+ end
62
+ it "filter by mailing and status can hide all bounces" do
63
+ visit "/mail_manager/bounces"
64
+ select "Resolved", from: "Status:"
65
+ Debugging::wait_until_success do
66
+ expect(page).to have_content("View",count: 1)
67
+ end
68
+ select "#{@mailing1.subject} (#{I18n.l @mailing1.status_changed_at}) (#{@mailing1.bounces.size})", from: "Mailing:"
69
+ expect(page).to have_content "No bounces"
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,62 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.feature "Double Opt In Subscribe" do
4
+ before(:each) do
5
+ @mailing_list = FactoryGirl.create(:mailing_list)
6
+ MailManager::MailingList.update_all("id=1")
7
+ @mailing_list = MailManager::MailingList.find(1)
8
+ @other_mailing_list = FactoryGirl.create(:mailing_list)
9
+ end
10
+ it "creates a double opt in email when creating a new contact/subscription", truncate: true do
11
+ ActionMailer::Base.deliveries.clear
12
+ ActionMailer::Base.delivery_method = :test
13
+ Delayed::Worker.delay_jobs = false
14
+ visit "/subscribe.html"
15
+ fill_in "First Name", with: "Bobo"
16
+ fill_in "Last Name", with: "Clown"
17
+ fill_in "Email", with: "bobo@example.com"
18
+ click_button "Join"
19
+ Debugging::wait_until_success do
20
+ expect(MailManager::Contact.count).to eq 1
21
+ expect(MailManager::Subscription.count).to eq 1
22
+ end
23
+ contact = MailManager::Contact.first
24
+ subscription = MailManager::Subscription.first
25
+ expect(subscription.status).to eq 'pending'
26
+ email = ActionMailer::Base.deliveries.last
27
+ expect(ActionMailer::Base.deliveries.length).to eq 1
28
+ expect(email.to_s).to match /Confirm Newsletter Subscription/
29
+ and_it "email has the login token" do
30
+ expect(email.to_s).to match /#{contact.login_token}/
31
+ end
32
+ and_it "will give a new token if you try to opt in with a token that is more than 3 days old" do
33
+ Timecop.travel 3.days.from_now
34
+ old_token = contact.login_token
35
+ visit "#{MailManager.double_opt_in_path}/#{contact.login_token}"
36
+ contact = MailManager::Contact.find(contact.id)
37
+ expect(page).to have_content "Your token has expired"
38
+ expect(ActionMailer::Base.deliveries.length).to eq 2
39
+ expect(contact.login_token).not_to eq old_token
40
+ end
41
+ and_it "can confirm its subscription" do
42
+ visit "#{MailManager.double_opt_in_path}/#{contact.login_token}"
43
+ expect(MailManager::Subscription.count).to eq 1
44
+ subscription.reload
45
+ expect(subscription.status).to eq 'active'
46
+ end
47
+ Timecop.return
48
+ end
49
+ it "doesn't pay attention when the honeypot is submitted" do
50
+ ActionMailer::Base.deliveries.clear
51
+ ActionMailer::Base.delivery_method = :test
52
+ Delayed::Worker.delay_jobs = false
53
+ visit "/subscribe.html"
54
+ fill_in "First Name", with: "Bobo"
55
+ fill_in "Last Name", with: "Clown"
56
+ fill_in "Email", with: "bobo@example.com"
57
+ find(:css, "#company_name").set("FaSchizzle")
58
+ click_button "Join"
59
+ expect(MailManager::Contact.count).not_to eq 1
60
+ expect(MailManager::Subscription.count).not_to eq 1
61
+ end
62
+ end
@@ -0,0 +1,46 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.feature MailManager::Mailing, type: :feature do
4
+ context "a created mailing" do
5
+ before(:each) do
6
+ @mailing = FactoryGirl.create(:mailing)
7
+ end
8
+ it "soft deletes from the index page" do
9
+ visit "/mail_manager/mailings"
10
+ click_link "Delete"
11
+ expect(page).to have_content "Mailing successfully deleted"
12
+ expect(MailManager::Mailing.count).to eq 0
13
+ expect(MailManager::Mailing.deleted.count).to eq 1
14
+ end
15
+ it "doesn't blow up when trying to schedule a mailing with no scheduled_at" do
16
+ @mailing.update_attribute(:scheduled_at, nil)
17
+ visit "/mail_manager/mailings"
18
+ expect{click_link "Schedule"}.to raise_error
19
+ page.driver.put("/mail_manager/mailings/#{@mailing.id}/schedule")
20
+ expect(page.status_code).to eq 302
21
+ visit page.response_headers['Location']
22
+ expect(page.body).to have_content "Error! You must edit your mailing and set a time for your mailing to run."
23
+ end
24
+ it "can be scheduled" do
25
+ Delayed::Worker.delay_jobs = true
26
+ visit "/mail_manager/mailings"
27
+ click_link "Schedule"
28
+ expect(page).to have_content "Mailing scheduled"
29
+ @mailing = MailManager::Mailing.find(@mailing)
30
+ expect(@mailing.status).to eq "scheduled"
31
+ expect(Delayed::Job.count).to eq 1
32
+ and_it "can then be cancelled and its job removed" do
33
+ mailing2 = FactoryGirl.create(:mailing)
34
+ mailing2.schedule
35
+ expect(Delayed::Job.count).to eq 2
36
+ visit "/mail_manager/mailings"
37
+ click_link "cancel_mailing_#{@mailing.id}"
38
+ expect(page).to have_content "Mailing cancelled"
39
+ expect(Delayed::Job.count).to eq 1
40
+ expect(Delayed::Job.first.payload_object.object.id).to eql mailing2.id
41
+ end
42
+ Delayed::Worker.delay_jobs = false
43
+ end
44
+ end
45
+ end
46
+