async def test_update_calls_interact_with_game(backend: ConnectionBackend, interact_fails,
                                               expected_game, connected_game):
    # Setup
    backend.connector = None
    backend._world = True
    backend.set_expected_game(expected_game)

    if connected_game is not None:
        connector = AsyncMock()
        connector.game_enum = connected_game
    else:
        connector = None

    backend._interact_with_game = AsyncMock(side_effect=MemoryOperationException("err") if interact_fails else None)
    backend._identify_game = AsyncMock(return_value=connector)

    should_call_interact = connected_game is not None
    if should_call_interact:
        should_call_interact = (expected_game == connected_game) or (expected_game is None)

    # Run
    await backend.update(1)

    # Assert
    backend._identify_game.assert_awaited_once_with()
    if should_call_interact:
        backend._interact_with_game.assert_awaited_once_with(1)
        if interact_fails:
            assert backend._world is None
        else:
            assert backend._world is not None
    else:
        backend._interact_with_game.assert_not_awaited()
async def test_update(backend: ConnectionBackend, depth: int):
    # Setup
    # depth 0: not enabled
    # depth 1: can't connect
    # depth 2: call identify game
    # depth 3: don't call identify game

    connector = MagicMock()
    backend._enabled = depth > 0
    backend.executor.connect = AsyncMock(return_value=depth > 1)
    backend._expected_game = None
    backend._world = True
    backend._identify_game = AsyncMock(return_value=connector)
    backend._interact_with_game = AsyncMock()
    if depth == 3:
        backend.connector = connector

    # Run
    await backend.update(1)

    # Assert
    backend.executor.connect.assert_has_calls([call()] if depth > 0 else [])

    if depth == 2:
        backend._identify_game.assert_awaited_once_with()
        assert backend.connector == connector
    else:
        backend._identify_game.assert_not_awaited()

    if depth >= 2:
        backend._interact_with_game.assert_awaited_once_with(1)
    else:
        backend._interact_with_game.assert_not_awaited()
def test_current_status_in_game(backend: ConnectionBackend):
    backend.executor.is_connected.return_value = True
    backend.connector = True
    backend._world = True
    backend.checking_for_collected_index = True
    assert backend.current_status == GameConnectionStatus.InGame
def test_current_status_tracker_only(backend: ConnectionBackend):
    backend.executor.is_connected.return_value = True
    backend.connector = True
    backend._world = True
    assert backend.current_status == GameConnectionStatus.TrackerOnly