Fix crash when starting second Swiss bracket in the same tournament
Some checks failed
Tests and checks on push / run-checks-and-tests (push) Has been cancelled
Updates translation progress / update-translation-progress-issue (push) Has been cancelled

TournamentStage.number is a running number for Swiss now as well. Before was hardcoded as 1. Running number was already in use in bracket-manager so this was just an oversight. Crash was caused by database unique constaint
This commit is contained in:
Kalle 2025-09-29 20:31:03 +03:00
parent a954abf542
commit 8fc76fd317
2 changed files with 41 additions and 20 deletions

View File

@ -18,7 +18,7 @@ const createTournamentStageStm = sql.prepare(/* sql */ `
@type,
@createdAt,
@settings,
@number,
(select coalesce(max("number"), 0) + 1 from "TournamentStage" where "tournamentId" = @tournamentId),
@name
) returning *
`);
@ -81,7 +81,6 @@ export function createSwissBracketInTransaction(
type: stageInput.type,
createdAt: dateToDatabaseTimestamp(new Date()),
settings: JSON.stringify(stageInput.settings),
number: stageInput.number,
name: stageInput.name,
}) as Tables["TournamentStage"];

View File

@ -542,7 +542,7 @@ test.describe("Tournament bracket", () => {
}) => {
const tournamentId = 4;
await seed(page, "SMALL_SOS");
await seed(page);
await impersonate(page);
await navigate({
@ -552,34 +552,56 @@ test.describe("Tournament bracket", () => {
await page.getByTestId("edit-event-info-button").click();
await page.getByTestId("delete-bracket-button").last().click();
await page.getByTestId("delete-bracket-button").last().click();
await page.getByTestId("delete-bracket-button").last().click();
await page.getByTestId("follow-up-bracket-switch").click();
for (const toggle of await page
.getByTestId("follow-up-bracket-switch")
.all()) {
await toggle.click();
}
await page.getByLabel("Format").first().selectOption("Single-elimination");
await page.getByLabel("Format").nth(1).selectOption("Single-elimination");
await page.getByLabel("Format").nth(2).selectOption("Swiss");
await page.getByLabel("Format").nth(3).selectOption("Swiss");
await submit(page);
await page.getByText("Seeds").click();
await page.getByTestId("set-starting-brackets").click();
await page
.getByTestId("starting-bracket-select")
.first()
.selectOption("Great White");
await page
.getByTestId("starting-bracket-select")
.nth(1)
.selectOption("Great White");
for (let i = 0; i < 16; i++) {
let bracketName: string;
if (i < 4) {
bracketName = "Groups stage";
} else if (i < 8) {
bracketName = "Great White";
} else if (i < 12) {
bracketName = "Hammerhead";
} else {
bracketName = "Mako";
}
await page
.getByTestId("starting-bracket-select")
.nth(i)
.selectOption(bracketName);
}
await submit(page, "set-starting-brackets-submit-button");
await page.getByTestId("brackets-tab").click();
await page.getByText("Great White").click();
await page.getByTestId("finalize-bracket-button").click();
await page.getByTestId("confirm-finalize-bracket-button").click();
await expect(page.locator('[data-match-id="1"]')).toBeVisible();
await isNotVisible(page.locator('[data-match-id="2"]'));
await page.getByTestId("brackets-tab").click();
for (const bracketName of [
"Groups stage",
"Great White",
"Hammerhead",
"Mako",
]) {
await page.getByRole("button", { name: bracketName }).click();
await page.getByTestId("finalize-bracket-button").click();
await page.getByTestId("confirm-finalize-bracket-button").click();
}
await expect(page.locator('[data-match-id="11"]')).toBeVisible();
});
test("organizer edits a match after it is done", async ({ page }) => {