ScoreTab viste hele turneringsfeltet i stedet for brukerens egen utslagsgruppe. Defaulter nå til egen flight med "vis hele feltet"- veksling og fallback når gruppe mangler. is_self beregnes server-side (aldri rå user_id). Lukker et reelt RLS-hull på tournament_round_group funnet underveis (migrasjon 089). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
93 lines
3.8 KiB
Python
93 lines
3.8 KiB
Python
"""
|
|
Flight/gruppe-scoping i ScoreTab (ADR-099, 2026-08-21). list_round_participants
|
|
speiler nå ut tournament_round_group_id + is_self per rad, slik at frontend kan
|
|
la score-føringsskjermen default til brukerens egen utslagsgruppe i stedet for
|
|
hele feltet. is_self beregnes server-side (ikke rå user_id, samme is_mine-
|
|
mønster som rounds.py) for ikke å lekke andre spilleres kontokobling.
|
|
"""
|
|
|
|
from app.auth import CurrentUser
|
|
from app.routers.individual_tournaments import (
|
|
RoundGroupIn,
|
|
SaveRoundGroupsIn,
|
|
list_round_participants,
|
|
save_round_groups,
|
|
)
|
|
|
|
from tests.conftest import (
|
|
create_org,
|
|
create_course,
|
|
create_player,
|
|
create_tee,
|
|
create_tournament,
|
|
create_tournament_participant,
|
|
create_tournament_round,
|
|
create_tournament_round_participant,
|
|
create_user,
|
|
)
|
|
|
|
import app.db as app_db
|
|
|
|
|
|
async def _setup(org_id):
|
|
tournament_id = await create_tournament(org_id, name="Flight-scoping-turnering")
|
|
course_id = await create_course(org_id, name="Flight Links")
|
|
tee_id = await create_tee(org_id, course_id, name="Gul")
|
|
async with app_db.org_connection(org_id) as conn:
|
|
await conn.execute(
|
|
"UPDATE tournament SET format_type = 'individual', scoring_method = 'stroke_gross' WHERE id = $1",
|
|
tournament_id,
|
|
)
|
|
round_id = await create_tournament_round(org_id, tournament_id, course_id, sequence=1)
|
|
return tournament_id, round_id, tee_id
|
|
|
|
|
|
async def test_is_self_and_group_id_reflect_viewer_and_grouping(pool):
|
|
org_id = await create_org()
|
|
tournament_id, round_id, tee_id = await _setup(org_id)
|
|
|
|
me_user_id = await create_user()
|
|
other_user_id = await create_user()
|
|
|
|
me_player_id = await create_player(org_id, display_name="Meg Selv", user_id=me_user_id)
|
|
other_player_id = await create_player(org_id, display_name="En Annen", user_id=other_user_id)
|
|
|
|
me_tp_id = await create_tournament_participant(org_id, tournament_id, me_player_id)
|
|
other_tp_id = await create_tournament_participant(org_id, tournament_id, other_player_id)
|
|
|
|
me_rp_id = await create_tournament_round_participant(org_id, round_id, me_tp_id, tee_id)
|
|
other_rp_id = await create_tournament_round_participant(org_id, round_id, other_tp_id, tee_id)
|
|
|
|
# Ingen gruppe satt ennå -- begge rader skal ha tournament_round_group_id=None.
|
|
ungrouped = await list_round_participants(
|
|
tournament_id, round_id, organization_id=org_id, user=CurrentUser(user_id=me_user_id),
|
|
)
|
|
by_id = {rp.id: rp for rp in ungrouped}
|
|
assert by_id[me_rp_id].tournament_round_group_id is None
|
|
assert by_id[other_rp_id].tournament_round_group_id is None
|
|
assert by_id[me_rp_id].is_self is True
|
|
assert by_id[other_rp_id].is_self is False
|
|
|
|
# Grupper begge i samme gruppe -- gruppe-id skal nå matche på begge rader,
|
|
# og is_self skal fortsatt kun være sann for den innloggede brukeren.
|
|
await save_round_groups(
|
|
tournament_id, round_id,
|
|
SaveRoundGroupsIn(groups=[RoundGroupIn(sequence=1, round_participant_ids=[me_rp_id, other_rp_id])]),
|
|
organization_id=org_id,
|
|
)
|
|
grouped = await list_round_participants(
|
|
tournament_id, round_id, organization_id=org_id, user=CurrentUser(user_id=me_user_id),
|
|
)
|
|
by_id = {rp.id: rp for rp in grouped}
|
|
assert by_id[me_rp_id].tournament_round_group_id is not None
|
|
assert by_id[me_rp_id].tournament_round_group_id == by_id[other_rp_id].tournament_round_group_id
|
|
assert by_id[me_rp_id].is_self is True
|
|
assert by_id[other_rp_id].is_self is False
|
|
|
|
# Sett fra den ANDRE brukerens perspektiv: is_self bytter side.
|
|
as_other = await list_round_participants(
|
|
tournament_id, round_id, organization_id=org_id, user=CurrentUser(user_id=other_user_id),
|
|
)
|
|
by_id = {rp.id: rp for rp in as_other}
|
|
assert by_id[me_rp_id].is_self is False
|
|
assert by_id[other_rp_id].is_self is True
|