Add coverage and use mailer callback to check functional user in notification mailer (#32055)

This commit is contained in:
Matt Jankowski 2024-09-25 04:07:48 -04:00 committed by GitHub
parent c2ef83ea4c
commit 83574f641a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 30 additions and 7 deletions

View file

@ -13,12 +13,14 @@ class NotificationMailer < ApplicationMailer
before_action :set_account, only: [:follow, :favourite, :reblog, :follow_request] before_action :set_account, only: [:follow, :favourite, :reblog, :follow_request]
after_action :set_list_headers! after_action :set_list_headers!
before_deliver :verify_functional_user
default to: -> { email_address_with_name(@user.email, @me.username) } default to: -> { email_address_with_name(@user.email, @me.username) }
layout 'mailer' layout 'mailer'
def mention def mention
return unless @user.functional? && @status.present? return if @status.blank?
locale_for_account(@me) do locale_for_account(@me) do
mail subject: default_i18n_subject(name: @status.account.acct) mail subject: default_i18n_subject(name: @status.account.acct)
@ -26,15 +28,13 @@ class NotificationMailer < ApplicationMailer
end end
def follow def follow
return unless @user.functional?
locale_for_account(@me) do locale_for_account(@me) do
mail subject: default_i18n_subject(name: @account.acct) mail subject: default_i18n_subject(name: @account.acct)
end end
end end
def favourite def favourite
return unless @user.functional? && @status.present? return if @status.blank?
locale_for_account(@me) do locale_for_account(@me) do
mail subject: default_i18n_subject(name: @account.acct) mail subject: default_i18n_subject(name: @account.acct)
@ -42,7 +42,7 @@ class NotificationMailer < ApplicationMailer
end end
def reblog def reblog
return unless @user.functional? && @status.present? return if @status.blank?
locale_for_account(@me) do locale_for_account(@me) do
mail subject: default_i18n_subject(name: @account.acct) mail subject: default_i18n_subject(name: @account.acct)
@ -50,8 +50,6 @@ class NotificationMailer < ApplicationMailer
end end
def follow_request def follow_request
return unless @user.functional?
locale_for_account(@me) do locale_for_account(@me) do
mail subject: default_i18n_subject(name: @account.acct) mail subject: default_i18n_subject(name: @account.acct)
end end
@ -75,6 +73,10 @@ class NotificationMailer < ApplicationMailer
@account = @notification.from_account @account = @notification.from_account
end end
def verify_functional_user
throw(:abort) unless @user.functional?
end
def set_list_headers! def set_list_headers!
headers( headers(
'List-ID' => "<#{@type}.#{@me.username}.#{Rails.configuration.x.local_domain}>", 'List-ID' => "<#{@type}.#{@me.username}.#{Rails.configuration.x.local_domain}>",

View file

@ -3,6 +3,17 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe NotificationMailer do RSpec.describe NotificationMailer do
shared_examples 'delivery to non functional user' do
context 'when user is not functional' do
before { receiver.update(confirmed_at: nil) }
it 'does not deliver mail' do
emails = capture_emails { mail.deliver_now }
expect(emails).to be_empty
end
end
end
let(:receiver) { Fabricate(:user, account_attributes: { username: 'alice' }) } let(:receiver) { Fabricate(:user, account_attributes: { username: 'alice' }) }
let(:sender) { Fabricate(:account, username: 'bob') } let(:sender) { Fabricate(:account, username: 'bob') }
let(:foreign_status) { Fabricate(:status, account: sender, text: 'The body of the foreign status') } let(:foreign_status) { Fabricate(:status, account: sender, text: 'The body of the foreign status') }
@ -24,6 +35,8 @@ RSpec.describe NotificationMailer do
.and have_thread_headers .and have_thread_headers
.and have_standard_headers('mention').for(receiver) .and have_standard_headers('mention').for(receiver)
end end
include_examples 'delivery to non functional user'
end end
describe 'follow' do describe 'follow' do
@ -40,6 +53,8 @@ RSpec.describe NotificationMailer do
.and(have_body_text('bob is now following you')) .and(have_body_text('bob is now following you'))
.and have_standard_headers('follow').for(receiver) .and have_standard_headers('follow').for(receiver)
end end
include_examples 'delivery to non functional user'
end end
describe 'favourite' do describe 'favourite' do
@ -58,6 +73,8 @@ RSpec.describe NotificationMailer do
.and have_thread_headers .and have_thread_headers
.and have_standard_headers('favourite').for(receiver) .and have_standard_headers('favourite').for(receiver)
end end
include_examples 'delivery to non functional user'
end end
describe 'reblog' do describe 'reblog' do
@ -76,6 +93,8 @@ RSpec.describe NotificationMailer do
.and have_thread_headers .and have_thread_headers
.and have_standard_headers('reblog').for(receiver) .and have_standard_headers('reblog').for(receiver)
end end
include_examples 'delivery to non functional user'
end end
describe 'follow_request' do describe 'follow_request' do
@ -92,6 +111,8 @@ RSpec.describe NotificationMailer do
.and(have_body_text('bob has requested to follow you')) .and(have_body_text('bob has requested to follow you'))
.and have_standard_headers('follow_request').for(receiver) .and have_standard_headers('follow_request').for(receiver)
end end
include_examples 'delivery to non functional user'
end end
private private