summaryrefslogtreecommitdiff
path: root/spec/models/member_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/member_spec.rb')
-rw-r--r--spec/models/member_spec.rb101
1 files changed, 100 insertions, 1 deletions
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index 5824c2085ce..067b3c25645 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -64,6 +64,49 @@ RSpec.describe Member do
end
end
+ context 'with admin signup restrictions' do
+ context 'when allowed domains for signup is enabled' do
+ before do
+ stub_application_setting(domain_allowlist: ['example.com'])
+ end
+
+ it 'adds an error message when email is not accepted' do
+ member = build(:group_member, :invited, invite_email: 'info@gitlab.com')
+
+ expect(member).not_to be_valid
+ expect(member.errors.messages[:user].first).to eq(_('domain is not authorized for sign-up.'))
+ end
+ end
+
+ context 'when denylist is enabled' do
+ before do
+ stub_application_setting(domain_denylist_enabled: true)
+ stub_application_setting(domain_denylist: ['example.org'])
+ end
+
+ it 'adds an error message when email is denied' do
+ member = build(:group_member, :invited, invite_email: 'denylist@example.org')
+
+ expect(member).not_to be_valid
+ expect(member.errors.messages[:user].first).to eq(_('is not from an allowed domain.'))
+ end
+ end
+
+ context 'when email restrictions is enabled' do
+ before do
+ stub_application_setting(email_restrictions_enabled: true)
+ stub_application_setting(email_restrictions: '([\+]|\b(\w*gitlab.com\w*)\b)')
+ end
+
+ it 'adds an error message when email is not accepted' do
+ member = build(:group_member, :invited, invite_email: 'info@gitlab.com')
+
+ expect(member).not_to be_valid
+ expect(member.errors.messages[:user].first).to eq(_('is not allowed. Try again with a different email address, or contact your GitLab admin.'))
+ end
+ end
+ end
+
context "when a child member inherits its access level" do
let(:user) { create(:user) }
let(:member) { create(:group_member, :developer, user: user) }
@@ -624,7 +667,23 @@ RSpec.describe Member do
let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) }
it "sets the invite token" do
- expect { member.generate_invite_token }.to change { member.invite_token}
+ expect { member.generate_invite_token }.to change { member.invite_token }
+ end
+ end
+
+ describe 'generate invite token on create' do
+ let!(:member) { build(:project_member, invite_email: "user@example.com") }
+
+ it "sets the invite token" do
+ expect { member.save! }.to change { member.invite_token }.to(kind_of(String))
+ end
+
+ context 'when invite was already accepted' do
+ it "does not set invite token" do
+ member.invite_accepted_at = 1.day.ago
+
+ expect { member.save! }.not_to change { member.invite_token }.from(nil)
+ end
end
end
@@ -749,4 +808,44 @@ RSpec.describe Member do
end
end
end
+
+ describe 'log_invitation_token_cleanup' do
+ let_it_be(:project) { create :project }
+
+ context 'when on gitlab.com' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return true
+ end
+
+ it "doesn't log info for members without invitation or accepted invitation" do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+
+ create :project_member
+ create :project_member, :invited, invite_accepted_at: nil
+ create :project_member, invite_token: nil, invite_accepted_at: Time.zone.now
+ end
+
+ it 'logs error for accepted members with token and creates membership' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(kind_of(StandardError), kind_of(Hash))
+
+ expect do
+ create :project_member, :invited, source: project, invite_accepted_at: Time.zone.now
+ end.to change { Member.count }.by(1)
+ end
+ end
+
+ context 'when not on gitlab.com' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return false
+ end
+
+ it 'does not log error for accepted members with token and creates membership' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+
+ expect do
+ create :project_member, :invited, source: project, invite_accepted_at: Time.zone.now
+ end.to change { Member.count }.by(1)
+ end
+ end
+ end
end