/** * BDD E2E Test: League Creation * * Tests the league creation wizard that guides users through: * - Basic league information (name, description, visibility) * - League structure (max drivers, approval requirements, late join) * - Schedule configuration (race frequency, track selection) * - Scoring configuration (points system, penalties) * - Stewarding configuration (protest handling, penalty appeals) * - Review and confirmation * * Focus: Final user outcomes - what the driver sees and can verify */ import { test, expect } from '@playwright/test'; test.describe('League Creation', () => { test.beforeEach(async ({ page }) => { // TODO: Implement authentication setup for a registered driver // - Navigate to login page // - Enter credentials for "John Doe" or similar test driver // - Verify successful login // - Navigate to league creation page }); test('Driver can access league creation wizard', async ({ page }) => { // TODO: Implement test // Scenario: Driver accesses league creation wizard // Given I am a registered driver "John Doe" // And I am on the Leagues Discovery page // When I click "Create League" // Then I should be navigated to the league creation wizard // And I should see the first step (Basics) }); test('Driver can fill in basic league information', async ({ page }) => { // TODO: Implement test // Scenario: Driver fills in basic league information // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Basics step) // When I enter league name "Test League" // And I enter league description "A test league" // And I select visibility "Public" // And I click "Next" // Then I should proceed to the next step // And my basic information should be saved }); test('Driver can configure league visibility', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures league visibility // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Basics step) // When I select visibility "Private" // And I click "Next" // Then the league should be configured as private // And I should proceed to the next step }); test('Driver can configure league structure', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures league structure // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Structure step) // When I set max drivers to "20" // And I enable "Require Approval" // And I enable "Allow Late Join" // And I click "Next" // Then the league structure should be configured // And I should proceed to the next step }); test('Driver can configure max drivers', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures max drivers // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Structure step) // When I set max drivers to "30" // And I click "Next" // Then the max drivers should be set to 30 // And I should proceed to the next step }); test('Driver can configure approval requirement', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures approval requirement // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Structure step) // When I enable "Require Approval" // And I click "Next" // Then the league should require approval // And I should proceed to the next step }); test('Driver can configure late join option', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures late join option // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Structure step) // When I enable "Allow Late Join" // And I click "Next" // Then the league should allow late join // And I should proceed to the next step }); test('Driver can configure schedule', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures schedule // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Schedule step) // When I select race frequency "Weekly" // And I select race day "Saturday" // And I select race time "18:00" // And I click "Next" // Then the schedule should be configured // And I should proceed to the next step }); test('Driver can select tracks for schedule', async ({ page }) => { // TODO: Implement test // Scenario: Driver selects tracks for schedule // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Schedule step) // When I select tracks "Monza", "Spa", "Nürburgring" // And I click "Next" // Then the tracks should be selected // And I should proceed to the next step }); test('Driver can configure scoring system', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures scoring system // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Scoring step) // When I select scoring preset "Standard" // And I configure points for top 10 // And I enable bonus points // And I click "Next" // Then the scoring system should be configured // And I should proceed to the next step }); test('Driver can configure points for positions', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures points for positions // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Scoring step) // When I set points for 1st place to "25" // And I set points for 2nd place to "18" // And I set points for 3rd place to "15" // And I click "Next" // Then the points should be configured // And I should proceed to the next step }); test('Driver can configure bonus points', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures bonus points // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Scoring step) // When I enable bonus points // And I set fastest lap bonus to "1" // And I set pole position bonus to "1" // And I click "Next" // Then the bonus points should be configured // And I should proceed to the next step }); test('Driver can configure penalty system', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures penalty system // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Scoring step) // When I enable penalties // And I set penalty points for incidents // And I configure penalty thresholds // And I click "Next" // Then the penalty system should be configured // And I should proceed to the next step }); test('Driver can configure stewarding system', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures stewarding system // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Stewarding step) // When I enable protests // And I enable penalty appeals // And I set protest deadline to "24 hours" // And I click "Next" // Then the stewarding system should be configured // And I should proceed to the next step }); test('Driver can configure protest handling', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures protest handling // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Stewarding step) // When I enable protests // And I set protest fee to "$5" // And I set protest review time to "48 hours" // And I click "Next" // Then protest handling should be configured // And I should proceed to the next step }); test('Driver can configure penalty appeals', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures penalty appeals // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Stewarding step) // When I enable penalty appeals // And I set appeal fee to "$5" // And I set appeal review time to "72 hours" // And I click "Next" // Then penalty appeals should be configured // And I should proceed to the next step }); test('Driver can configure stewarding team', async ({ page }) => { // TODO: Implement test // Scenario: Driver configures stewarding team // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Stewarding step) // When I add stewards by driver name // And I set steward permissions // And I click "Next" // Then the stewarding team should be configured // And I should proceed to the next step }); test('Driver can review league configuration', async ({ page }) => { // TODO: Implement test // Scenario: Driver reviews league configuration // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see a summary of all configuration // And I should see basic information // And I should see structure settings // And I should see schedule settings // And I should see scoring settings // And I should see stewarding settings }); test('Driver can edit configuration from review', async ({ page }) => { // TODO: Implement test // Scenario: Driver edits configuration from review // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // When I click "Edit" on basic information // Then I should be taken back to the Basics step // And I should be able to edit the information }); test('Driver can confirm league creation', async ({ page }) => { // TODO: Implement test // Scenario: Driver confirms league creation // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // When I click "Create League" // Then the league should be created // And I should be navigated to the league detail page // And I should see a confirmation message }); test('Driver can cancel league creation', async ({ page }) => { // TODO: Implement test // Scenario: Driver cancels league creation // Given I am a registered driver "John Doe" // And I am on the league creation wizard // When I click "Cancel" // Then I should be navigated back to the leagues discovery page // And my progress should not be saved }); test('Driver can save draft league', async ({ page }) => { // TODO: Implement test // Scenario: Driver saves draft league // Given I am a registered driver "John Doe" // And I am on the league creation wizard // When I click "Save Draft" // Then my progress should be saved // And I should be able to continue later }); test('Driver can load saved draft', async ({ page }) => { // TODO: Implement test // Scenario: Driver loads saved draft // Given I am a registered driver "John Doe" // And I have a saved draft league // When I navigate to league creation // Then I should see the option to load draft // And I should be able to continue from where I left off }); test('Driver sees validation errors for required fields', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees validation errors // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Basics step) // When I leave league name empty // And I click "Next" // Then I should see a validation error // And I should not be able to proceed }); test('Driver sees validation errors for invalid values', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees validation errors for invalid values // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Structure step) // When I set max drivers to "0" // And I click "Next" // Then I should see a validation error // And I should not be able to proceed }); test('Driver can navigate between wizard steps', async ({ page }) => { // TODO: Implement test // Scenario: Driver navigates between wizard steps // Given I am a registered driver "John Doe" // And I am on the league creation wizard // When I click "Next" multiple times // And I click "Back" // Then I should be able to navigate between steps // And my data should be preserved }); test('Driver sees progress indicator', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees progress indicator // Given I am a registered driver "John Doe" // And I am on the league creation wizard // Then I should see a progress indicator // And it should show current step and total steps }); test('Driver sees step titles', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees step titles // Given I am a registered driver "John Doe" // And I am on the league creation wizard // Then I should see the title of each step // And titles should be clear and descriptive }); test('Driver sees help text for each field', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees help text // Given I am a registered driver "John Doe" // And I am on the league creation wizard // Then I should see help text for each field // And help text should explain what the field does }); test('Driver sees preview of league', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees preview of league // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see a preview of how the league will look // And preview should include league name, description, etc. }); test('Driver sees estimated league cost', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees estimated league cost // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the estimated cost of running the league // And cost should be displayed as currency amount }); test('Driver sees league capacity information', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league capacity information // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league capacity // And capacity should show max drivers and current count }); test('Driver sees league schedule preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league schedule preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see a preview of the league schedule // And schedule should show race dates and tracks }); test('Driver sees league scoring preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league scoring preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see a preview of the scoring system // And scoring should show points distribution }); test('Driver sees league stewarding preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league stewarding preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see a preview of the stewarding system // And stewarding should show protest and appeal rules }); test('Driver sees league visibility preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league visibility preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league visibility // And visibility should show public/private status }); test('Driver sees league registration preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league registration preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the registration settings // And registration should show approval requirements and late join }); test('Driver sees league owner information preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league owner information preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league owner information // And owner should be the current driver }); test('Driver sees league creation timestamp preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league creation timestamp preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league creation timestamp // And timestamp should be formatted correctly }); test('Driver sees league status preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league status preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league status // And status should show "Active" or "Pending" }); test('Driver sees league member count preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league member count preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league member count // And count should show 1 (the owner) }); test('Driver sees league race count preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league race count preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league race count // And count should match the configured schedule }); test('Driver sees league sponsor count preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league sponsor count preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league sponsor count // And count should show 0 (no sponsors yet) }); test('Driver sees league prize pool preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league prize pool preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league prize pool // And prize pool should show 0 (no sponsors yet) }); test('Driver sees league rating preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league rating preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league rating // And rating should show 0 (no reviews yet) }); test('Driver sees league review count preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league review count preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league review count // And count should show 0 (no reviews yet) }); test('Driver sees league game type preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league game type preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league game type // And game type should be iRacing (default) }); test('Driver sees league skill level preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league skill level preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league skill level // And skill level should be configurable }); test('Driver sees league category preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league category preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league category // And category should be configurable }); test('Driver sees league tags preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league tags preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league tags // And tags should include game type, skill level, etc. }); test('Driver sees league description preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league description preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league description // And description should be displayed }); test('Driver sees league name preview', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league name preview // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see the league name // And name should be displayed prominently }); test('Driver sees league creation confirmation message', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league creation confirmation // Given I am a registered driver "John Doe" // And I have completed the league creation wizard // When I click "Create League" // Then I should see a confirmation message // And confirmation should include league name and next steps }); test('Driver is navigated to league detail after creation', async ({ page }) => { // TODO: Implement test // Scenario: Driver is navigated to league detail // Given I am a registered driver "John Doe" // And I have completed the league creation wizard // When I click "Create League" // Then I should be navigated to the league detail page // And I should see the new league }); test('Driver sees new league in their leagues list', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees new league in their leagues // Given I am a registered driver "John Doe" // And I have created a new league // When I navigate to my leagues // Then I should see the new league in the list // And I should be listed as the owner }); test('Driver can manage their created league', async ({ page }) => { // TODO: Implement test // Scenario: Driver can manage their league // Given I am a registered driver "John Doe" // And I have created a new league // When I navigate to the league detail page // Then I should see admin options // And I should be able to manage the league }); test('Driver sees league in discovery after creation', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league in discovery // Given I am a registered driver "John Doe" // And I have created a new league // When I navigate to leagues discovery // Then I should see the new league in the list // And it should be searchable }); test('Driver can join their own league', async ({ page }) => { // TODO: Implement test // Scenario: Driver can join their own league // Given I am a registered driver "John Doe" // And I have created a new league // When I navigate to the league detail page // Then I should see myself in the roster // And I should be listed as owner }); test('Driver can invite others to their league', async ({ page }) => { // TODO: Implement test // Scenario: Driver can invite others to their league // Given I am a registered driver "John Doe" // And I have created a new league // When I navigate to the league roster page // Then I should see invite options // And I should be able to invite other drivers }); test('Driver can configure league after creation', async ({ page }) => { // TODO: Implement test // Scenario: Driver can configure league after creation // Given I am a registered driver "John Doe" // And I have created a new league // When I navigate to league settings // Then I should be able to edit all configuration // And changes should be saved }); test('Driver can delete their league', async ({ page }) => { // TODO: Implement test // Scenario: Driver deletes their league // Given I am a registered driver "John Doe" // And I have created a new league // When I navigate to league settings // And I click "Delete League" // Then the league should be deleted // And I should see a confirmation message }); test('Driver sees league creation cost breakdown', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees league creation cost breakdown // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see a cost breakdown // And breakdown should include platform fees, etc. }); test('Driver sees league creation terms and conditions', async ({ page }) => { // TODO: Implement test // Scenario: Driver sees terms and conditions // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // Then I should see terms and conditions // And I should be able to review them }); test('Driver must accept terms to create league', async ({ page }) => { // TODO: Implement test // Scenario: Driver must accept terms // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // When I click "Create League" without accepting terms // Then I should see an error // And league should not be created }); test('Driver can accept terms and create league', async ({ page }) => { // TODO: Implement test // Scenario: Driver accepts terms and creates league // Given I am a registered driver "John Doe" // And I am on the league creation wizard (Review step) // When I accept terms and conditions // And I click "Create League" // Then the league should be created // And I should see a confirmation }); });