hensei-api/spec/models/gw_event_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

110 lines
3.5 KiB
Ruby

require 'rails_helper'
RSpec.describe GwEvent, type: :model do
describe 'associations' do
it { is_expected.to have_many(:crew_gw_participations).dependent(:destroy) }
it { is_expected.to have_many(:crews).through(:crew_gw_participations) }
end
describe 'validations' do
it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_presence_of(:element) }
it { is_expected.to validate_presence_of(:start_date) }
it { is_expected.to validate_presence_of(:end_date) }
it { is_expected.to validate_presence_of(:event_number) }
describe 'event_number uniqueness' do
let!(:existing_event) { create(:gw_event, event_number: 100) }
it 'requires unique event_number' do
new_event = build(:gw_event, event_number: 100)
expect(new_event).not_to be_valid
expect(new_event.errors[:event_number]).to include('has already been taken')
end
end
describe 'end_date_after_start_date' do
it 'is invalid when end_date is before start_date' do
event = build(:gw_event, start_date: Date.new(2025, 1, 15), end_date: Date.new(2025, 1, 10))
expect(event).not_to be_valid
expect(event.errors[:end_date]).to include('must be after start date')
end
it 'is valid when end_date is same as start_date' do
event = build(:gw_event, start_date: Date.today, end_date: Date.today)
expect(event).to be_valid
end
it 'is valid when end_date is after start_date' do
event = build(:gw_event, start_date: Date.today, end_date: Date.tomorrow)
expect(event).to be_valid
end
end
end
describe 'scopes' do
let!(:upcoming_event) { create(:gw_event, :upcoming) }
let!(:active_event) { create(:gw_event, :active) }
let!(:finished_event) { create(:gw_event, :finished) }
describe '.upcoming' do
it 'returns only upcoming events' do
expect(GwEvent.upcoming).to include(upcoming_event)
expect(GwEvent.upcoming).not_to include(active_event)
expect(GwEvent.upcoming).not_to include(finished_event)
end
end
describe '.current' do
it 'returns only active events' do
expect(GwEvent.current).to include(active_event)
expect(GwEvent.current).not_to include(upcoming_event)
expect(GwEvent.current).not_to include(finished_event)
end
end
describe '.past' do
it 'returns only finished events' do
expect(GwEvent.past).to include(finished_event)
expect(GwEvent.past).not_to include(upcoming_event)
expect(GwEvent.past).not_to include(active_event)
end
end
end
describe '#active?' do
it 'returns true for active event' do
event = build(:gw_event, :active)
expect(event.active?).to be true
end
it 'returns false for upcoming event' do
event = build(:gw_event, :upcoming)
expect(event.active?).to be false
end
end
describe '#upcoming?' do
it 'returns true for upcoming event' do
event = build(:gw_event, :upcoming)
expect(event.upcoming?).to be true
end
it 'returns false for active event' do
event = build(:gw_event, :active)
expect(event.upcoming?).to be false
end
end
describe '#finished?' do
it 'returns true for finished event' do
event = build(:gw_event, :finished)
expect(event.finished?).to be true
end
it 'returns false for active event' do
event = build(:gw_event, :active)
expect(event.finished?).to be false
end
end
end