mail_manager 3.0.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -3,7 +3,8 @@ Feature: Mailable Registration
3
3
  As an object
4
4
  I want be able to register as a mailable object
5
5
 
6
- Scenario: reusable mailables will be available when I create a new mailing
6
+ @wip
7
+ Scenario: reusable mailables will be available when I create a new mailing
7
8
  Given the following mlm mailable records
8
9
  | name | email_html | email_text | reusable |
9
10
  | June Newsletter | <head><title>June Newsletter</title><body>June Newsletter</body></html> | June Newsletter | true |
@@ -13,6 +14,7 @@ Feature: Mailable Registration
13
14
  Then I should see "June Newsletter"
14
15
  And I should not see "July Newsletter"
15
16
 
17
+ @wip
16
18
  Scenario: a new raw mailable can be created when creating a new mailing
17
19
  When I go to the new mlm mailing page
18
20
  And I select "New Mailable" from "mailing[mailable]"
@@ -0,0 +1,39 @@
1
+ Feature: Mailing List Management
2
+ In order have mailing lists
3
+ As a valid user
4
+ I want to create, modify and destroy mailing lists
5
+
6
+ Background:
7
+ Given I am logged in and authorized for everything
8
+
9
+ Scenario: Create a Mailing List
10
+ When I go to the mailing lists page
11
+ And I follow "New Mailing List"
12
+ And I fill in "Name" with "Bobo's Mailing List"
13
+ And I fill in "Description" with "Bobo's mailing list is Awesome!"
14
+ And I press "Submit"
15
+ Then I should see "Mailing List was successfully created"
16
+ And a mailing list named "Bobo's Mailing List" should exist
17
+
18
+ Scenario: Edit a Mailing List
19
+ Given a mailing list named "Funk" exists
20
+ When I go to the mailing lists page
21
+ And I follow "Edit"
22
+ And I fill in "Name" with "Junk"
23
+ And I press "Submit"
24
+ Then I should see "Mailing List was successfully updated"
25
+ And a mailing list named "Junk" should exist
26
+
27
+ Scenario: Mailing Lists can be destroyed
28
+ Given a mailing list named "Funk" exists
29
+ When I go to the mailing lists page
30
+ And I follow "Delete"
31
+ Then I should see "Mailing List was deleted."
32
+ And I should not see "Funk"
33
+
34
+ Scenario: Mailing lists paginate
35
+ Given 50 mailing lists exist
36
+ When I go to the mailing lists page
37
+ Then I should see "Previous"
38
+ And I should see "Next"
39
+ When I follow "Next"
@@ -0,0 +1,60 @@
1
+ Feature: Mailing Management
2
+ In order send mailings to my mailing list
3
+ As a valid user
4
+ I want to create, modify, schedule and cancel mailings
5
+
6
+ Background:
7
+ Given I am logged in and authorized for everything
8
+ And a mailing with subject "Buy my junk!" exists
9
+ And a mailing list named "Funk" exists
10
+ And I clear the job queue
11
+ And I set jobs to be delayed
12
+
13
+ Scenario: edit a mailing
14
+ When I go to the mailings page
15
+ And I follow "Edit"
16
+ Then I should see "Edit Buy my junk!"
17
+ When I check "Funk"
18
+ And I fill in "Email subject" with "Buy my Stuff!"
19
+ And I press "Submit"
20
+ Then the mailing with subject "Buy my Stuff!" should be sending to lists "Funk"
21
+
22
+ Scenario: schedule a mailing
23
+ When I go to the mailings page
24
+ And the "Schedule" link has a confirmation that includes "Are you sure you want to start the mailing at"
25
+ And I follow "Schedule"
26
+ Then I should see "Buy my junk!"
27
+ And the mailing with subject "Buy my junk!" should be scheduled
28
+ And I should see "scheduled"
29
+ And I should see "Edit"
30
+ And I should see "Cancel"
31
+
32
+ Scenario: Cancel a mailing
33
+ Given the mailing with subject "Buy my junk!" is scheduled
34
+ When I go to the mailings page
35
+ And I follow "Cancel"
36
+ Then I should see "Buy my junk!"
37
+ And the mailing with subject "Buy my junk!" should be canceled
38
+ And I should see "pending"
39
+ And I should see "Send Test"
40
+ And I should see "Edit"
41
+
42
+ Scenario: send a test message for mailing
43
+ When I go to the mailings page
44
+ And I follow "Send Test"
45
+ And I fill in "test_email_addresses" with "test@example.com"
46
+ And I press "Send Test Email"
47
+ Then I should see "Buy my junk!"
48
+ And I should see "Send Test"
49
+ And I should see "Edit"
50
+ And a test email job should exist for mailing with subject "Buy my junk!" and email "test@example.com"
51
+ When I run all jobs
52
+ Then an email is sent to "test@example.com" with subject "Buy my junk!"
53
+
54
+ Scenario: Many mailings existing will show pagination
55
+ Given 50 mailings exist
56
+ When I go to the mailings page
57
+ Then I should see "Previous"
58
+ And I should see "Next"
59
+ When I follow "Next"
60
+
@@ -3,9 +3,9 @@ Feature: Messages are tied to mailings even without subscriptions
3
3
  As an administrator
4
4
  I want to send messages for contacts that aren't subscribed
5
5
 
6
- Given I am logged in and authorized for everything
7
- And a mailing: "Mailing" exists
8
- And a contact: "Contact" exists with email_address: "bob@example.com"
9
- And a
6
+ Scenario:
7
+ Given I am logged in and authorized for everything
8
+ And a mailing with subject "Mailing" exists
9
+ And a contact named "Bob Dole" exists with email_address "bob@example.com"
10
10
 
11
11
 
@@ -0,0 +1,22 @@
1
+ Feature: view messages for mailings
2
+ In order to see messages and their statuses for mailings
3
+ As a valid user
4
+ I want to search for messages by mailing and status
5
+
6
+ Background:
7
+ Given I am logged in and authorized for everything
8
+ And a mailing with subject "Buy my junk!" exists
9
+ And a mailing list named "Funk" exists
10
+ And the mailing with subject "Buy my junk!" is set to send to "Funk"
11
+ And a contact named "Bobo Clown" exists with email_address "bobo@example.com"
12
+ And contact "Bobo Clown" is subscribed to "Funk"
13
+ And I set jobs to run immediately
14
+ And the mailing with subject "Buy my junk!" is scheduled
15
+
16
+ @javascript
17
+ Scenario:
18
+ When I go to the mailings page
19
+ And I follow "Messages"
20
+ And I select "Any Status" from "Status"
21
+ Then I should see "bobo@example.com"
22
+
@@ -0,0 +1,4 @@
1
+ Given(/^(\d+) bounces exist$/) do |count|
2
+ count.to_i.times{FactoryGirl.create(:bounce)}
3
+ end
4
+
@@ -0,0 +1,63 @@
1
+ Given(/^a contact named "(.*?)" exists with email(?: |_)address "(.*?)"$/) do |contact, email|
2
+ first_name, last_name = contact.split(/\s+/,2)
3
+ FactoryGirl.create(:contact, email_address: email, first_name: first_name,
4
+ last_name: last_name
5
+ )
6
+ end
7
+
8
+ Given(/^(\d+) contacts exist$/) do |count|
9
+ count.to_i.times {FactoryGirl.create(:contact)}
10
+ end
11
+
12
+ Then(/^the contact "(.*?)" should be soft deleted$/) do |name|
13
+ first_name, last_name = name.split(/\s+/,2)
14
+ contact = MailManager::Contact.deleted.where(first_name: first_name, last_name: last_name).first
15
+ expect(contact.deleted?).to be true
16
+ expect(contact.deleted_at).not_to be nil
17
+ end
18
+
19
+ When(/^I undelete contact "(.*?)"$/) do |name|
20
+ first_name, last_name = name.split(/\s+/,2)
21
+ contact = MailManager::Contact.deleted.where(first_name: first_name, last_name: last_name).first
22
+ contact.undelete
23
+ end
24
+
25
+ Then(/^contact "(.*?)" should exist with email(?: |_)address "(.*?)"$/) do |name, email|
26
+ first_name, last_name = name.split(/\s+/,2)
27
+ contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first
28
+ expect(contact.email_address).to eq(email)
29
+ end
30
+
31
+ Given(/^(?:the )?contact (?:named )?"(.*?)" is subscribed to "(.*?)"$/) do |contact_name, mailing_lists|
32
+ first_name, last_name = contact_name.split(/\s+/,2)
33
+ contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first
34
+ mailing_lists.split(/\s*,\s*/).each do |list_name|
35
+ contact.subscribe(MailManager::MailingList.find_by_name(list_name))
36
+ end
37
+ end
38
+
39
+ When(/^I submit a static subscribe form for "(.*?)" with email(?: |_)address "(.*?)" and the mailing list named "(.*?)"$/) do |name, email, list|
40
+ mailing_list = MailManager::MailingList.where(name: name).first
41
+ contact = MailManager::Contact.where(email_address: email).first ||
42
+ MailManager::Contact.new
43
+ contact_attributes = {
44
+ mailing_list_id: mailing_list.id,
45
+ }
46
+ contact_attributes.merge(id: contact.id) unless contact.new_record?
47
+ visit mail_manager.subscribe_contact_path(contact: contact_attributes)
48
+ end
49
+
50
+ Then(/^contact "(.*?)" should be subscribed to "(.*?)" with the "(.*?)" status$/) do |name, list, status|
51
+ first_name, last_name = name.split(/\s+/,2)
52
+ contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first
53
+ subscription = contact.subscriptions.detect{|s| s.mailing_list.name.eql?(list)}
54
+ expect(subscription.status).to eq(status)
55
+ end
56
+
57
+ Then(/^contact "(.*?)" should be unsubscribed from "(.*?)"$/) do |name, list|
58
+ first_name, last_name = name.split(/\s+/,2)
59
+ contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first
60
+ subscription = contact.subscriptions.detect{|s| s.mailing_list.name.eql?(list)}
61
+ expect(subscription.status).to eq('unsubscribed')
62
+ end
63
+
@@ -0,0 +1,3 @@
1
+ When /I debug/ do
2
+ binding.pry
3
+ end
@@ -0,0 +1,6 @@
1
+ Then(/^an email is sent to "(.*?)" with subject "(.*?)"$/) do |email, subject|
2
+ expect(ActionMailer::Base.deliveries.detect { |mail|
3
+ mail.subject =~ /#{subject}/ && mail.to.include?(email)
4
+ }).to_not be nil
5
+ end
6
+
@@ -0,0 +1,25 @@
1
+ Given(/^I clear the job queue$/) do
2
+ Delayed::Job.delete_all
3
+ end
4
+
5
+ Given(/^I set jobs to be delayed$/) do
6
+ Delayed::Worker.delay_jobs = true
7
+ end
8
+
9
+ Given(/^I set jobs to run immediately$/) do
10
+ Delayed::Worker.delay_jobs = false
11
+ end
12
+
13
+
14
+ Then(/^a test email job should exist for mailing with subject "(.*?)" and email "(.*?)"$/) do |subject, email|
15
+ mailing = MailManager::Mailing.where(subject: subject).first
16
+ test_message = MailManager::TestMessage.where(test_email_address: email, mailing_id: mailing.id).last
17
+ job = Delayed::Job.where("handler like '%MailManager::TestMessage%method_name: :deliver%'").first
18
+ expect(job.payload_object.object).to eq(test_message)
19
+ expect(job.payload_object.method_name).to eq(:deliver)
20
+ end
21
+
22
+ When(/^I run all jobs$/) do
23
+ Delayed::Worker.new(name: 'Bobo').work_off
24
+ end
25
+
@@ -0,0 +1,4 @@
1
+ Given(/^I am logged in and authorized for everything$/) do
2
+ @user = FactoryGirl.create(:user, last_name: "the_admin")
3
+ end
4
+
@@ -0,0 +1,17 @@
1
+ Given(/^a mailing list named "(.*)" exists$/) do |name|
2
+ FactoryGirl.create(:mailing_list, name: name)
3
+ end
4
+
5
+ Given(/^(?:the)? mailing list named "(.*?)" is one of mailing "(.*?)"'s mailing_lists$/) do |list_name, subject|
6
+ mailing = MailManager::Mailing.where(subject: subject).first
7
+ mailing.mailing_lists << MailManager::MailingList.find_by_name(list_name)
8
+ end
9
+
10
+ Then(/^a mailing list named "(.*?)" should exist$/) do |name|
11
+ expect(MailManager::MailingList.find_by_name(name)).not_to be nil
12
+ end
13
+
14
+ Given(/^(\d+) mailing lists exist$/) do |count|
15
+ count.to_i.times{FactoryGirl.create(:mailing_list)}
16
+ end
17
+
@@ -0,0 +1,51 @@
1
+ Given(/^a mailing with subject "([^"]*?)" exists$/) do |subject|
2
+ mailing = FactoryGirl.create(:mailing, subject: subject)
3
+ end
4
+
5
+ Given(/^the mailing with subject "([^"]*?)" is set to send to "([^"]*?)"$/) do |subject, list_names|
6
+ mailing = MailManager::Mailing.where(subject: subject).first
7
+ mailing.mailing_lists.clear
8
+ list_names.split(/\s*,\s*/).each do |name|
9
+ mailing.mailing_lists << MailManager::MailingList.find_by_name(name)
10
+ end
11
+ end
12
+
13
+ Given(/^the mailing with subject "(.*?)"'s messages are initialized$/) do |subject|
14
+ mailing = MailManager::Mailing.where(subject: subject).first
15
+ mailing.initialize_messages
16
+ end
17
+
18
+ Given(/^the mailing with subject "(.*?)" is scheduled$/) do |subject|
19
+ mailing = MailManager::Mailing.where(subject: subject).first
20
+ mailing.schedule
21
+ end
22
+
23
+ When(/^I deliver the mailing with subject "(.*?)"$/) do |subject|
24
+ mailing = MailManager::Mailing.where(subject: subject).first
25
+ mailing.deliver
26
+ end
27
+
28
+ Then(/^the mailing with subject "([^"]*?)" should be scheduled$/) do |subject|
29
+ mailing = MailManager::Mailing.where(subject: subject).first
30
+ expect(mailing.scheduled?).to be true
31
+ expect(mailing.job.handler).to match /MailManager::Mailing.*#{subject}/m
32
+ end
33
+
34
+ Then(/^the mailing with subject "([^"]*?)" should be canceled$/) do |subject|
35
+ mailing = MailManager::Mailing.where(subject: subject).first
36
+ expect(mailing.pending?).to be true
37
+ expect(mailing.job).to be nil
38
+ end
39
+
40
+ Then(/^the mailing with subject "(.*?)" should be sending to lists "(.*?)"$/) do |subject, list_names|
41
+ mailing = MailManager::Mailing.where(subject: subject).first
42
+ names = mailing.mailing_lists.map(&:name)
43
+ list_names.split(/\s*,\s*/).each do |name|
44
+ expect(names).to include (name)
45
+ end
46
+ end
47
+
48
+ Given(/^(\d+) mailings exist$/) do |count|
49
+ count.to_i.times {FactoryGirl.create(:mailing)}
50
+ end
51
+
@@ -0,0 +1,26 @@
1
+ When(/^contact "(.*?)" uses the unsubscribe link$/) do |name|
2
+ first_name, last_name = name.split(/\s+/,2)
3
+ contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first
4
+ path = URI.parse(contact.messages.first.unsubscribe_url).path
5
+ visit path
6
+ end
7
+
8
+ Then(/^contact "(.*?)" should receive an email saying he unsubscribed$/) do |name|
9
+ first_name, last_name = name.split(/\s+/,2)
10
+ contact = MailManager::Contact.where(first_name: first_name, last_name: last_name).first
11
+ expect(ActionMailer::Base.deliveries.last.subject).to match /unsubscribe/i
12
+ ActionMailer::Base.deliveries.last.parts.map(&:body).each do |body|
13
+ expect(body).to match /Bob Dole/
14
+ end
15
+ end
16
+
17
+ When(/^I use the test email's unsubscribe link$/) do
18
+ unsubscribe_url = MailManager::TestMessage.last.unsubscribe_url
19
+ path = URI.parse(unsubscribe_url).path
20
+ visit path
21
+ end
22
+
23
+ When(/^I try to unsubscribe with an invalid guid$/) do
24
+ visit MailManager.unsubscribe_path + '/boboisaclown'
25
+ end
26
+
@@ -2,13 +2,17 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "pat
2
2
 
3
3
  # Commonly used webrat steps
4
4
  # http://github.com/brynary/webrat
5
+ When(/^the "(.*?)" link has a confirmation that includes "(.*?)"$/) do |link, confirmation_text|
6
+ expect(find_link("Schedule", match: :first)['data-confirm']).to match /#{confirmation_text}/
7
+ end
8
+
5
9
 
6
10
  Given /^I am on (.+)$/ do |page_name|
7
- visit path_to(page_name)
11
+ visit path_to(page_name,mail_manager)
8
12
  end
9
13
 
10
14
  When /^I go to (.+)$/ do |page_name|
11
- visit path_to(page_name)
15
+ visit path_to(page_name,mail_manager)
12
16
  end
13
17
 
14
18
  When /^I press "([^\"]*)"$/ do |button|
@@ -16,7 +20,7 @@ When /^I press "([^\"]*)"$/ do |button|
16
20
  end
17
21
 
18
22
  When /^I follow "([^\"]*)"$/ do |link|
19
- click_link(link)
23
+ click_link(link, match: :first)
20
24
  end
21
25
 
22
26
  When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
@@ -91,11 +95,11 @@ When /^I attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
91
95
  end
92
96
 
93
97
  Then /^I should see "([^\"]*)"$/ do |text|
94
- response.should contain(text)
98
+ expect(page.body).to have_content(text)
95
99
  end
96
100
 
97
101
  Then /^I should not see "([^\"]*)"$/ do |text|
98
- response.should_not contain(text)
102
+ expect(page.body).not_to have_content(text)
99
103
  end
100
104
 
101
105
  Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
@@ -111,5 +115,5 @@ Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
111
115
  end
112
116
 
113
117
  Then /^I should be on (.+)$/ do |page_name|
114
- URI.parse(current_url).path.should == path_to(page_name)
118
+ URI.parse(current_url).path.should == path_to(page_name,mail_manager)
115
119
  end
@@ -0,0 +1,62 @@
1
+ Feature: Manage Subscriptions
2
+ In order to have a list of email addresses to send messages to
3
+ As an administrator
4
+ I want to manage a contact's subscriptions
5
+
6
+ Background:
7
+ Given a mailing with subject "Mailing" exists
8
+ And a mailing list named "List1" exists
9
+ And the mailing list named "List1" is one of mailing "Mailing"'s mailing_lists
10
+ And a mailing list named "List2" exists
11
+ And the mailing list named "List2" is one of mailing "Mailing"'s mailing_lists
12
+ And a mailing list named "List3" exists
13
+ And a mailing list named "List4" exists
14
+ And a contact named "Bob Dole" exists with email_address "bob@example.com"
15
+ And contact "Bob Dole" is subscribed to "List1, List3"
16
+
17
+ Scenario: Unsubscribe sends an email
18
+ When the mailing with subject "Mailing" is scheduled
19
+ # this is done when the job is created by scheduling
20
+ # And I deliver the mailing with subject "Mailing"
21
+ And contact "Bob Dole" uses the unsubscribe link
22
+ Then contact "Bob Dole" should receive an email saying he unsubscribed
23
+ And contact "Bob Dole" should be unsubscribed from "List1"
24
+ And contact "Bob Dole" should be subscribed to "List2" with the "pending" status
25
+ And contact "Bob Dole" should be unsubscribed from "List3"
26
+ And contact "Bob Dole" should be subscribed to "List4" with the "pending" status
27
+
28
+ Scenario: Unsubscribe from test message
29
+ When I go to the mailings page
30
+ And I follow "Send Test"
31
+ And I fill in "Test Email Address" with "bob@example.com"
32
+ And I press "Send Test Email"
33
+ And I use the test email's unsubscribe link
34
+ Then I should see "unsubscribed"
35
+ And I should see "bob@example.com"
36
+ And I should see "Test Mailing List"
37
+
38
+ Scenario: Unsubscribe from test message with no contact/subscription
39
+ When I go to the mailings page
40
+ And I follow "Send Test"
41
+ And I fill in "Test Email Address" with "bobo@example.com"
42
+ And I press "Send Test Email"
43
+ And I use the test email's unsubscribe link
44
+ Then I should see "unsubscribed"
45
+ And I should see "bobo@example.com"
46
+ And I should see "Test Mailing List"
47
+
48
+ Scenario: Unsubscribe by email address
49
+ When I go to the unsubscribe by email address page
50
+ And I fill in "Email Address" with "bob@example.com"
51
+ And I press "Unsubscribe"
52
+ Then I should see "Unsubscribed"
53
+ And I should see "bob@example.com"
54
+ And contact "Bob Dole" should be unsubscribed from "List1"
55
+ And contact "Bob Dole" should be subscribed to "List2" with the "pending" status
56
+ And contact "Bob Dole" should be unsubscribed from "List3"
57
+ And contact "Bob Dole" should be subscribed to "List4" with the "pending" status
58
+
59
+ Scenario: Unsubscribe with invalid guid
60
+ When I try to unsubscribe with an invalid guid
61
+ Then I should be on the unsubscribe by email address page
62
+ And I should see "We did not recognize that unsubscribe url! Please try unsubscribing with your email address."