Skip to content

Commit 4496102

Browse files
committed
Fix email uniqueness check ignoring discarded members
The `email_must_be_unique` validation queried all members, including discarded ones. This blocked email reuse during the 30-day window before anonymization clears the email. Scope the query to `.kept`.
1 parent 79e2ac2 commit 4496102

3 files changed

Lines changed: 14 additions & 8 deletions

File tree

app/models/member.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def set_default_waiting_delivery_cycle
253253

254254
def email_must_be_unique
255255
emails_array.each do |email|
256-
if Member.where.not(id: id).including_email(email).exists?
256+
if Member.kept.where.not(id: id).including_email(email).exists?
257257
errors.add(:emails, :taken)
258258
break
259259
end

test/models/member_registration_test.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,17 @@ def register(member, params)
117117
assert_equal 30, member.annual_fee
118118
end
119119

120-
test "cannot reuse discarded member" do
120+
test "can reuse discarded member email" do
121121
member = discardable_member
122122
email = member.emails_array.first
123123
member.discard
124124

125-
new_member = build_member(emails: email)
126-
registration = MemberRegistration.new(new_member, {})
125+
new_member = build_member(emails: email, phones: "+41 79 999 99 99", waiting_basket_size_id: 0)
126+
new_member.public_create = true
127127

128-
# Should not find the discarded member for reuse
129-
assert_not registration.save
130-
# The email is still "taken" by the discarded member
131-
assert new_member.errors.of_kind?(:emails, :taken)
128+
# Email is still in the DB but discarded members should not block reuse
129+
assert_not_empty Member.including_email(email)
130+
assert_predicate new_member, :valid?, new_member.errors.full_messages.join(", ")
132131
end
133132

134133
test "can use email after member is anonymized" do

test/models/member_test.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ class MemberTest < ActiveSupport::TestCase
9494
assert_not Member.new(emails: "john@example.com").valid?
9595
end
9696

97+
test "validates email uniqueness ignores discarded members" do
98+
member = members(:mary)
99+
member.update_columns(state: "inactive", discarded_at: Time.current, emails: "reuse@example.com")
100+
101+
assert build_member(emails: "reuse@example.com").valid?
102+
end
103+
97104
test "validates annual_fee to be greater or equal to zero" do
98105
assert build_member(annual_fee: nil).valid?
99106
assert build_member(annual_fee: 0).valid?

0 commit comments

Comments
 (0)