bb6be245b7
## Summary This PR implements the tournament schedule tab functionality and fixes all remaining E2E test failures. ### Changes Included 1. **Tournament Schedule Feature** - Added tournament schedule page at `/admin/tournaments/[id]/schedule` - Implemented "Generate Schedule" button functionality - Added schedule generation logic for round-robin tournaments 2. **E2E Test Fixes** - Fixed database connection issues in production builds - Improved test reliability with better error handling and debugging - Updated test infrastructure to use environment variables instead of hardcoded values 3. **CI/CD Updates** - Added E2E test job to PR workflow - Configured tests to run against development database - Moved database password to Gitea secrets 4. **Code Quality** - Removed hardcoded passwords from codebase - Improved Prisma client configuration - Enhanced authentication and navigation components ### Test Results All 16 E2E test scenarios are now passing: - Authentication tests: ✅ - Registration tests: ✅ - Tournament schedule tests: ✅ - Player schedule tests: ✅ - Admin navigation tests: ✅ ### Database Configuration - Tests run against `euchre_camp_dev` database - Production builds use environment variables for database configuration - Database password stored in Gitea secrets as `DB_PASSWORD` ### CI Pipeline The PR workflow now includes: 1. Unit tests 2. E2E tests (using production build) 3. Version bump analysis E2E tests must pass before PR can be merged. Reviewed-on: #27 Co-authored-by: David Gwilliam <dhgwilliam@gmail.com> Co-committed-by: David Gwilliam <dhgwilliam@gmail.com>
4.5 KiB
4.5 KiB
Team Durability Options - Implementation Summary
Overview
Restructured team durability options to provide clearer, more useful choices for tournament organizers.
New Options
1. Fixed Teams (previously "Permanent")
- Description: Teams formed once and stay fixed throughout the tournament
- Behavior:
- Teams are generated once at tournament start
- Same partnerships in every round
- Round-robin schedule between fixed teams
- Use Case: Traditional league play where partnerships are established
2. Pre-Planned Variable (previously "Variable")
- Description: Fresh teams each round with partner rotation, schedule pre-planned before tournament starts
- Behavior:
- Teams are generated fresh for each round
- Partner rotation strategies (none, minimize_repeat, maximize_even, elo_based) apply
- Full schedule is generated at tournament creation
- Each round has different team pairings
- Use Case: Social tournaments where players want to partner with different people each round
3. Dynamic/Progressive (new option, previously "Per-Round")
- Description: Teams formed based on results, schedule progresses as rounds complete
- Behavior:
- Cannot pre-generate full schedule
- Next round is scheduled after current round completes
- Enables bracket-style or Swiss-style tournaments
- Teams can be formed based on performance/results
- Use Case: Single/double elimination tournaments, Swiss-system tournaments
Key Changes
API Changes (src/app/api/tournaments/[id]/schedule/route.ts)
- Added
generateVariableRoundRobinfunction fromschedule-generator.ts - Refactored schedule generation into three clear code paths:
- Fixed Teams: Generate once, apply round-robin
- Pre-Planned Variable: Generate fresh teams each round, apply round-robin
- Dynamic: Return
requiresDynamicScheduling: trueflag
- Fixed round count calculation (was using participant count instead of team count)
Database Changes
- No schema changes needed - existing
teamDurabilityfield already supports all values - Values:
"permanent"(Fixed),"variable"(Pre-Planned),"per_round"(Dynamic)
UI Changes
-
Tournament Creation Form (
src/app/admin/tournaments/new/page.tsx):- Renamed "Team Durability" to "Team Formation Strategy"
- Updated option labels:
- "Permanent Teams" → "Fixed Teams"
- "Variable Teams" → "Pre-Planned Variable"
- "Per-Round Teams" → "Dynamic/Progressive"
- Updated descriptions to clearly explain each option
-
Edit Tournament Form (
src/components/EditTournamentForm.tsx):- Same UI updates as creation form
-
Teams Section (
src/components/TeamsSection.tsx):- Same UI updates
- Partner rotation options only shown for "Pre-Planned Variable"
Function Changes
src/lib/schedule-generator.ts:- Added
TeamPairingtype - Added
generateVariableRoundRobin()function - This function generates fresh teams for each round and applies round-robin pairing
- Added
How It Works
Fixed Teams Example
Teams: [Emma+Kendall, Katie+Linden, Sara+Amelia, Bri+Jesse]
Round 1: Emma+Kendall vs Katie+Linden, Sara+Amelia vs Bri+Jesse
Round 2: Emma+Kendall vs Sara+Amelia, Katie+Linden vs Bri+Jesse
Round 3: Emma+Kendall vs Bri+Jesse, Katie+Linden vs Sara+Amelia
Same teams in every round, just different opponents.
Pre-Planned Variable Example (with minimize_repeat)
Round 1 Teams: [Emma+Kendall, Katie+Linden, Sara+Amelia, Bri+Jesse]
Round 1: Emma+Kendall vs Katie+Linden, Sara+Amelia vs Bri+Jesse
Round 2 Teams: [Emma+Sara, Katie+Bri, Kendall+Amelia, Linden+Jesse]
Round 2: Emma+Sara vs Katie+Bri, Kendall+Amelia vs Linden+Jesse
Round 3 Teams: [Emma+Katie, Sara+Bri, Kendall+Linden, Amelia+Jesse]
Round 3: Emma+Katie vs Sara+Bri, Kendall+Linden vs Amelia+Jesse
Fresh partnerships each round, minimizing repeat partnerships.
Dynamic/Progressive Example
Round 1: Generate first matchups based on initial seeding
[After Round 1 completes]
Round 2: Generate matchups based on Round 1 results
[Continue until tournament completes]
Schedule is generated progressively based on actual results.
Testing
- ✅ Build successful
- ✅ Lint passes
- ✅ Unit tests pass (120 pass, 7 pre-existing failures)
- ✅ E2E tests can be added for new functionality
Migration Notes
- Existing tournaments with
teamDurability: "permanent"will continue to work - Existing tournaments with
teamDurability: "variable"or"per_round"will now behave as intended - No database migrations needed
- No breaking changes to API endpoints