Tradisjonelt utslag (samme starthull, staggerte klokkeslett med fast intervall), manuell gruppesammensetning med et forslag å justere, fast gruppestørrelse. Fire ekte bugs funnet og fikset før utrulling via egen scratch-verifisering (FK-korrupsjon, str/datetime-mismatch, tidssone, React state). Migrasjon 084 lagt til, men IKKE anvendt mot ekte teecup_db ennå -- venter på bekreftelse.
159 lines
7.4 KiB
Python
159 lines
7.4 KiB
Python
"""
|
|
Full sletting av en hel turnering (ADR-086) -- kritisk å teste med EKTE
|
|
populert data i begge formater, ikke bare en tom turnering, siden skjemaet
|
|
har to RESTRICT-FK-er MIDT INNI kaskade-grafen (match_participant.
|
|
team_roster_id, tournament_round_participant.tournament_participant_id) som
|
|
kan avvise en naiv enkelt-setnings-kaskade. Se delete_tournament() sin egen
|
|
kommentar i app/routers/tournaments.py for full begrunnelse.
|
|
"""
|
|
|
|
import pytest
|
|
from fastapi import HTTPException
|
|
|
|
from app.auth import CurrentUser
|
|
from app.routers.tournaments import delete_tournament
|
|
|
|
from tests.conftest import (
|
|
add_membership,
|
|
create_course,
|
|
create_match,
|
|
create_match_participant,
|
|
create_org,
|
|
create_org_hole,
|
|
create_player,
|
|
create_session,
|
|
create_team,
|
|
create_team_roster,
|
|
create_tee,
|
|
create_tournament,
|
|
create_tournament_participant,
|
|
create_tournament_round,
|
|
create_tournament_round_participant,
|
|
create_user,
|
|
)
|
|
from app import db as app_db
|
|
|
|
|
|
async def test_delete_team_tournament_with_real_matches_and_scores(pool):
|
|
org_id = await create_org()
|
|
owner_id = await create_user()
|
|
await add_membership(org_id, owner_id, role="owner")
|
|
tournament_id = await create_tournament(org_id)
|
|
course_id = await create_course(org_id)
|
|
tee_id = await create_tee(org_id, course_id)
|
|
session_id = await create_session(org_id, tournament_id, course_id)
|
|
team_a = await create_team(org_id, tournament_id)
|
|
team_b = await create_team(org_id, tournament_id)
|
|
match_id = await create_match(org_id, session_id, team_a, team_b)
|
|
player_a = await create_player(org_id)
|
|
player_b = await create_player(org_id)
|
|
roster_a = await create_team_roster(org_id, team_a, player_a)
|
|
roster_b = await create_team_roster(org_id, team_b, player_b)
|
|
mp_a = await create_match_participant(org_id, match_id, "a", roster_a, tee_id)
|
|
mp_b = await create_match_participant(org_id, match_id, "b", roster_b, tee_id)
|
|
|
|
async with app_db.org_connection(org_id) as conn:
|
|
await conn.execute(
|
|
"INSERT INTO hole_score (organization_id, match_id, team_side, match_participant_id, "
|
|
"hole_number, gross_strokes) VALUES ($1, $2, 'a', $3, 1, 4)",
|
|
org_id, match_id, mp_a,
|
|
)
|
|
await conn.execute(
|
|
"INSERT INTO hole_score (organization_id, match_id, team_side, match_participant_id, "
|
|
"hole_number, gross_strokes) VALUES ($1, $2, 'b', $3, 1, 5)",
|
|
org_id, match_id, mp_b,
|
|
)
|
|
|
|
user = CurrentUser(user_id=owner_id)
|
|
await delete_tournament(tournament_id, organization_id=org_id, user=user)
|
|
|
|
async with app_db.org_connection(org_id) as conn:
|
|
assert await conn.fetchval("SELECT EXISTS(SELECT 1 FROM tournament WHERE id = $1)", tournament_id) is False
|
|
assert await conn.fetchval("SELECT count(*) FROM session WHERE tournament_id = $1", tournament_id) == 0
|
|
assert await conn.fetchval("SELECT count(*) FROM match WHERE id = $1", match_id) == 0
|
|
assert await conn.fetchval("SELECT count(*) FROM match_participant WHERE match_id = $1", match_id) == 0
|
|
assert await conn.fetchval("SELECT count(*) FROM hole_score WHERE match_id = $1", match_id) == 0
|
|
assert await conn.fetchval("SELECT count(*) FROM team_roster WHERE team_id = $1", team_a) == 0
|
|
assert await conn.fetchval("SELECT count(*) FROM team WHERE tournament_id = $1", tournament_id) == 0
|
|
# Spillerne selv (org-scopet spillerpool) skal IKKE slettes -- kun
|
|
# turneringens egne koblinger til dem.
|
|
assert await conn.fetchval("SELECT EXISTS(SELECT 1 FROM player WHERE id = $1)", player_a) is True
|
|
|
|
|
|
async def test_delete_individual_tournament_with_real_rounds_and_scores(pool):
|
|
org_id = await create_org()
|
|
owner_id = await create_user()
|
|
await add_membership(org_id, owner_id, role="owner")
|
|
tournament_id = await create_tournament(org_id)
|
|
course_id = await create_course(org_id)
|
|
for n in range(1, 19):
|
|
await create_org_hole(org_id, course_id, hole_number=n)
|
|
tee_id = await create_tee(org_id, course_id)
|
|
round_id = await create_tournament_round(org_id, tournament_id, course_id)
|
|
player_id = await create_player(org_id)
|
|
tp_id = await create_tournament_participant(org_id, tournament_id, player_id)
|
|
rp_id = await create_tournament_round_participant(org_id, round_id, tp_id, tee_id)
|
|
|
|
async with app_db.org_connection(org_id) as conn:
|
|
await conn.execute(
|
|
"INSERT INTO tournament_round_hole (organization_id, tournament_round_participant_id, "
|
|
"hole_number, gross_strokes) VALUES ($1, $2, 1, 4)",
|
|
org_id, rp_id,
|
|
)
|
|
# Utslagsgruppe (migrasjon 084) MED en deltaker faktisk koblet på --
|
|
# egen RESTRICT-FK (tournament_round_participant.tournament_round_
|
|
# group_id), samme klasse fallgruve som match_participant.team_
|
|
# roster_id over. Deltaker slettes FØR runden (og dermed gruppen,
|
|
# som kaskaderer fra runden) -- se delete_tournament sin kommentar.
|
|
group_id = await conn.fetchval(
|
|
"INSERT INTO tournament_round_group (organization_id, tournament_round_id, sequence) "
|
|
"VALUES ($1, $2, 1) RETURNING id",
|
|
org_id, round_id,
|
|
)
|
|
await conn.execute(
|
|
"UPDATE tournament_round_participant SET tournament_round_group_id = $1 WHERE id = $2",
|
|
group_id, rp_id,
|
|
)
|
|
|
|
user = CurrentUser(user_id=owner_id)
|
|
await delete_tournament(tournament_id, organization_id=org_id, user=user)
|
|
|
|
async with app_db.org_connection(org_id) as conn:
|
|
assert await conn.fetchval("SELECT EXISTS(SELECT 1 FROM tournament WHERE id = $1)", tournament_id) is False
|
|
assert await conn.fetchval("SELECT count(*) FROM tournament_round WHERE tournament_id = $1", tournament_id) == 0
|
|
assert await conn.fetchval("SELECT count(*) FROM tournament_participant WHERE tournament_id = $1", tournament_id) == 0
|
|
assert await conn.fetchval(
|
|
"SELECT count(*) FROM tournament_round_participant WHERE tournament_round_id = $1", round_id
|
|
) == 0
|
|
assert await conn.fetchval(
|
|
"SELECT count(*) FROM tournament_round_hole WHERE tournament_round_participant_id = $1", rp_id
|
|
) == 0
|
|
assert await conn.fetchval(
|
|
"SELECT count(*) FROM tournament_round_group WHERE tournament_round_id = $1", round_id
|
|
) == 0
|
|
|
|
|
|
async def test_delete_requires_org_admin_not_just_member(pool):
|
|
org_id = await create_org()
|
|
member_id = await create_user()
|
|
await add_membership(org_id, member_id, role="member")
|
|
tournament_id = await create_tournament(org_id)
|
|
|
|
user = CurrentUser(user_id=member_id)
|
|
with pytest.raises(HTTPException) as exc_info:
|
|
await delete_tournament(tournament_id, organization_id=org_id, user=user)
|
|
assert exc_info.value.status_code == 403
|
|
|
|
async with app_db.org_connection(org_id) as conn:
|
|
assert await conn.fetchval("SELECT EXISTS(SELECT 1 FROM tournament WHERE id = $1)", tournament_id) is True
|
|
|
|
|
|
async def test_delete_nonexistent_tournament_is_404(pool):
|
|
org_id = await create_org()
|
|
owner_id = await create_user()
|
|
await add_membership(org_id, owner_id, role="owner")
|
|
|
|
user = CurrentUser(user_id=owner_id)
|
|
with pytest.raises(HTTPException) as exc_info:
|
|
await delete_tournament("00000000-0000-0000-0000-000000000000", organization_id=org_id, user=user)
|
|
assert exc_info.value.status_code == 404
|