From 493ae0cf7127249271cb085d4497a770942deeb7 Mon Sep 17 00:00:00 2001 From: David Gwilliam Date: Sun, 26 Apr 2026 20:26:21 -0700 Subject: [PATCH] test: enable player schedule tests with match data setup Related to #9 - Implemented 'I have upcoming matches in my schedule' step to create tournament, players, and match with future date - Added step definitions for schedule content verification - 2 player schedule scenarios now active (empty schedule, upcoming matches) - 'Click on match' scenario remains @wip (page lacks match detail links) Player schedule page at /players/[id]/schedule shows upcoming matches with tournament name, player names, and dates. --- e2e/cucumber/features/player-schedule.feature | 2 +- e2e/cucumber/step-definitions/auth-steps.ts | 69 ++++++++++++++++--- e2e/cucumber/step-definitions/common-steps.ts | 47 +++++++++++++ 3 files changed, 108 insertions(+), 10 deletions(-) diff --git a/e2e/cucumber/features/player-schedule.feature b/e2e/cucumber/features/player-schedule.feature index 1152cc3..60c2192 100644 --- a/e2e/cucumber/features/player-schedule.feature +++ b/e2e/cucumber/features/player-schedule.feature @@ -9,7 +9,7 @@ Feature: Player Schedule When I go to my schedule page Then I should see "No upcoming matches" - @happy-path @player-features @issue-9 @wip + @happy-path @player-features @issue-9 Scenario: Player views schedule with upcoming matches Given I am logged in as a player And I have upcoming matches in my schedule diff --git a/e2e/cucumber/step-definitions/auth-steps.ts b/e2e/cucumber/step-definitions/auth-steps.ts index f9a7364..a4ea3f4 100644 --- a/e2e/cucumber/step-definitions/auth-steps.ts +++ b/e2e/cucumber/step-definitions/auth-steps.ts @@ -337,16 +337,67 @@ When('I go to my schedule page', async function () { }); Given('I have upcoming matches in my schedule', async function () { - console.log('🌍 Note: This step requires database setup via API or UI'); - console.log('🌍 For acceptance tests, this would be set up before running the test'); - // For true acceptance testing, we would: - // 1. Create a tournament - // 2. Add the player as a participant - // 3. Generate a schedule - // 4. The match would then appear in the player's schedule + console.log('🌍 Setting up upcoming matches in schedule'); + const prisma = await world.getPrisma(); + const timestamp = Date.now(); - // For now, this is a placeholder that indicates data setup is needed - // In a real test run, this data would already exist in the dev database + // Get the current player + if (!world.playerId) { + throw new Error('No player ID found. Make sure user is logged in as a player first.'); + } + + const currentPlayerId = parseInt(world.playerId, 10); + + // Create 3 other players for the match + const opponent1 = await prisma.player.create({ + data: { + name: `Opponent ${timestamp} 1`, + normalizedName: `opponent ${timestamp} 1`, + currentElo: 1000, + }, + }); + + const opponent2 = await prisma.player.create({ + data: { + name: `Opponent ${timestamp} 2`, + normalizedName: `opponent ${timestamp} 2`, + currentElo: 1000, + }, + }); + + const partner1 = await prisma.player.create({ + data: { + name: `Partner ${timestamp}`, + normalizedName: `partner ${timestamp}`, + currentElo: 1000, + }, + }); + + // Create a tournament + const tournament = await prisma.event.create({ + data: { + name: `Test Schedule Tournament ${timestamp}`, + eventDate: new Date(Date.now() + 86400000), // Tomorrow + status: 'planned', + }, + }); + + // Create a match with the current player as player1P1 (played tomorrow) + await prisma.match.create({ + data: { + eventId: tournament.id, + player1P1Id: currentPlayerId, + player1P2Id: partner1.id, + player2P1Id: opponent1.id, + player2P2Id: opponent2.id, + team1Score: 10, + team2Score: 5, + status: 'completed', + playedAt: new Date(Date.now() + 86400000), // Tomorrow + }, + }); + + console.log(`🌍 Created tournament "${tournament.name}" with 1 match for player ${currentPlayerId}`); }); /** diff --git a/e2e/cucumber/step-definitions/common-steps.ts b/e2e/cucumber/step-definitions/common-steps.ts index 1478ef6..b1634a4 100644 --- a/e2e/cucumber/step-definitions/common-steps.ts +++ b/e2e/cucumber/step-definitions/common-steps.ts @@ -599,3 +599,50 @@ Then('I should see the rankings table', async function () { await expect(world.page.locator('table')).toBeVisible(); console.log('🌍 Verified rankings table is visible'); }); + +// Player Schedule Steps +Then('I should see the match date', async function () { + // Check for a date-like pattern on the page + const content = await world.page.content(); + const hasDate = content.match(/\d{1,2}\/\d{1,2}\/\d{4}/) || content.match(/\w+ \d{1,2}, \d{4}/); + expect(hasDate).toBeTruthy(); + console.log('🌍 Verified match date is visible'); +}); + +Then('I should see my opponent\'s name', async function () { + // Check for opponent text on the page + const content = await world.page.content(); + const hasOpponent = content.includes('Opponent'); + expect(hasOpponent).toBe(true); + console.log('🌍 Verified opponent name is visible'); +}); + +Then('I should see my partner\'s name', async function () { + // Check for partner text on the page + const content = await world.page.content(); + const hasPartner = content.includes('Partner'); + expect(hasPartner).toBe(true); + console.log('🌍 Verified partner name is visible'); +}); + +Then('I should see the tournament name', async function () { + // Check for tournament name on the page + const content = await world.page.content(); + const hasTournament = content.includes('Test Schedule Tournament'); + expect(hasTournament).toBe(true); + console.log('🌍 Verified tournament name is visible'); +}); + +When('I click on a match', async function () { + // Click on the first match link + const matchLink = world.page.locator('a[href*="/matches/"]').first(); + await matchLink.click(); + await world.page.waitForLoadState('domcontentloaded'); + console.log('🌍 Clicked on match'); +}); + +Then('I should be on the match detail page', async function () { + const currentUrl = world.page.url(); + console.log(`🌍 Checking current URL: ${currentUrl}`); + expect(currentUrl).toMatch(/\/matches\/\d+/); +});