152 lines
6.1 KiB
Python
152 lines
6.1 KiB
Python
|
|
"""
|
||
|
|
Eclectic (org individuell turnering, ADR-067-tillegget "Del C", migrasjon
|
||
|
|
072) -- "drømmerunde" satt sammen av beste resultat per hull på tvers av
|
||
|
|
turneringens runder. Samme kall-direkte-mønster som
|
||
|
|
test_flag_plant_individual_tournament.py.
|
||
|
|
"""
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
from fastapi import HTTPException
|
||
|
|
|
||
|
|
from app.auth import CurrentUser
|
||
|
|
from app.routers.individual_tournaments import (
|
||
|
|
HoleUpdate,
|
||
|
|
TournamentRoundCreate,
|
||
|
|
create_round,
|
||
|
|
individual_leaderboard,
|
||
|
|
update_hole,
|
||
|
|
)
|
||
|
|
|
||
|
|
from tests.conftest import (
|
||
|
|
add_membership,
|
||
|
|
create_org,
|
||
|
|
create_org_hole,
|
||
|
|
create_course,
|
||
|
|
create_player,
|
||
|
|
create_tee,
|
||
|
|
create_tournament,
|
||
|
|
create_tournament_participant,
|
||
|
|
create_tournament_round,
|
||
|
|
create_tournament_round_participant,
|
||
|
|
create_user,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
async def _setup_eclectic_tournament(scoring_method: str = "eclectic_gross"):
|
||
|
|
org_id = await create_org()
|
||
|
|
user_id = await create_user()
|
||
|
|
await add_membership(org_id, user_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, par=4, stroke_index=n)
|
||
|
|
tee_id = await create_tee(org_id, course_id)
|
||
|
|
|
||
|
|
import app.db as app_db
|
||
|
|
async with app_db.org_connection(org_id) as conn:
|
||
|
|
await conn.execute(
|
||
|
|
"UPDATE tournament SET format_type = 'individual', scoring_method = $2 WHERE id = $1",
|
||
|
|
tournament_id, scoring_method,
|
||
|
|
)
|
||
|
|
|
||
|
|
round1_id = await create_tournament_round(org_id, tournament_id, course_id, sequence=1)
|
||
|
|
round2_id = await create_tournament_round(org_id, tournament_id, course_id, sequence=2)
|
||
|
|
player_id = await create_player(org_id, user_id=user_id)
|
||
|
|
tp_id = await create_tournament_participant(org_id, tournament_id, player_id)
|
||
|
|
# course_handicap=0 -- gjør netto/Stableford-tallene enkle å regne for hånd.
|
||
|
|
rp1_id = await create_tournament_round_participant(org_id, round1_id, tp_id, tee_id, course_handicap=0)
|
||
|
|
rp2_id = await create_tournament_round_participant(org_id, round2_id, tp_id, tee_id, course_handicap=0)
|
||
|
|
return org_id, user_id, tournament_id, round1_id, round2_id, rp1_id, rp2_id, tp_id
|
||
|
|
|
||
|
|
|
||
|
|
async def _play_hole(tournament_id, round_id, rp_id, hole_number, score, org_id, user):
|
||
|
|
await update_hole(
|
||
|
|
tournament_id, round_id, rp_id, hole_number,
|
||
|
|
HoleUpdate(gross_strokes=score),
|
||
|
|
organization_id=org_id, user=user,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
async def test_eclectic_gross_picks_best_per_hole_across_rounds(pool):
|
||
|
|
org_id, user_id, tournament_id, round1_id, round2_id, rp1_id, rp2_id, tp_id = (
|
||
|
|
await _setup_eclectic_tournament("eclectic_gross")
|
||
|
|
)
|
||
|
|
user = CurrentUser(user_id=user_id)
|
||
|
|
# Hull 1: runde 1 -> 5, runde 2 -> 6 (runde 1 vinner).
|
||
|
|
# Hull 2: runde 1 -> 6, runde 2 -> 4 (runde 2 vinner).
|
||
|
|
await _play_hole(tournament_id, round1_id, rp1_id, 1, 5, org_id, user)
|
||
|
|
await _play_hole(tournament_id, round1_id, rp1_id, 2, 6, org_id, user)
|
||
|
|
await _play_hole(tournament_id, round2_id, rp2_id, 1, 6, org_id, user)
|
||
|
|
await _play_hole(tournament_id, round2_id, rp2_id, 2, 4, org_id, user)
|
||
|
|
|
||
|
|
entries = await individual_leaderboard(tournament_id, organization_id=org_id)
|
||
|
|
entry = next(e for e in entries if e.tournament_participant_id == tp_id)
|
||
|
|
assert entry.eclectic_total == 5 + 4
|
||
|
|
holes_by_number = {h.hole_number: h for h in entry.eclectic_holes}
|
||
|
|
assert holes_by_number[1].value == 5
|
||
|
|
assert holes_by_number[1].round_number == 1
|
||
|
|
assert holes_by_number[2].value == 4
|
||
|
|
assert holes_by_number[2].round_number == 2
|
||
|
|
|
||
|
|
|
||
|
|
async def test_eclectic_net_subtracts_strokes_received(pool):
|
||
|
|
org_id, user_id, tournament_id, round1_id, round2_id, rp1_id, rp2_id, tp_id = (
|
||
|
|
await _setup_eclectic_tournament("eclectic_net")
|
||
|
|
)
|
||
|
|
user = CurrentUser(user_id=user_id)
|
||
|
|
await _play_hole(tournament_id, round1_id, rp1_id, 1, 5, org_id, user)
|
||
|
|
|
||
|
|
entries = await individual_leaderboard(tournament_id, organization_id=org_id)
|
||
|
|
entry = next(e for e in entries if e.tournament_participant_id == tp_id)
|
||
|
|
# course_handicap=0 -- ingen mottatte slag, netto == brutto.
|
||
|
|
assert entry.eclectic_total == 5
|
||
|
|
|
||
|
|
|
||
|
|
async def test_eclectic_stableford_picks_highest_points(pool):
|
||
|
|
org_id, user_id, tournament_id, round1_id, round2_id, rp1_id, rp2_id, tp_id = (
|
||
|
|
await _setup_eclectic_tournament("eclectic_stableford")
|
||
|
|
)
|
||
|
|
user = CurrentUser(user_id=user_id)
|
||
|
|
# Par 4, HCP 0: gross 4 -> netto par -> 2 poeng. gross 3 -> netto birdie -> 3 poeng.
|
||
|
|
await _play_hole(tournament_id, round1_id, rp1_id, 1, 4, org_id, user)
|
||
|
|
await _play_hole(tournament_id, round2_id, rp2_id, 1, 3, org_id, user)
|
||
|
|
|
||
|
|
entries = await individual_leaderboard(tournament_id, organization_id=org_id)
|
||
|
|
entry = next(e for e in entries if e.tournament_participant_id == tp_id)
|
||
|
|
assert entry.eclectic_total == 3
|
||
|
|
assert entry.eclectic_holes[0].round_number == 2
|
||
|
|
|
||
|
|
|
||
|
|
async def test_eclectic_rejects_round_on_different_course(pool):
|
||
|
|
org_id, user_id, tournament_id, round1_id, round2_id, rp1_id, rp2_id, tp_id = (
|
||
|
|
await _setup_eclectic_tournament("eclectic_gross")
|
||
|
|
)
|
||
|
|
other_course_id = await create_course(org_id)
|
||
|
|
for n in range(1, 19):
|
||
|
|
await create_org_hole(org_id, other_course_id, hole_number=n, par=4, stroke_index=n)
|
||
|
|
|
||
|
|
with pytest.raises(HTTPException) as exc_info:
|
||
|
|
await create_round(
|
||
|
|
tournament_id,
|
||
|
|
TournamentRoundCreate(sequence=3, course_id=other_course_id),
|
||
|
|
organization_id=org_id,
|
||
|
|
)
|
||
|
|
assert exc_info.value.status_code == 400
|
||
|
|
assert exc_info.value.detail["code"] == "VALIDATION_FAILED"
|
||
|
|
|
||
|
|
|
||
|
|
async def test_non_eclectic_tournament_allows_different_courses(pool):
|
||
|
|
org_id, user_id, tournament_id, round1_id, round2_id, rp1_id, rp2_id, tp_id = (
|
||
|
|
await _setup_eclectic_tournament("stroke_gross")
|
||
|
|
)
|
||
|
|
other_course_id = await create_course(org_id)
|
||
|
|
for n in range(1, 19):
|
||
|
|
await create_org_hole(org_id, other_course_id, hole_number=n, par=4, stroke_index=n)
|
||
|
|
|
||
|
|
result = await create_round(
|
||
|
|
tournament_id,
|
||
|
|
TournamentRoundCreate(sequence=3, course_id=other_course_id),
|
||
|
|
organization_id=org_id,
|
||
|
|
)
|
||
|
|
assert result.course_id == other_course_id
|