Skip to content

Commit e3661fd

Browse files
committed
Add more tests for newsletters
1 parent bdc020f commit e3661fd

File tree

6 files changed

+72
-43
lines changed

6 files changed

+72
-43
lines changed

app/controllers/admin/newsletters_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ def update
4242
# DELETE /admin/newsletters/1
4343
def destroy
4444
@newsletter.destroy!
45-
redirect_to admin_newsletter_url, notice: "Newsletter was successfully destroyed.", status: :see_other
45+
redirect_to admin_newsletters_path, notice: "Newsletter was successfully destroyed.", status: :see_other
4646
end
4747

4848
# PATCH /admin/newsletters/1/deliver
4949
def deliver
5050
@newsletter = Newsletter.find(params[:id])
51-
recipients = deliver_live? ? User.subscribers : User.where(email: ApplicationMailer.test_recipients)
51+
recipients = deliver_live? ? User.subscribers : User.test_recipients
5252
label = deliver_live? ? "LIVE" : "TEST"
5353

5454
if recipients.empty?

app/models/user.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class User < ApplicationRecord
1111
scope :confirmed, -> { where.not(confirmed_at: nil) }
1212
scope :recently_confirmed, -> { where("confirmed_at > ?", 2.weeks.ago) }
1313
scope :subscribers, -> { confirmed.joins(:newsletter_subscription) }
14+
scope :test_recipients, -> { where(email: ApplicationMailer.test_recipients) }
1415

1516
accepts_nested_attributes_for :email_exchanges, limit: 1
1617

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
require "rails_helper"
2+
3+
RSpec.describe Emails::NewsletterMailer, type: :mailer do
4+
describe "#newsletter" do
5+
let(:newsletter) { instance_double(Newsletter, title: "A Newsletter", content: Faker::Markdown.sandwich(sentences: 3)) }
6+
let(:user) { instance_double(User, email: "[email protected]") }
7+
let(:mail) { Emails::NewsletterMailer.newsletter(newsletter:, user:, unsubscribe_token: "token") }
8+
9+
it "renders the headers" do
10+
expect(mail.subject).to eq("A Newsletter")
11+
expect(mail.to).to eq(["[email protected]"])
12+
expect(mail.from).to eq(["[email protected]"])
13+
end
14+
15+
it "renders the body" do
16+
expect(mail.body.encoded).to match(Markdown::Base.new(newsletter.content).call)
17+
end
18+
end
19+
end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Preview all emails at http://localhost:3000/rails/mailers/newsletter_mailer
2+
class Emails::NewsletterMailerPreview < ActionMailer::Preview
3+
def newsletter
4+
Emails::NewsletterMailer.newsletter(
5+
newsletter: FactoryBot.build(:newsletter),
6+
user: FactoryBot.build(:user),
7+
unsubscribe_token: "unsubscribe_token"
8+
)
9+
end
10+
end

spec/models/newsletter_spec.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
require "rails_helper"
22

33
RSpec.describe Newsletter, type: :model do
4-
pending "add some examples to (or delete) #{__FILE__}"
4+
it "has a valid factory" do
5+
expect(FactoryBot.build(:newsletter)).to be_valid
6+
end
57
end

spec/requests/admin/newsletters_spec.rb

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,43 @@
1313
# sticking to rails and rspec-rails APIs to keep things simple and stable.
1414

1515
RSpec.describe "/admin/newsletters", type: :request do
16-
# This should return the minimal set of attributes required to create a valid
17-
# Newsletter. As you add validations to Newsletter, be sure to
18-
# adjust the attributes here as well.
19-
let(:valid_attributes) {
20-
skip("Add a hash of attributes valid for your model")
21-
}
22-
23-
let(:invalid_attributes) {
24-
skip("Add a hash of attributes invalid for your model")
25-
}
26-
27-
describe "GET /index" do
16+
let(:valid_attributes) { FactoryBot.attributes_for(:newsletter) }
17+
let(:invalid_attributes) { {title: "", content: ""} }
18+
19+
describe "GET /" do
2820
it "renders a successful response" do
29-
Newsletter.create! valid_attributes
30-
get admin_newsletters_url
21+
FactoryBot.create(:newsletter)
22+
23+
get admin_newsletters_path
24+
3125
expect(response).to be_successful
3226
end
3327
end
3428

3529
describe "GET /show" do
3630
it "renders a successful response" do
37-
newsletter = Newsletter.create! valid_attributes
38-
get admin_newsletter_url(newsletter)
31+
newsletter = FactoryBot.create(:newsletter)
32+
33+
get admin_newsletter_path(newsletter)
34+
3935
expect(response).to be_successful
4036
end
4137
end
4238

4339
describe "GET /new" do
4440
it "renders a successful response" do
45-
get new_admin_newsletter_url
41+
get new_admin_newsletter_path
42+
4643
expect(response).to be_successful
4744
end
4845
end
4946

5047
describe "GET /edit" do
5148
it "renders a successful response" do
52-
newsletter = Newsletter.create! valid_attributes
53-
get edit_admin_newsletter_url(newsletter)
49+
newsletter = FactoryBot.create(:newsletter)
50+
51+
get edit_admin_newsletter_path(newsletter)
52+
5453
expect(response).to be_successful
5554
end
5655
end
@@ -59,72 +58,70 @@
5958
context "with valid parameters" do
6059
it "creates a new Newsletter" do
6160
expect {
62-
post admin_newsletters_url, params: {admin_newsletter: valid_attributes}
61+
post admin_newsletters_path, params: {newsletter: valid_attributes}
6362
}.to change(Newsletter, :count).by(1)
6463
end
6564

6665
it "redirects to the created admin_newsletter" do
67-
post admin_newsletters_url, params: {admin_newsletter: valid_attributes}
68-
expect(response).to redirect_to(admin_newsletter_url(Newsletter.last))
66+
post admin_newsletters_path, params: {newsletter: valid_attributes}
67+
expect(response).to redirect_to(admin_newsletter_path(Newsletter.last))
6968
end
7069
end
7170

7271
context "with invalid parameters" do
7372
it "does not create a new Newsletter" do
7473
expect {
75-
post admin_newsletters_url, params: {admin_newsletter: invalid_attributes}
74+
post admin_newsletters_path, params: {newsletter: invalid_attributes}
7675
}.to change(Newsletter, :count).by(0)
7776
end
7877

7978
it "renders a response with 422 status (i.e. to display the 'new' template)" do
80-
post admin_newsletters_url, params: {admin_newsletter: invalid_attributes}
79+
post admin_newsletters_path, params: {newsletter: invalid_attributes}
8180
expect(response).to have_http_status(:unprocessable_entity)
8281
end
8382
end
8483
end
8584

8685
describe "PATCH /update" do
8786
context "with valid parameters" do
88-
let(:new_attributes) {
89-
skip("Add a hash of attributes valid for your model")
90-
}
87+
let(:new_attributes) { {title: "A New Title"} }
9188

9289
it "updates the requested admin_newsletter" do
93-
newsletter = Newsletter.create! valid_attributes
94-
patch admin_newsletter_url(newsletter), params: {admin_newsletter: new_attributes}
90+
newsletter = FactoryBot.create(:newsletter)
91+
patch admin_newsletter_path(newsletter), params: {newsletter: new_attributes}
9592
newsletter.reload
96-
skip("Add assertions for updated state")
93+
expect(newsletter.title).to eq("A New Title")
9794
end
9895

9996
it "redirects to the admin_newsletter" do
100-
newsletter = Newsletter.create! valid_attributes
101-
patch admin_newsletter_url(newsletter), params: {admin_newsletter: new_attributes}
97+
newsletter = FactoryBot.create(:newsletter)
98+
patch admin_newsletter_path(newsletter), params: {newsletter: new_attributes}
10299
newsletter.reload
103-
expect(response).to redirect_to(admin_newsletter_url(newsletter))
100+
expect(response).to redirect_to(admin_newsletter_path(newsletter))
104101
end
105102
end
106103

107104
context "with invalid parameters" do
108105
it "renders a response with 422 status (i.e. to display the 'edit' template)" do
109-
newsletter = Newsletter.create! valid_attributes
110-
patch admin_newsletter_url(newsletter), params: {admin_newsletter: invalid_attributes}
106+
newsletter = FactoryBot.create(:newsletter)
107+
patch admin_newsletter_path(newsletter), params: {newsletter: invalid_attributes}
111108
expect(response).to have_http_status(:unprocessable_entity)
112109
end
113110
end
114111
end
115112

116113
describe "DELETE /destroy" do
117114
it "destroys the requested admin_newsletter" do
118-
newsletter = Newsletter.create! valid_attributes
115+
newsletter = FactoryBot.create(:newsletter)
119116
expect {
120-
delete admin_newsletter_url(newsletter)
117+
delete admin_newsletter_path(newsletter)
121118
}.to change(Newsletter, :count).by(-1)
122119
end
123120

124121
it "redirects to the admin_newsletters list" do
125-
newsletter = Newsletter.create! valid_attributes
126-
delete admin_newsletter_url(newsletter)
127-
expect(response).to redirect_to(admin_newsletters_url)
122+
newsletter = FactoryBot.create(:newsletter)
123+
delete admin_newsletter_path(newsletter)
124+
expect(response).to redirect_to(admin_newsletters_path)
128125
end
129126
end
130127
end

0 commit comments

Comments
 (0)