mirror of
https://github.com/discourse/discourse.git
synced 2025-06-04 11:11:13 +08:00
FIX: Existing users were mistakenly unable to redeem invite (#19191)
Follow up to 40e8912395ee2dc0f43c2b2a4504f4984c1f040d In this previous commit I introduced a bug that prevented a legitimate case for an existing user to redeem an invite, where the email/domain were both blank and the invite was still redeemable by the user. Fixes the issue and adds more specs for that case.
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe Invite do
|
||||
fab!(:user) { Fabricate(:user) }
|
||||
fab!(:user) { Fabricate(:user, email: "existinguser@invitetest.com") }
|
||||
let(:xss_email) { "<b onmouseover=alert('wufff!')>email</b><script>alert('test');</script>@test.com" }
|
||||
let(:escaped_email) { "<b onmouseover=alert('wufff!')>email</b><script>alert('test');</script>@test.com" }
|
||||
|
||||
@ -469,4 +469,91 @@ RSpec.describe Invite do
|
||||
expect(invite.invalidated_at).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe "#can_be_redeemed_by?" do
|
||||
context "for invite links" do
|
||||
fab!(:invite) { Fabricate(:invite, email: nil, domain: nil, max_redemptions_allowed: 1) }
|
||||
|
||||
it "returns false if invite is already redeemed" do
|
||||
invite.update!(redemption_count: 1)
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if the invite is expired" do
|
||||
invite.update!(expires_at: 10.days.ago)
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if invite is deleted" do
|
||||
invite.trash!
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if invite is invalidated" do
|
||||
invite.update!(invalidated_at: 1.day.ago)
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if the user already redeemed it" do
|
||||
InvitedUser.create(user: user, invite: invite)
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if domain does not match user email" do
|
||||
invite.update!(domain: "zzzzz.com")
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns true if domain does match user email" do
|
||||
invite.update!(domain: "invitetest.com")
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(true)
|
||||
end
|
||||
|
||||
it "returns true by default if all other conditions are met and domain and invite are blank" do
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
context "for email invites" do
|
||||
fab!(:invite) do
|
||||
invite = Fabricate(:invite, email: "otherexisting@invitetest.com", domain: nil)
|
||||
user.update!(email: "otherexisting@invitetest.com")
|
||||
invite
|
||||
end
|
||||
|
||||
it "returns false if invite is already redeemed" do
|
||||
InvitedUser.create(user: Fabricate(:user), invite: invite)
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if the invite is expired" do
|
||||
invite.update!(expires_at: 10.days.ago)
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if invite is deleted" do
|
||||
invite.trash!
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if invite is invalidated" do
|
||||
invite.update!(invalidated_at: 1.day.ago)
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if the user already redeemed it" do
|
||||
InvitedUser.create(user: user, invite: invite)
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns false if email does not match user email" do
|
||||
invite.update!(email: "blahblah@test.com")
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(false)
|
||||
end
|
||||
|
||||
it "returns true if email does match user email" do
|
||||
expect(invite.can_be_redeemed_by?(user)).to eq(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user