hensei-api/spec/models/gw_individual_score_spec.rb
Justin Edmund f2a058b6b2 add GW events and scoring system
- create gw_events, crew_gw_participations, gw_crew_scores, gw_individual_scores
- add models, blueprints, controllers for GW tracking
- add model specs and gw_events controller specs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 23:34:54 -08:00

93 lines
3.4 KiB
Ruby

require 'rails_helper'
RSpec.describe GwIndividualScore, type: :model do
describe 'associations' do
it { is_expected.to belong_to(:crew_gw_participation) }
it { is_expected.to belong_to(:crew_membership).optional }
it { is_expected.to belong_to(:recorded_by).class_name('User') }
end
describe 'validations' do
it { is_expected.to validate_presence_of(:round) }
it { is_expected.to validate_numericality_of(:score).is_greater_than_or_equal_to(0) }
describe 'round uniqueness per player' do
let!(:participation) { create(:crew_gw_participation) }
let!(:membership) { create(:crew_membership, crew: participation.crew) }
let!(:existing_score) do
create(:gw_individual_score,
crew_gw_participation: participation,
crew_membership: membership,
round: :preliminaries)
end
it 'requires unique round per membership and participation' do
duplicate = build(:gw_individual_score,
crew_gw_participation: participation,
crew_membership: membership,
round: :preliminaries)
expect(duplicate).not_to be_valid
expect(duplicate.errors[:crew_membership_id]).to include('already has a score for this round')
end
it 'allows same round for different members' do
other_membership = create(:crew_membership, crew: participation.crew)
score = build(:gw_individual_score,
crew_gw_participation: participation,
crew_membership: other_membership,
round: :preliminaries)
expect(score).to be_valid
end
it 'allows same member in different rounds' do
score = build(:gw_individual_score,
crew_gw_participation: participation,
crew_membership: membership,
round: :finals_day_1)
expect(score).to be_valid
end
end
end
describe 'round enum' do
it 'has expected round values' do
expect(GwIndividualScore.rounds.keys).to contain_exactly(
'preliminaries', 'interlude', 'finals_day_1', 'finals_day_2', 'finals_day_3', 'finals_day_4'
)
end
end
describe 'is_cumulative flag' do
let(:participation) { create(:crew_gw_participation) }
let(:membership) { create(:crew_membership, crew: participation.crew) }
it 'defaults to false from factory' do
score = create(:gw_individual_score,
crew_gw_participation: participation,
crew_membership: membership)
expect(score.is_cumulative).to be false
end
it 'can be set to true' do
score = create(:gw_individual_score,
crew_gw_participation: participation,
crew_membership: membership,
is_cumulative: true)
expect(score.is_cumulative).to be true
end
end
describe 'recorded_by association' do
let(:participation) { create(:crew_gw_participation) }
let(:membership) { create(:crew_membership, crew: participation.crew) }
let(:recorder) { create(:user) }
it 'tracks who recorded the score' do
score = create(:gw_individual_score,
crew_gw_participation: participation,
crew_membership: membership,
recorded_by: recorder)
expect(score.recorded_by).to eq(recorder)
end
end
end