feat: Implement tournament schedule tab and fix E2E tests (#27)
Release / release (push) Failing after 9s
Build CI Images / build-ci-base (push) Failing after 18s

## 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>
This commit was merged in pull request #27.
This commit is contained in:
2026-04-27 01:59:16 +00:00
committed by david
parent 75358bf20d
commit bb6be245b7
97 changed files with 7950 additions and 1341 deletions
+115
View File
@@ -0,0 +1,115 @@
# 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 `generateVariableRoundRobin` function from `schedule-generator.ts`
- Refactored schedule generation into three clear code paths:
1. **Fixed Teams**: Generate once, apply round-robin
2. **Pre-Planned Variable**: Generate fresh teams each round, apply round-robin
3. **Dynamic**: Return `requiresDynamicScheduling: true` flag
- Fixed round count calculation (was using participant count instead of team count)
### Database Changes
- **No schema changes needed** - existing `teamDurability` field 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 `TeamPairing` type
- Added `generateVariableRoundRobin()` function
- This function generates fresh teams for each round and applies round-robin pairing
## 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