Skip to content

Commit 911692a

Browse files
committed
feat: add accept!, decline!, and verify! to Invitation
Adds methods for event invitation management: - accept!(verified:) - confirms attendance with optional pre-verification - verify! - marks attendance as verified - decline! - cancels event attendance Includes unit tests.
1 parent 4ee8c82 commit 911692a

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

app/models/invitation.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,16 @@ def coach_spaces?
2424
def to_param
2525
token
2626
end
27+
28+
def accept!(verified: false)
29+
update!(attending: true, verified: verified)
30+
end
31+
32+
def verify!
33+
update!(verified: true)
34+
end
35+
36+
def decline!
37+
update!(attending: false)
38+
end
2739
end

spec/models/invitation_spec.rb

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,71 @@
1212
it { is_expected.to validate_inclusion_of(:role).in_array(%w[Student Coach]) }
1313
end
1414

15-
context '#student_spaces?' do
15+
describe '#student_spaces?' do
1616
it 'checks if there are any available spaces for students at the event' do
1717
student_invitation = Fabricate(:invitation)
1818

1919
expect(student_invitation.student_spaces?).to eq(true)
2020
end
2121
end
2222

23-
context '#coach_spaces?' do
23+
describe '#coach_spaces?' do
2424
it 'checks if there are any available spaces for coaches at the event' do
2525
coach_invitation = Fabricate(:coach_invitation)
2626

2727
expect(coach_invitation.coach_spaces?).to eq(true)
2828
end
2929
end
30+
31+
describe '#accept!' do
32+
let(:invitation) { Fabricate(:invitation, attending: false) }
33+
34+
it 'sets attending to true' do
35+
invitation.accept!
36+
expect(invitation.reload.attending).to be true
37+
end
38+
39+
it 'does not verify by default' do
40+
invitation.accept!
41+
expect(invitation.reload.verified).to be false
42+
end
43+
44+
it 'allows immediate verification' do
45+
invitation.accept!(verified: true)
46+
expect(invitation.reload.verified).to be true
47+
end
48+
49+
it 'raises RecordInvalid on validation failure' do
50+
allow(invitation).to receive(:valid?).and_return(false)
51+
expect { invitation.accept! }.to raise_error(ActiveRecord::RecordInvalid)
52+
end
53+
end
54+
55+
describe '#verify!' do
56+
let(:invitation) { Fabricate(:invitation, verified: false) }
57+
58+
it 'sets verified to true' do
59+
invitation.verify!
60+
expect(invitation.reload.verified).to be true
61+
end
62+
63+
it 'raises RecordInvalid on validation failure' do
64+
allow(invitation).to receive(:valid?).and_return(false)
65+
expect { invitation.verify! }.to raise_error(ActiveRecord::RecordInvalid)
66+
end
67+
end
68+
69+
describe '#decline!' do
70+
let(:invitation) { Fabricate(:invitation, attending: true) }
71+
72+
it 'sets attending to false' do
73+
invitation.decline!
74+
expect(invitation.reload.attending).to be false
75+
end
76+
77+
it 'raises RecordInvalid on validation failure' do
78+
allow(invitation).to receive(:valid?).and_return(false)
79+
expect { invitation.decline! }.to raise_error(ActiveRecord::RecordInvalid)
80+
end
81+
end
3082
end

0 commit comments

Comments
 (0)