Skip to content

Commit

Permalink
Refactor player_factory to generate connection mocks with spec or aut…
Browse files Browse the repository at this point in the history
…ospec
  • Loading branch information
Askaholic committed Feb 21, 2021
1 parent 00ba8be commit 3e527bb
Show file tree
Hide file tree
Showing 9 changed files with 83 additions and 75 deletions.
15 changes: 12 additions & 3 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ def make_player(
ladder_rating=None,
global_games=0,
ladder_games=0,
with_lobby_connection=False,
lobby_connection_spec=None,
**kwargs
):
ratings = {k: v for k, v in {
Expand All @@ -167,10 +167,19 @@ def make_player(
p = Player(login=login, ratings=ratings, game_count=games, **kwargs)
p.state = state

if with_lobby_connection:
if lobby_connection_spec:
if not isinstance(lobby_connection_spec, str):
conn = mock.Mock(spec=lobby_connection_spec)
elif lobby_connection_spec == "mock":
conn = mock.Mock(spec=LobbyConnection)
elif lobby_connection_spec == "auto":
conn = asynctest.create_autospec(LobbyConnection)
else:
raise ValueError(f"Unknown spec type '{lobby_connection_spec}'")

# lobby_connection is a weak reference, but we want the mock
# to live for the full lifetime of the player object
p.__owned_lobby_connection = asynctest.create_autospec(LobbyConnection)
p.__owned_lobby_connection = conn
p.lobby_connection = p.__owned_lobby_connection
p.lobby_connection.player = p

Expand Down
2 changes: 1 addition & 1 deletion tests/unit_tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ def add(gameobj: Game, n: int, team: int = None):
player_id=i+1,
login=f"Player {i + 1}",
global_rating=(1500, 500),
with_lobby_connection=False
lobby_connection_spec=None
)
players.append(p)

Expand Down
2 changes: 0 additions & 2 deletions tests/unit_tests/test_game_rating.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ def add_players_with_rating(player_factory, game, ratings, teams):
player_id=i,
global_rating=rating,
ladder_rating=rating,
with_lobby_connection=False,
),
team,
)
Expand Down Expand Up @@ -857,7 +856,6 @@ async def test_single_wrong_report_still_rated_correctly(game: Game, player_fact
login=f"{player_id}",
player_id=player_id,
global_rating=Rating(old_rating, 250),
with_lobby_connection=False,
)
for team in log_dict["teams"].values()
for player_id in team
Expand Down
95 changes: 52 additions & 43 deletions tests/unit_tests/test_ladder_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from hypothesis import given, settings
from hypothesis import strategies as st

from server import GameService, LadderService
from server import GameService, LadderService, LobbyConnection
from server.db.models import matchmaker_queue, matchmaker_queue_map_pool
from server.games import LadderGame
from server.ladder_service import game_name
Expand Down Expand Up @@ -97,8 +97,8 @@ async def test_load_from_database_new_data(ladder_service, database):

@pytest.mark.filterwarnings("ignore:.*uses the '.*' fixture")
@given(
player1=st_players(player_id=1),
player2=st_players(player_id=2)
player1=st_players(player_id=1, lobby_connection_spec="mock"),
player2=st_players(player_id=2, lobby_connection_spec="mock")
)
@settings(deadline=300)
async def test_start_game_1v1(
Expand All @@ -114,8 +114,9 @@ async def test_start_game_1v1(
monkeypatch.setattr(LadderGame, "wait_launched", CoroutineMock())
monkeypatch.setattr(LadderGame, "timeout_game", CoroutineMock())
for player in (player1, player2):
player.__owned_lobby_connection = mock.Mock(launch_game=CoroutineMock())
player.lobby_connection = player.__owned_lobby_connection
player.lobby_connection.launch_game = CoroutineMock(
spec=LobbyConnection.launch_game
)

await ladder_service.start_game([player1], [player2], queue)

Expand All @@ -137,8 +138,8 @@ async def test_start_game_timeout(
player_factory,
):
queue = ladder_service.queues["ladder1v1"]
p1 = player_factory("Dostya", player_id=1, with_lobby_connection=True)
p2 = player_factory("Rhiza", player_id=2, with_lobby_connection=True)
p1 = player_factory("Dostya", player_id=1, lobby_connection_spec="auto")
p2 = player_factory("Rhiza", player_id=2, lobby_connection_spec="auto")

await ladder_service.start_game([p1], [p2], queue)

Expand All @@ -153,10 +154,10 @@ async def test_start_game_timeout(

@pytest.mark.filterwarnings("ignore:.*uses the '.*' fixture")
@given(
player1=st_players(player_id=1),
player2=st_players(player_id=2),
player3=st_players(player_id=3),
player4=st_players(player_id=4)
player1=st_players(player_id=1, lobby_connection_spec="mock"),
player2=st_players(player_id=2, lobby_connection_spec="mock"),
player3=st_players(player_id=3, lobby_connection_spec="mock"),
player4=st_players(player_id=4, lobby_connection_spec="mock")
)
@settings(deadline=300)
async def test_start_game_with_teams(
Expand All @@ -174,8 +175,9 @@ async def test_start_game_with_teams(
monkeypatch.setattr(LadderGame, "wait_launched", CoroutineMock())
monkeypatch.setattr(LadderGame, "timeout_game", CoroutineMock())
for player in (player1, player2, player3, player4):
player.__owned_lobby_connection = mock.Mock(launch_game=CoroutineMock())
player.lobby_connection = player.__owned_lobby_connection
player.lobby_connection.launch_game = CoroutineMock(
spec=LobbyConnection.launch_game
)

await ladder_service.start_game(
[player1, player3],
Expand Down Expand Up @@ -258,7 +260,7 @@ async def test_write_rating_progress(ladder_service: LadderService, player_facto
"Dostya",
player_id=1,
ladder_rating=(1500, 500),
with_lobby_connection=True
lobby_connection_spec="auto"
)

ladder_service.write_rating_progress(p1, RatingType.LADDER_1V1)
Expand Down Expand Up @@ -287,15 +289,13 @@ async def test_search_info_message(
p1 = player_factory(
"Dostya",
player_id=1,
ladder_rating=(1000, 10),
with_lobby_connection=True
ladder_rating=(1000, 10)
)
p1.write_message = CoroutineMock()
p2 = player_factory(
"Rhiza",
player_id=2,
ladder_rating=(1000, 10),
with_lobby_connection=True
ladder_rating=(1000, 10)
)
p2.write_message = CoroutineMock()

Expand Down Expand Up @@ -354,9 +354,7 @@ async def test_start_search_multiqueue(
):
ladder_service.queues["tmm2v2"] = queue_factory("tmm2v2")

p1 = player_factory(
"Dostya", ladder_rating=(1000, 10), with_lobby_connection=True
)
p1 = player_factory("Dostya", ladder_rating=(1000, 10))

ladder_service.start_search([p1], "ladder1v1")
await exhaust_callbacks(event_loop)
Expand Down Expand Up @@ -387,15 +385,13 @@ async def test_start_search_multiqueue_multiple_players(
p1 = player_factory(
"Dostya",
player_id=1,
ladder_rating=(1000, 10),
with_lobby_connection=True
ladder_rating=(1000, 10)
)

p2 = player_factory(
"Brackman",
player_id=2,
ladder_rating=(1000, 10),
with_lobby_connection=True
ladder_rating=(1000, 10)
)

ladder_service.start_search([p1, p2], "ladder1v1")
Expand Down Expand Up @@ -440,15 +436,13 @@ async def test_game_start_cancels_search(
p1 = player_factory(
"Dostya",
player_id=1,
ladder_rating=(1000, 10),
with_lobby_connection=True
ladder_rating=(1000, 10)
)

p2 = player_factory(
"Brackman",
player_id=2,
ladder_rating=(1000, 10),
with_lobby_connection=True
ladder_rating=(1000, 10)
)
ladder_service.start_search([p1], "ladder1v1")
ladder_service.start_search([p2], "ladder1v1")
Expand Down Expand Up @@ -481,15 +475,13 @@ async def test_on_match_found_sets_player_state(
p1 = player_factory(
"Dostya",
player_id=1,
ladder_rating=(1000, 10),
with_lobby_connection=True
ladder_rating=(1000, 10)
)

p2 = player_factory(
"Brackman",
player_id=2,
ladder_rating=(1000, 10),
with_lobby_connection=True
ladder_rating=(1000, 10)
)
ladder_service.start_search([p1], "ladder1v1")
ladder_service.start_search([p2], "ladder1v1")
Expand All @@ -513,7 +505,12 @@ async def test_start_and_cancel_search(
player_factory,
event_loop
):
p1 = player_factory("Dostya", player_id=1, ladder_rating=(1500, 500), ladder_games=0)
p1 = player_factory(
"Dostya",
player_id=1,
ladder_rating=(1500, 500),
ladder_games=0
)

ladder_service.start_search([p1], "ladder1v1")
await exhaust_callbacks(event_loop)
Expand All @@ -538,8 +535,7 @@ async def test_start_search_cancels_previous_search(
"Dostya",
player_id=1,
ladder_rating=(1500, 500),
ladder_games=0,
with_lobby_connection=True
ladder_games=0
)

ladder_service.start_search([p1], "ladder1v1")
Expand All @@ -561,7 +557,12 @@ async def test_start_search_cancels_previous_search(

async def test_cancel_all_searches(ladder_service: LadderService,
player_factory, event_loop):
p1 = player_factory(login="Dostya", player_id=1, ladder_rating=(1500, 500), ladder_games=0)
p1 = player_factory(
"Dostya",
player_id=1,
ladder_rating=(1500, 500),
ladder_games=0
)

ladder_service.start_search([p1], "ladder1v1")
await exhaust_callbacks(event_loop)
Expand All @@ -579,8 +580,18 @@ async def test_cancel_all_searches(ladder_service: LadderService,


async def test_cancel_twice(ladder_service: LadderService, player_factory):
p1 = player_factory(login="Dostya", player_id=1, ladder_rating=(1500, 500), ladder_games=0)
p2 = player_factory(login="Brackman", player_id=2, ladder_rating=(2000, 500), ladder_games=0)
p1 = player_factory(
"Dostya",
player_id=1,
ladder_rating=(1500, 500),
ladder_games=0
)
p2 = player_factory(
"Brackman",
player_id=2,
ladder_rating=(2000, 500),
ladder_games=0
)

ladder_service.start_search([p1], "ladder1v1")
search = ladder_service._searches[p1]["ladder1v1"]
Expand All @@ -603,15 +614,13 @@ async def test_start_game_called_on_match(ladder_service: LadderService, player_
"Dostya",
player_id=1,
ladder_rating=(2300, 64),
ladder_games=0,
with_lobby_connection=True
ladder_games=0
)
p2 = player_factory(
"QAI",
player_id=2,
ladder_rating=(2350, 125),
ladder_games=0,
with_lobby_connection=True
ladder_games=0
)

ladder_service.start_game = CoroutineMock()
Expand Down
18 changes: 9 additions & 9 deletions tests/unit_tests/test_lobbyconnection.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def test_game_info_invalid():

@pytest.fixture
def mock_player(player_factory):
return player_factory("Dummy", player_id=42, with_lobby_connection=False)
return player_factory("Dummy", player_id=42, lobby_connection_spec=None)


@pytest.fixture
Expand Down Expand Up @@ -197,7 +197,7 @@ async def test_command_create_account_returns_error(lobbyconnection):

async def test_double_login(lobbyconnection, mock_players, player_factory):
lobbyconnection.check_policy_conformity = CoroutineMock(return_value=True)
old_player = player_factory(with_lobby_connection=True)
old_player = player_factory(lobby_connection_spec="auto")
old_player.lobby_connection.player = old_player
mock_players.get_player.return_value = old_player

Expand All @@ -219,7 +219,7 @@ async def test_double_login(lobbyconnection, mock_players, player_factory):
async def test_double_login_disconnected(lobbyconnection, mock_players, player_factory):
lobbyconnection.abort = CoroutineMock()
lobbyconnection.check_policy_conformity = CoroutineMock(return_value=True)
old_player = player_factory(with_lobby_connection=True)
old_player = player_factory(lobby_connection_spec="auto")
mock_players.get_player.return_value = old_player

old_player.lobby_connection.send_warning.side_effect = DisconnectedError("Test disconnect")
Expand Down Expand Up @@ -552,7 +552,7 @@ async def test_coop_list(mocker, lobbyconnection):
async def test_command_admin_closelobby(mocker, lobbyconnection, player_factory):
player = lobbyconnection.player
player.id = 1
tuna = player_factory("Tuna", player_id=55, with_lobby_connection=True)
tuna = player_factory("Tuna", player_id=55, lobby_connection_spec="auto")
data = {
player.id: player,
tuna.id: tuna
Expand All @@ -571,7 +571,7 @@ async def test_command_admin_closelobby(mocker, lobbyconnection, player_factory)
async def test_command_admin_closeFA(lobbyconnection, player_factory):
player = lobbyconnection.player
player.id = 1
tuna = player_factory("Tuna", player_id=55, with_lobby_connection=True)
tuna = player_factory("Tuna", player_id=55, lobby_connection_spec="auto")
data = {
player.id: player,
tuna.id: tuna
Expand Down Expand Up @@ -716,7 +716,7 @@ async def test_broadcast(lobbyconnection: LobbyConnection, player_factory):
player = lobbyconnection.player
player.lobby_connection = lobbyconnection
player.id = 1
tuna = player_factory("Tuna", player_id=55, with_lobby_connection=True)
tuna = player_factory("Tuna", player_id=55, lobby_connection_spec="auto")
data = {
player.id: player,
tuna.id: tuna
Expand All @@ -741,7 +741,7 @@ async def test_broadcast_during_disconnect(lobbyconnection: LobbyConnection, pla
# To simulate when a player has been recently disconnected so that they
# still appear in the player_service list, but their lobby_connection
# object has already been destroyed
tuna = player_factory("Tuna", player_id=55, with_lobby_connection=False)
tuna = player_factory("Tuna", player_id=55, lobby_connection_spec="auto")
data = {
player.id: player,
tuna.id: tuna
Expand All @@ -763,7 +763,7 @@ async def test_broadcast_connection_error(lobbyconnection: LobbyConnection, play
player = lobbyconnection.player
player.lobby_connection = lobbyconnection
player.id = 1
tuna = player_factory("Tuna", player_id=55, with_lobby_connection=True)
tuna = player_factory("Tuna", player_id=55, lobby_connection_spec="auto")
tuna.lobby_connection.write_warning.side_effect = DisconnectedError("Some error")
data = {
player.id: player,
Expand Down Expand Up @@ -934,7 +934,7 @@ async def test_command_game_matchmaking_not_party_owner(
mock_player,
player_factory
):
party_owner = player_factory(player_id=2, with_lobby_connection=False)
party_owner = player_factory(player_id=2, lobby_connection_spec="auto")
party = PlayerParty(party_owner)
party.add_player(mock_player)
lobbyconnection.player.id = 1
Expand Down

0 comments on commit 3e527bb

Please sign in to comment.