# frozen_string_literal: true require 'rails_helper' RSpec.describe Invite do describe '#valid_for_use?' do it 'returns true when there are no limitations' do invite = Fabricate(:invite, max_uses: nil, expires_at: nil) expect(invite.valid_for_use?).to be true end it 'returns true when not expired' do invite = Fabricate(:invite, max_uses: nil, expires_at: 1.hour.from_now) expect(invite.valid_for_use?).to be true end it 'returns false when expired' do invite = Fabricate(:invite, max_uses: nil, expires_at: 1.hour.ago) expect(invite.valid_for_use?).to be false end it 'returns true when uses still available' do invite = Fabricate(:invite, max_uses: 250, uses: 249, expires_at: nil) expect(invite.valid_for_use?).to be true end it 'returns false when maximum uses reached' do invite = Fabricate(:invite, max_uses: 250, uses: 250, expires_at: nil) expect(invite.valid_for_use?).to be false end it 'returns false when invite creator has been disabled' do invite = Fabricate(:invite, max_uses: nil, expires_at: nil) invite.user.account.suspend! expect(invite.valid_for_use?).to be false end end context 'when th_use_invite_quota?' do let(:max_uses) { 25 } let(:expires_in) { 1.week.in_seconds } let(:regular_user) { Fabricate(:user) } let(:moderator_user) { Fabricate(:user, moderator: true) } let(:user) { regular_user } let(:created_at) { Time.at(0) } let(:expires_at) { Time.at(0) + expires_in } subject { Fabricate.build(:invite, user: user, max_uses: max_uses, created_at: created_at, expires_at: expires_at ) } before do stub_const('Invite::TH_USE_INVITE_QUOTA', true) stub_const('Invite::TH_INVITE_MAX_USES', 25) stub_const('Invite::TH_ACTIVE_INVITE_SLOT_QUOTA', 30) end it { is_expected.to be_valid } context 'and' do context 'max_uses exceeds quota' do let(:max_uses) { 26 } it { is_expected.not_to be_valid } end context 'expires_in exceeds quota' do let(:expires_in) { 1.week.in_seconds + 1 } it { is_expected.not_to be_valid } end context 'multiple values exceed quota' do let(:max_uses) { 26 } let(:expires_in) { 86401 } it { is_expected.not_to be_valid } end context 'an unlimited use invite' do before do Fabricate.build(:invite, user: user).save(validate: false) end it { is_expected.not_to be_valid } end context 'too many outstanding invites' do before do Fabricate.build(:invite, user: user, max_uses: 6).save(validate: false) end it { is_expected.not_to be_valid } end context 'a moderator created the invite' do let(:user) { moderator_user } it { is_expected.to be_valid } end end end end