|
1 | 1 | from unittest import mock |
2 | 2 |
|
| 3 | +from sqlalchemy import select |
| 4 | + |
| 5 | +from server.db.models import avatars, login |
3 | 6 | from server.rating import RatingType |
4 | 7 |
|
5 | 8 |
|
@@ -67,18 +70,51 @@ async def test_fetch_player_data_non_existent(player_factory, player_service): |
67 | 70 | async def test_refresh_player_avatar_connected( |
68 | 71 | player_factory, player_service |
69 | 72 | ): |
70 | | - player = player_factory(player_id=50) |
| 73 | + # Player 51 owns avatars 1 (QAI) and 2 (UEF); make 1 the authoritative |
| 74 | + # selection via login.avatar_id while the legacy flag still points at 2. |
| 75 | + player = player_factory(player_id=51) |
71 | 76 | player.avatar = None # simulate stale (e.g. just connected) |
72 | | - player_service[50] = player |
| 77 | + player_service[51] = player |
| 78 | + async with player_service._db.acquire() as conn: |
| 79 | + await conn.execute(login.update().where(login.c.id == 51).values(avatar_id=1)) |
73 | 80 |
|
74 | | - refreshed = await player_service.refresh_player_avatar(50) |
| 81 | + refreshed = await player_service.refresh_player_avatar(51) |
75 | 82 |
|
76 | 83 | assert refreshed is True |
77 | 84 | assert player.avatar == { |
78 | | - "url": "https://content.faforever.com/faf/avatars/UEF.png", |
79 | | - "tooltip": "UEF", |
| 85 | + "url": "https://content.faforever.com/faf/avatars/qai2.png", |
| 86 | + "tooltip": "QAI", |
80 | 87 | } |
81 | 88 | assert player in player_service._dirty_players |
| 89 | + # the legacy `selected` flag is reconciled to the authoritative avatar |
| 90 | + async with player_service._db.acquire() as conn: |
| 91 | + result = await conn.execute( |
| 92 | + select(avatars.c.idAvatar, avatars.c.selected).where(avatars.c.idUser == 51) |
| 93 | + ) |
| 94 | + selected = {row.idAvatar: bool(row.selected) for row in result} |
| 95 | + assert selected == {1: True, 2: False} |
| 96 | + |
| 97 | + |
| 98 | +async def test_refresh_player_avatar_clears_legacy_fallback( |
| 99 | + player_factory, player_service |
| 100 | +): |
| 101 | + # Player 50 has a legacy selected avatar but no authoritative login.avatar_id, |
| 102 | + # which represents an explicit clear via the API. The refresh must not let the |
| 103 | + # legacy fallback resurrect it, and must clean the flag up. |
| 104 | + player = player_factory(player_id=50) |
| 105 | + player_service[50] = player |
| 106 | + |
| 107 | + refreshed = await player_service.refresh_player_avatar(50) |
| 108 | + |
| 109 | + assert refreshed is True |
| 110 | + assert player.avatar is None |
| 111 | + async with player_service._db.acquire() as conn: |
| 112 | + result = await conn.execute( |
| 113 | + select(avatars.c.selected).where(avatars.c.idUser == 50) |
| 114 | + ) |
| 115 | + selected = [bool(row.selected) for row in result] |
| 116 | + assert selected |
| 117 | + assert all(not is_selected for is_selected in selected) |
82 | 118 |
|
83 | 119 |
|
84 | 120 | async def test_refresh_player_avatar_not_connected(player_service): |
|
0 commit comments