Settings updates 'disableBuildAbilitySorting' Renders/builds/:slug /settings
Weapon builds page Settings page Weapon builds page Arrange
Create build owner Sendou weapon spl ids 200 abilities UNSORTED_ABILITIES
await factories.BuildFactory .create ({
ownerId: ADMIN_ID ,
weaponSplIds: [LUNA_BLASTER_ID ],
abilities: UNSORTED_ABILITIES ,
});Weapon builds page Act
Open the weapon builds page “luna-blaster”
await weaponBuilds.goto ("luna-blaster" );Inner HTML → oldContents
const oldContents = await weaponBuilds.buildCard (0 ).root.innerHTML ();Settings page Act
Disable build ability sorting
await settings.disableBuildAbilitySorting ();Weapon builds page Act
Open the weapon builds page “luna-blaster”
await weaponBuilds.goto ("luna-blaster" );Inner HTML → newContents
const newContents = await weaponBuilds.buildCard (0 ).root.innerHTML ();Assert
newContents is not oldContents
expect (newContents).not.toBe (oldContents);Source test ("updates 'disableBuildAbilitySorting'" , async ({ page, factories }) => {
await factories.BuildFactory .create ({
ownerId: ADMIN_ID ,
weaponSplIds: [LUNA_BLASTER_ID ],
abilities: UNSORTED_ABILITIES ,
});
await impersonate (page);
const weaponBuilds = new WeaponBuildsPage (page);
await weaponBuilds.goto ("luna-blaster" );
const oldContents = await weaponBuilds.buildCard (0 ).root.innerHTML ();
const settings = new SettingsPage (page);
await settings.disableBuildAbilitySorting ();
await weaponBuilds.goto ("luna-blaster" );
const newContents = await weaponBuilds.buildCard (0 ).root.innerHTML ();
expect (newContents).not.toBe (oldContents);
})Renders/calendar /settings
Calendar page Settings page Calendar page Arrange
the clock header only renders above a day's events
Create calendar event author Sendou
await factories.CalendarEventFactory .create ({ authorId: ADMIN_ID });Calendar page Act
Open the calendar page
await calendar.goto ();First → clockTime
const clockTime = calendar.locators.clockHeaderTimes.first ();Text content → initialTime
const initialTime = await clockTime.textContent ();Assert
initialTime match /AM |PM /
expect (initialTime).toMatch (/AM |PM /);Settings page Act
Set clock format “24h”
await settings.setClockFormat ("24h" );Calendar page Act
Open the calendar page
await calendar.goto ();Text content → newTime
const newTime = await clockTime.textContent ();Assert
newTime not match /AM |PM /
expect (newTime).not.toMatch (/AM |PM /);newTime is not initialTime
expect (newTime).not.toBe (initialTime);newTime contains “:”
expect (newTime).toContain (":" );Source test ("updates clock format preference" , async ({ page, factories }) => {
// the clock header only renders above a day's events
await factories.CalendarEventFactory .create ({ authorId: ADMIN_ID });
await impersonate (page);
const calendar = new CalendarPage (page);
await calendar.goto ();
const clockTime = calendar.locators.clockHeaderTimes.first ();
const initialTime = await clockTime.textContent ();
expect (initialTime).toMatch (/AM |PM /);
const settings = new SettingsPage (page);
await settings.setClockFormat ("24h" );
await calendar.goto ();
const newTime = await clockTime.textContent ();
expect (newTime).not.toMatch (/AM |PM /);
expect (newTime).not.toBe (initialTime);
expect (newTime).toContain (":" );
})switches language to Japanese, persists it across pages and restores English Renders/faq /settings
Settings page Faq page Settings page Faq page Settings page Act
Open the settings page “locale”
await settings.goto ("locale" );Assert
page heading reads “Settings”
await expect (settings.locators.pageHeading).toHaveText ("Settings" );Act
Select language “日本語”
await settings.selectLanguage ("日本語" );Assert
page heading reads “設定”
await expect (settings.locators.pageHeading).toHaveText ("設定" );Faq page Act
full page load without the lng param -> the language comes from the cookie; the faq namespace is registered via the route handle
Open the faq page
await faq.goto ();Assert
question “プラスサーバーとはなんですか?” is visible
await expect (faq.question ("プラスサーバーとはなんですか?" )).toBeVisible ();Settings page Act
Open the settings page “locale”
await settings.goto ("locale" );Assert
page heading reads “設定”
await expect (settings.locators.pageHeading).toHaveText ("設定" );Act
Select language “English”
await settings.selectLanguage ("English" );Assert
page heading reads “Settings”
await expect (settings.locators.pageHeading).toHaveText ("Settings" );Faq page Act
Open the faq page
await faq.goto ();Assert
question “What is the Plus Server?” is visible
await expect (faq.question ("What is the Plus Server?" )).toBeVisible ();Source test ("switches language to Japanese, persists it across pages and restores English" , async ({
page,
}) => {
const settings = new SettingsPage (page);
const faq = new FaqPage (page);
await settings.goto ("locale" );
await expect (settings.locators.pageHeading).toHaveText ("Settings" );
await settings.selectLanguage ("日本語" );
await expect (settings.locators.pageHeading).toHaveText ("設定" );
// full page load without the lng param -> the language comes from the cookie;
// the faq namespace is registered via the route handle
await faq.goto ();
await expect (faq.question ("プラスサーバーとはなんですか?" )).toBeVisible ();
await settings.goto ("locale" );
await expect (settings.locators.pageHeading).toHaveText ("設定" );
await settings.selectLanguage ("English" );
await expect (settings.locators.pageHeading).toHaveText ("Settings" );
await faq.goto ();
await expect (faq.question ("What is the Plus Server?" )).toBeVisible ();
})shows in-game names in the picked game language and the rest in the site's language Renders/builds/:slug /settings
Settings page Weapon builds page Arrange
Create build owner Sendou weapon spl ids 200
await factories.BuildFactory .create ({
ownerId: ADMIN_ID ,
weaponSplIds: [LUNA_BLASTER_ID ],
});Settings page Act
Open the settings page “locale”
await settings.goto ("locale" );Select game language “日本語”
await settings.selectGameLanguage ("日本語" );Weapon builds page Act
Open the weapon builds page “luna-blaster”
await weaponBuilds.goto ("luna-blaster" );Assert
weapon image “ノヴァブラスター” is visible
await expect (
weaponBuilds.buildCard (0 ).weaponImage ("ノヴァブラスター" ),
).toBeVisible ();ability stats tab is visible
await expect (weaponBuilds.locators.abilityStatsTab).toBeVisible ();Source test ("shows in-game names in the picked game language and the rest in the site's language" , async ({
page,
factories,
}) => {
await factories.BuildFactory .create ({
ownerId: ADMIN_ID ,
weaponSplIds: [LUNA_BLASTER_ID ],
});
const settings = new SettingsPage (page);
const weaponBuilds = new WeaponBuildsPage (page);
await settings.goto ("locale" );
await settings.selectGameLanguage ("日本語" );
await weaponBuilds.goto ("luna-blaster" );
await expect (
weaponBuilds.buildCard (0 ).weaponImage ("ノヴァブラスター" ),
).toBeVisible ();
await expect (weaponBuilds.locators.abilityStatsTab).toBeVisible ();
})persists sound settings and dark/light theme across reload Renders/settings
Settings page Settings page Act
Open the settings page “sounds”
await settings.goto ("sounds" );Sound checkbox “Group invitation received” → likeSound
const likeSound = settings.soundCheckbox ("Group invitation received" );Assert
likeSound is checked
await expect (likeSound).toBeChecked ();Act
Click likeSound
await likeSound.click ();Assert
likeSound is not checked
await expect (likeSound).not.toBeChecked ();Act
Set sound volume “37”
await settings.setSoundVolume ("37" );default resolves to light (auto + light color scheme) so dark is a real change
Open the settings page “theme”
await settings.goto ("theme" );Set theme “Dark”
await settings.setTheme ("Dark" );Assert
html root has class /dark/
await expect (settings.locators.htmlRoot).toHaveClass (/dark/);Act
Reload
await settings.reload ();Assert
html root has class /dark/
await expect (settings.locators.htmlRoot).toHaveClass (/dark/);Act
Open the settings page “sounds”
await settings.goto ("sounds" );Assert
likeSound is not checked
await expect (likeSound).not.toBeChecked ();volume slider has value “37”
await expect (settings.locators.volumeSlider).toHaveValue ("37" );Act
Open the settings page “theme”
await settings.goto ("theme" );Set theme “Light”
await settings.setTheme ("Light" );Assert
html root has class /light/
await expect (settings.locators.htmlRoot).toHaveClass (/light/);html root does not have class /dark/
await expect (settings.locators.htmlRoot).not.toHaveClass (/dark/);Source test ("persists sound settings and dark/light theme across reload" , async ({
page,
}) => {
await impersonate (page);
const settings = new SettingsPage (page);
await settings.goto ("sounds" );
const likeSound = settings.soundCheckbox ("Group invitation received" );
await expect (likeSound).toBeChecked ();
await likeSound.click ();
await expect (likeSound).not.toBeChecked ();
await settings.setSoundVolume ("37" );
// default resolves to light (auto + light color scheme) so dark is a real change
await settings.goto ("theme" );
await settings.setTheme ("Dark" );
await expect (settings.locators.htmlRoot).toHaveClass (/dark/);
await settings.reload ();
await expect (settings.locators.htmlRoot).toHaveClass (/dark/);
await settings.goto ("sounds" );
await expect (likeSound).not.toBeChecked ();
await expect (settings.locators.volumeSlider).toHaveValue ("37" );
await settings.goto ("theme" );
await settings.setTheme ("Light" );
await expect (settings.locators.htmlRoot).toHaveClass (/light/);
await expect (settings.locators.htmlRoot).not.toHaveClass (/dark/);
})Match profile map preferences retains map selection when toggling a mode prefer -> avoid -> prefer Renders/settings
Match profile page Match profile page Act
Open the match profile page
await matchProfile.goto ();Set mode preference “SZ” , “Prefer”
await matchProfile.maps.setModePreference ("SZ" , "Prefer" );Select mode tab “SZ”
await matchProfile.maps.selectModeTab ("SZ" );Click map button “SZ” , 1
await matchProfile.maps.mapButton ("SZ" , 1 ).click ();Assert
map button “SZ” , 1 has class SELECTED_MAP_CLASS
await expect (matchProfile.maps.mapButton ("SZ" , 1 )).toHaveClass (
SELECTED_MAP_CLASS ,
);Act
avoiding hides the picker, but the selection should be remembered
Set mode preference “SZ” , “Avoid”
await matchProfile.maps.setModePreference ("SZ" , "Avoid" );Assert
map button “SZ” , 1 is not visible
await isNotVisible (matchProfile.maps.mapButton ("SZ" , 1 ));Act
Set mode preference “SZ” , “Prefer”
await matchProfile.maps.setModePreference ("SZ" , "Prefer" );Select mode tab “SZ”
await matchProfile.maps.selectModeTab ("SZ" );Assert
map button “SZ” , 1 has class SELECTED_MAP_CLASS
await expect (matchProfile.maps.mapButton ("SZ" , 1 )).toHaveClass (
SELECTED_MAP_CLASS ,
);Source test ("retains map selection when toggling a mode prefer -> avoid -> prefer" , async ({
page,
}) => {
await impersonate (page);
const matchProfile = new MatchProfilePage (page);
await matchProfile.goto ();
await matchProfile.maps.setModePreference ("SZ" , "Prefer" );
await matchProfile.maps.selectModeTab ("SZ" );
await matchProfile.maps.mapButton ("SZ" , 1 ).click ();
await expect (matchProfile.maps.mapButton ("SZ" , 1 )).toHaveClass (
SELECTED_MAP_CLASS ,
);
// avoiding hides the picker, but the selection should be remembered
await matchProfile.maps.setModePreference ("SZ" , "Avoid" );
await isNotVisible (matchProfile.maps.mapButton ("SZ" , 1 ));
await matchProfile.maps.setModePreference ("SZ" , "Prefer" );
await matchProfile.maps.selectModeTab ("SZ" );
await expect (matchProfile.maps.mapButton ("SZ" , 1 )).toHaveClass (
SELECTED_MAP_CLASS ,
);
})can save 'zones only' after a now-avoided mode previously had a map pool Renders/settings
Match profile page Match profile page Act
Open the match profile page
await matchProfile.goto ();stage 2 is not banned in TC
Set mode preference “SZ” , “Prefer”
await matchProfile.maps.setModePreference ("SZ" , "Prefer" );Select mode tab “SZ”
await matchProfile.maps.selectModeTab ("SZ" );Click map button “SZ” , 1
await matchProfile.maps.mapButton ("SZ" , 1 ).click ();Set mode preference “TC” , “Prefer”
await matchProfile.maps.setModePreference ("TC" , "Prefer" );Select mode tab “TC”
await matchProfile.maps.selectModeTab ("TC" );Click map button “TC” , 2
await matchProfile.maps.mapButton ("TC" , 2 ).click ();Save
await matchProfile.save ();Set mode preference “TW” , “Avoid”
await matchProfile.maps.setModePreference ("TW" , "Avoid" );Set mode preference “TC” , “Avoid”
await matchProfile.maps.setModePreference ("TC" , "Avoid" );Set mode preference “RM” , “Avoid”
await matchProfile.maps.setModePreference ("RM" , "Avoid" );Set mode preference “CB” , “Avoid”
await matchProfile.maps.setModePreference ("CB" , "Avoid" );Save
await matchProfile.save ();the previously saved TC pool must not resurface as an invalid "pool for an avoided mode"
Open the match profile page
await matchProfile.goto ();Save
await matchProfile.save ();Assert
avoided mode pool error is not visible
await isNotVisible (matchProfile.locators.avoidedModePoolError);Source test ("can save 'zones only' after a now-avoided mode previously had a map pool" , async ({
page,
}) => {
await impersonate (page);
const matchProfile = new MatchProfilePage (page);
await matchProfile.goto ();
// stage 2 is not banned in TC
await matchProfile.maps.setModePreference ("SZ" , "Prefer" );
await matchProfile.maps.selectModeTab ("SZ" );
await matchProfile.maps.mapButton ("SZ" , 1 ).click ();
await matchProfile.maps.setModePreference ("TC" , "Prefer" );
await matchProfile.maps.selectModeTab ("TC" );
await matchProfile.maps.mapButton ("TC" , 2 ).click ();
await matchProfile.save ();
await matchProfile.maps.setModePreference ("TW" , "Avoid" );
await matchProfile.maps.setModePreference ("TC" , "Avoid" );
await matchProfile.maps.setModePreference ("RM" , "Avoid" );
await matchProfile.maps.setModePreference ("CB" , "Avoid" );
await matchProfile.save ();
// the previously saved TC pool must not resurface as an invalid "pool for an avoided mode"
await matchProfile.goto ();
await matchProfile.save ();
await isNotVisible (matchProfile.locators.avoidedModePoolError);
})Spoiler-free mode censors bracket and reveals on click Renders/settings /to/:id /to/:id/brackets /to/:id/results
Settings page Tournament brackets page Tournament results page Arrange
Create finalized tournament → tournament
const tournament = await createFinalizedTournament (factories);Settings page Act
Enable spoiler free mode
await settings.enableSpoilerFreeMode ();Tournament brackets page Act
Open the tournament brackets page tournament.id
await brackets.goto (tournament.id);Assert
show results button is visible
await expect (brackets.locators.showResultsButton).toBeVisible ();first censored team names is visible
await expect (brackets.locators.censoredTeamNames.first ()).toBeVisible ();Act
Click show results button
await brackets.locators.showResultsButton.click ();Assert
hide results button is visible
await expect (brackets.locators.hideResultsButton).toBeVisible ();censored team names is not visible
await isNotVisible (brackets.locators.censoredTeamNames);Tournament results page Act
Open the tournament results page tournament.id
await results.goto (tournament.id);Assert
first result team names is visible
await expect (results.locators.resultTeamNames.first ()).toBeVisible ();Source test ("censors bracket and reveals on click" , async ({ page, factories }) => {
const tournament = await createFinalizedTournament (factories);
await impersonate (page);
const settings = new SettingsPage (page);
await settings.enableSpoilerFreeMode ();
const brackets = new TournamentBracketsPage (page);
await brackets.goto (tournament.id);
await expect (brackets.locators.showResultsButton).toBeVisible ();
await expect (brackets.locators.censoredTeamNames.first ()).toBeVisible ();
await brackets.locators.showResultsButton.click ();
await expect (brackets.locators.hideResultsButton).toBeVisible ();
await isNotVisible (brackets.locators.censoredTeamNames);
// the sessionStorage reveal carries over to the results page
const results = new TournamentResultsPage (page);
await results.goto (tournament.id);
await expect (results.locators.resultTeamNames.first ()).toBeVisible ();
})results page is censored and can be revealed Renders/settings /to/:id /to/:id/results
Settings page Tournament results page Arrange
Create finalized tournament → tournament
const tournament = await createFinalizedTournament (factories);Settings page Act
Enable spoiler free mode
await settings.enableSpoilerFreeMode ();Tournament results page Act
Open the tournament results page tournament.id
await results.goto (tournament.id);Assert
show results button is visible
await expect (results.locators.showResultsButton).toBeVisible ();result team names is not visible
await isNotVisible (results.locators.resultTeamNames);Act
Click show results button
await results.locators.showResultsButton.click ();Assert
first result team names is visible
await expect (results.locators.resultTeamNames.first ()).toBeVisible ();Source test ("results page is censored and can be revealed" , async ({
page,
factories,
}) => {
const tournament = await createFinalizedTournament (factories);
await impersonate (page);
const settings = new SettingsPage (page);
await settings.enableSpoilerFreeMode ();
const results = new TournamentResultsPage (page);
await results.goto (tournament.id);
await expect (results.locators.showResultsButton).toBeVisible ();
await isNotVisible (results.locators.resultTeamNames);
await results.locators.showResultsButton.click ();
await expect (results.locators.resultTeamNames.first ()).toBeVisible ();
})WeaponBuildsPage.gotoe2e/pages/builds/weapon-builds-page.ts:24
No JSDoc
async goto (weaponSlug: string ) {
await navigate ({ page: this .page, url: weaponBuildPage (weaponSlug) });
}SettingsPage.disableBuildAbilitySortinge2e/pages/settings/settings-page.ts:72
No JSDoc
async disableBuildAbilitySorting () {
await this .goto ("preferences" );
await this .checkDisableBuildAbilitySortingToggle ();
}WeaponBuildsPagee2e/pages/builds/weapon-builds-page.ts:7
No JSDoc
SettingsPagee2e/pages/settings/settings-page.ts:18
CalendarPage.gotoe2e/pages/calendar/calendar-page.ts:35
async goto (dayMonthYear?: DayMonthYear ) {
await navigate ({ page: this .page, url: calendarPage ({ dayMonthYear }) });
}SettingsPage.setClockFormate2e/pages/settings/settings-page.ts:84
No JSDoc
async setClockFormat (format: "12h" | "24h" ) {
await this .goto ("locale" );
await waitForPOSTResponse (this .page, () =>
this .clockFormatForm.select ("newValue" , format),
);
}CalendarPagee2e/pages/calendar/calendar-page.ts:14
SettingsPage.gotoe2e/pages/settings/settings-page.ts:52
No JSDoc
async goto (tab?: SettingsTab ) {
await navigate ({
page: this .page,
url: tab ? `${SETTINGS_PAGE}?tab=${tab}` : SETTINGS_PAGE ,
});
}SettingsPage.locators.pageHeadinge2e/pages/settings/settings-page.ts:42
No JSDoc
page.getByRole ("heading" , { name: /^(Settings |設定)$/ }) SettingsPage.selectLanguagee2e/pages/settings/settings-page.ts:99
async selectLanguage (name: "English" | "日本語" ) {
await this .locators.languageSelect.selectOption ({ label: name });
}FaqPage.gotoe2e/pages/info/faq-page.ts:13
No JSDoc
async goto () {
await navigate ({ page: this .page, url: FAQ_PAGE });
}FaqPage.questione2e/pages/info/faq-page.ts:17
No JSDoc
question (text: string ) {
return this .page.getByText (text);
}FaqPagee2e/pages/info/faq-page.ts:6
SettingsPage.selectGameLanguagee2e/pages/settings/settings-page.ts:104
async selectGameLanguage (name: "English" | "日本語" ) {
await this .locators.gameLanguageSelect.selectOption ({ label: name });
await this .page.waitForURL (/gameLng=/);
}WeaponBuildsPage.buildCarde2e/pages/builds/weapon-builds-page.ts:28
No JSDoc
buildCard (nth: number ) {
return new BuildCard (this .locators.buildCards.nth (nth));
}WeaponBuildsPage.locators.abilityStatsTabe2e/pages/builds/weapon-builds-page.ts:15
No JSDoc
page.getByRole ("tab" , { name: /Ability stats/ }) SettingsPage.soundCheckboxe2e/pages/settings/settings-page.ts:116
No JSDoc
soundCheckbox (name: string ) {
return this .page.getByRole ("checkbox" , { name });
}SettingsPage.setSoundVolumee2e/pages/settings/settings-page.ts:120
No JSDoc
async setSoundVolume (value: string ) {
await this .locators.volumeSlider.fill (value);
}SettingsPage.setThemee2e/pages/settings/settings-page.ts:110
async setTheme (theme: "Auto" | "Dark" | "Light" ) {
await waitForPOSTResponse (this .page, async () => {
await this .locators.themeSelect.selectOption ({ label: theme });
});
}SettingsPage.locators.htmlRoote2e/pages/settings/settings-page.ts:46
No JSDoc
page.locator ("html" ) SettingsPage.reloade2e/pages/settings/settings-page.ts:146
No JSDoc
async reload () {
await this .page.reload ();
await expectIsHydrated (this .page);
}SettingsPage.locators.volumeSlidere2e/pages/settings/settings-page.ts:47
No JSDoc
page.getByRole ("slider" ) MatchProfilePage.gotoe2e/pages/settings/match-profile-page.ts:25
No JSDoc
async goto () {
await navigate ({ page: this .page, url: MATCH_PROFILE_PAGE });
}isNotVisiblee2e/helpers/playwright.ts:745
No JSDoc
export function isNotVisible (locator: Locator ) {
return expect (locator).toHaveCount (0 );
}MatchProfilePagee2e/pages/settings/match-profile-page.ts:8
No JSDoc
MatchProfilePage.savee2e/pages/settings/match-profile-page.ts:29
No JSDoc
async save () {
await submit (this .page);
}MatchProfilePage.locators.avoidedModePoolErrore2e/pages/settings/match-profile-page.ts:19
No JSDoc
page.getByText (
"Can't have map pool for a mode that was avoided" ,
) createFinalizedTournamente2e/settings.spec.ts:264
No JSDoc
async function createFinalizedTournament (factories: Factories ) {
const users = await factories.UserFactory .createMany (TEAM_COUNT * TEAM_SIZE );
const teamRosters = Array .from ({ length: TEAM_COUNT }, (_, teamIndex) =>
users
.slice (teamIndex * TEAM_SIZE , (teamIndex + 1 ) * TEAM_SIZE )
.map ((user) => user.id),
);
return factories.TournamentFactory .createPlayed (
{ authorId: ADMIN_ID },
{ teamRosters, playedOut: "all" },
);
}SettingsPage.enableSpoilerFreeModee2e/pages/settings/settings-page.ts:91
No JSDoc
async enableSpoilerFreeMode () {
await this .goto ("preferences" );
await waitForPOSTResponse (this .page, () =>
this .spoilerFreeModeForm.check ("newValue" ),
);
}TournamentBracketsPage.gotoe2e/pages/tournament/tournament-brackets-page.ts:45
No JSDoc
async goto (tournamentId: number , bracketIdx?: number ) {
await navigate ({
page: this .page,
url: tournamentBracketsPage ({ tournamentId, bracketIdx }),
});
}TournamentBracketsPage.locators.showResultsButtone2e/pages/tournament/tournament-brackets-page.ts:24
No JSDoc
page.getByRole ("button" , { name: "Show results" }) TournamentBracketsPage.locators.censoredTeamNamese2e/pages/tournament/tournament-brackets-page.ts:26
No JSDoc
page.getByText ("???" ) TournamentBracketsPage.locators.hideResultsButtone2e/pages/tournament/tournament-brackets-page.ts:25
No JSDoc
page.getByRole ("button" , { name: "Hide results" }) TournamentResultsPage.gotoe2e/pages/tournament/tournament-results-page.ts:22
No JSDoc
async goto (tournamentId: number ) {
await navigate ({
page: this .page,
url: tournamentResultsPage (tournamentId),
});
}TournamentResultsPage.locators.resultTeamNamese2e/pages/tournament/tournament-results-page.ts:15
No JSDoc
page.getByTestId ("result-team-name" ) TournamentBracketsPagee2e/pages/tournament/tournament-brackets-page.ts:14
No JSDoc
TournamentResultsPagee2e/pages/tournament/tournament-results-page.ts:7
TournamentResultsPage.locators.showResultsButtone2e/pages/tournament/tournament-results-page.ts:14
No JSDoc
page.getByRole ("button" , { name: "Show results" })