Skip to content

Commit 8079817

Browse files
committed
Harden EmailRecentlyVerifiedValidator
No longer failed if there is no verified email. Add explicit messages to guide the user. FIX https://errors.data.gouv.fr/organizations/sentry/issues/139907/
1 parent 2b2295d commit 8079817

File tree

3 files changed

+113
-4
lines changed

3 files changed

+113
-4
lines changed

app/validators/email_recently_verified_validator.rb

+7-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@ class EmailRecentlyVerifiedValidator < ActiveModel::EachValidator
22
def validate_each(record, attribute, value)
33
return if value.blank?
44

5+
create_or_refresh_verified_email!(value)
6+
57
verified_email = VerifiedEmail.find_by(email: value)
6-
verified_email = create_or_refresh_verified_email!(value) if verified_email.blank? || verified_email.old?
78

8-
record.errors.add(attribute, :email_unreachable) if verified_email.unreachable?
9+
if verified_email.blank?
10+
record.errors.add(attribute, :email_deliverability_unknown)
11+
elsif verified_email.unreachable?
12+
record.errors.add(attribute, :email_unreachable)
13+
end
914
end
1015

1116
private

config/locales/activerecord.fr.yml

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
fr:
2+
activemodel:
3+
errors:
4+
messages:
5+
email_unreachable: "n'est pas une adresse email joignable : celle-ci n'existe probablement pas. Veuillez soit mettre à jour cette adresse email, soit contacter le support à l'adresse datapass@api.gouv.fr en précisant votre numéro d'habilitation"
6+
email_deliverability_unknown: "n'a pas pu être vérifiée : merci de contacter le support à l'adresse datapass@api.gouv.fr en précisant votre numéro d'habilitation"
27
activerecord:
38
attributes:
49
user:
@@ -75,8 +80,6 @@ fr:
7580
instructor_modification_request:
7681
reason: Raison de la demande de modification
7782
errors:
78-
messages:
79-
email_unreachable: "n'est pas une adresse email joignable : celle-ci n'existe probablement pas. Veuillez soit mettre à jour cette adresse email, soit contacter le support."
8083
models:
8184
authorization_request:
8285
all_terms_not_accepted: Vous devez acceptez les conditions générales avant de continuer
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
class EmailRecentlyVerifiedValidatable
2+
include ActiveModel::Validations
3+
attr_accessor :email
4+
5+
def initialize(email:)
6+
@email = email
7+
end
8+
9+
validates :email, email_recently_verified: true
10+
end
11+
12+
RSpec.describe EmailRecentlyVerifiedValidator do
13+
subject { EmailRecentlyVerifiedValidatable.new(email:) }
14+
15+
let(:email_verifier_job) { instance_double(EmailVerifierJob, perform: nil) }
16+
17+
before do
18+
allow(EmailVerifierJob).to receive(:new).and_return(email_verifier_job)
19+
end
20+
21+
context 'when there is a verified email' do
22+
let!(:verified_email) { create(:verified_email, status:, verified_at:) }
23+
let(:email) { verified_email.email }
24+
25+
context 'when the email was verified less than 1 month ago' do
26+
let(:status) { :deliverable }
27+
let(:verified_at) { 1.minute.ago }
28+
29+
it { is_expected.to be_valid }
30+
31+
it 'calls EmailVerifierJob' do
32+
subject.valid?
33+
34+
expect(email_verifier_job).to have_received(:perform)
35+
end
36+
end
37+
38+
context 'when the email was verified more than 1 month ago' do
39+
let(:status) { :deliverable }
40+
let(:verified_at) { 3.months.ago }
41+
42+
it { is_expected.to be_valid }
43+
44+
it 'calls EmailVerifierJob' do
45+
subject.valid?
46+
47+
expect(email_verifier_job).to have_received(:perform)
48+
end
49+
end
50+
end
51+
52+
context 'when there is no verified email' do
53+
let(:email) { 'whate@ever.com' }
54+
55+
it 'calls EmailVerifierJob' do
56+
subject.valid?
57+
58+
expect(email_verifier_job).to have_received(:perform)
59+
end
60+
61+
context 'when EmailVerifierJob creates a verified email' do
62+
let(:email_verifier_job) do
63+
email_verifier_job = instance_double(EmailVerifierJob)
64+
65+
allow(email_verifier_job).to receive(:perform) do
66+
create(:verified_email, email:, status:)
67+
end
68+
69+
email_verifier_job
70+
end
71+
72+
context 'when the email is deliverable' do
73+
let(:status) { :deliverable }
74+
75+
it { is_expected.to be_valid }
76+
end
77+
78+
context 'when the email is undeliverable' do
79+
let(:status) { :undeliverable }
80+
81+
it { is_expected.not_to be_valid }
82+
83+
it 'adds email_unreachable error on attribute' do
84+
subject.valid?
85+
86+
expect(subject.errors[:email].to_s).to include('une adresse email joignable')
87+
end
88+
end
89+
end
90+
91+
context 'when EmailVerifierJob does not create a verified email' do
92+
it { is_expected.not_to be_valid }
93+
94+
it 'adds email_deliverability_unknown error on attribute' do
95+
subject.valid?
96+
97+
expect(subject.errors[:email].to_s).to include('pu être vérifiée')
98+
end
99+
end
100+
end
101+
end

0 commit comments

Comments
 (0)