Beispiel #1
0
def test_game_session_admin_session_download_layout_description_no_spoiler(
        mock_layout_description: PropertyMock, clean_database,
        mock_emit_session_update, flask_app):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(
        id=1,
        name="Debug",
        state=GameSessionState.SETUP,
        creator=user1,
        layout_description_json="layout_description_json")
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=None,
                                          admin=False)
    sio = MagicMock()
    sio.get_current_user.return_value = user1
    mock_layout_description.return_value.permalink.spoiler = False

    # Run
    with pytest.raises(InvalidAction), flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.DOWNLOAD_LAYOUT_DESCRIPTION.value,
            None)

    # Assert
    mock_emit_session_update.assert_not_called()
    mock_layout_description.assert_called_once()
Beispiel #2
0
def test_game_session_admin_session_remove_layout_description(
        mock_emit_session_update: MagicMock, clean_database, flask_app):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(
        id=1,
        name="Debug",
        state=GameSessionState.SETUP,
        creator=user1,
        generation_in_progress=user1,
        layout_description_json="layout_description_json")
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=None,
                                          admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1

    # Run
    with flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.CHANGE_LAYOUT_DESCRIPTION.value,
            None)

    # Assert
    mock_emit_session_update.assert_called_once_with(session)
    assert database.GameSession.get_by_id(1).layout_description_json is None
    assert database.GameSession.get_by_id(1).generation_in_progress is None
Beispiel #3
0
def test_game_session_admin_session_change_layout_description_invalid(
        mock_emit_session_update: MagicMock, clean_database, other_user,
        flask_app):
    user1 = database.User.create(id=1234, name="The Name")
    user2 = database.User.create(id=1235, name="Other")
    session = database.GameSession.create(
        id=1,
        name="Debug",
        state=GameSessionState.SETUP,
        creator=user1,
        generation_in_progress=user2 if other_user else None)
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=None,
                                          admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1

    if other_user:
        expected_message = "Waiting for a layout from Other."
    else:
        expected_message = "Not waiting for a layout."

    # Run
    with pytest.raises(
            InvalidAction,
            match=expected_message), flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.CHANGE_LAYOUT_DESCRIPTION.value,
            "layout_description_json")

    # Assert
    mock_emit_session_update.assert_not_called()
    assert database.GameSession.get_by_id(1).layout_description_json is None
Beispiel #4
0
def test_game_session_admin_session_delete_row_invalid(
        mock_emit_session_update, clean_database, preset_manager, flask_app,
        not_last_row):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1,
                                          name="Debug",
                                          state=GameSessionState.SETUP,
                                          creator=user1)
    database.GameSessionPreset.create(session=session, row=0, preset="{}")
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=None,
                                          admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1
    if not_last_row:
        database.GameSessionPreset.create(session=session, row=1, preset="{}")
        expected_message = "Can only delete the last row"
        expected_num_rows = 2
    else:
        expected_message = "Can't delete row when there's only one"
        expected_num_rows = 1

    # Run
    with pytest.raises(InvalidAction) as e, flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.DELETE_ROW.value, 0)

    # Assert
    assert e.value.message == expected_message
    mock_emit_session_update.assert_not_called()
    assert database.GameSession.get_by_id(1).num_rows == expected_num_rows
Beispiel #5
0
def test_game_session_admin_session_change_row(
        mock_emit_session_update: MagicMock, clean_database, flask_app,
        preset_manager):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1,
                                          name="Debug",
                                          state=GameSessionState.SETUP,
                                          creator=user1)
    database.GameSessionPreset.create(session=session, row=0, preset="{}")
    database.GameSessionPreset.create(session=session, row=1, preset="{}")
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=None,
                                          admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1

    # Make sure the preset is using the latest version
    preset_manager.default_preset.ensure_converted()

    # Run
    with flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.CHANGE_ROW.value,
            (1, preset_manager.default_preset.as_json))

    # Assert
    mock_emit_session_update.assert_called_once_with(session)
    new_preset_row = database.GameSessionPreset.get(
        database.GameSessionPreset.session == session,
        database.GameSessionPreset.row == 1)
    assert json.loads(
        new_preset_row.preset) == preset_manager.default_preset.as_json
Beispiel #6
0
def test_game_session_admin_session_delete_row(
        mock_emit_session_update: MagicMock, clean_database, flask_app,
        preset_manager):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1,
                                          name="Debug",
                                          state=GameSessionState.SETUP,
                                          creator=user1)
    database.GameSessionPreset.create(session=session, row=0, preset="{}")
    database.GameSessionPreset.create(session=session, row=1, preset="{}")
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=None,
                                          admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1

    # Run
    with flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.DELETE_ROW.value, 1)

    # Assert
    mock_emit_session_update.assert_called_once_with(session)
    assert database.GameSession.get_by_id(1).num_rows == 1
Beispiel #7
0
def test_game_session_admin_session_change_password(clean_database,
                                                    mock_emit_session_update,
                                                    flask_app):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1,
                                          name="Debug",
                                          state=GameSessionState.SETUP,
                                          creator=user1)
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=0,
                                          admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1
    expected_password = '******'

    # Run
    with flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.CHANGE_PASSWORD.value,
            "the_password")

    # Assert
    mock_emit_session_update.assert_called_once_with(session)
    assert database.GameSession.get_by_id(1).password == expected_password
Beispiel #8
0
def test_game_session_admin_session_finish_session(clean_database,
                                                   mock_emit_session_update,
                                                   starting_state, flask_app):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1,
                                          name="Debug",
                                          state=starting_state,
                                          creator=user1)
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=0,
                                          admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1
    if starting_state != GameSessionState.IN_PROGRESS:
        expectation = pytest.raises(
            InvalidAction, match="Invalid Action: Session is not in progress")
    else:
        expectation = contextlib.nullcontext()

    # Run
    with expectation, flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.FINISH_SESSION.value, None)

    # Assert
    if starting_state != GameSessionState.IN_PROGRESS:
        mock_emit_session_update.assert_not_called()
        assert database.GameSession.get_by_id(1).state == starting_state
    else:
        mock_emit_session_update.assert_called_once_with(session)
        assert database.GameSession.get_by_id(
            1).state == GameSessionState.FINISHED
Beispiel #9
0
def test_game_session_admin_session_start_session(
        mock_session_description: PropertyMock, mock_emit_session_update,
        clean_database, preset_manager, flask_app):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1,
                                          name="Debug",
                                          state=GameSessionState.SETUP,
                                          creator=user1,
                                          layout_description_json="{}")
    database.GameSessionPreset.create(session=session, row=0, preset="{}")
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=0,
                                          admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1

    # Run
    with flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.START_SESSION.value, None)

    # Assert
    mock_emit_session_update.assert_called_once_with(session)
    assert database.GameSession.get_by_id(
        1).state == GameSessionState.IN_PROGRESS
Beispiel #10
0
def test_game_session_admin_session_change_layout_description(
        clean_database, preset_manager, mock_emit_session_update, mocker,
        flask_app):
    mock_verify_no_layout_description = mocker.patch(
        "randovania.server.game_session._verify_no_layout_description",
        autospec=True)
    mock_from_json_dict: MagicMock = mocker.patch(
        "randovania.layout.layout_description.LayoutDescription.from_json_dict"
    )

    preset_as_json = json.dumps(preset_manager.default_preset.as_json)
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1,
                                          name="Debug",
                                          state=GameSessionState.SETUP,
                                          creator=user1,
                                          generation_in_progress=user1)
    database.GameSessionPreset.create(session=session,
                                      row=0,
                                      preset=preset_as_json)
    database.GameSessionPreset.create(session=session,
                                      row=1,
                                      preset=preset_as_json)
    database.GameSessionMembership.create(user=user1,
                                          session=session,
                                          row=None,
                                          admin=True)

    new_preset = preset_manager.default_preset.get_preset()
    new_preset = dataclasses.replace(new_preset,
                                     configuration=dataclasses.replace(
                                         new_preset.configuration,
                                         menu_mod=False))

    sio = MagicMock()
    sio.get_current_user.return_value = user1
    layout_description = mock_from_json_dict.return_value
    layout_description.as_json = "some_json_string"
    layout_description.permalink.player_count = 2
    layout_description.permalink.presets = {i: new_preset for i in (0, 1)}

    # Run
    with flask_app.test_request_context():
        game_session.game_session_admin_session(
            sio, 1, SessionAdminGlobalAction.CHANGE_LAYOUT_DESCRIPTION.value,
            "layout_description_json")

    # Assert
    mock_emit_session_update.assert_called_once_with(session)
    mock_verify_no_layout_description.assert_called_once_with(session)
    assert database.GameSession.get_by_id(
        1).layout_description_json == '"some_json_string"'
    assert database.GameSession.get_by_id(1).generation_in_progress is None

    new_session = database.GameSession.get_by_id(1)
    new_json = json.dumps(VersionedPreset.with_preset(new_preset).as_json)
    assert [preset.preset for preset in new_session.presets] == [new_json] * 2
Beispiel #11
0
def test_game_session_admin_session_reset_session(clean_database, flask_app):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1, name="Debug", state=GameSessionState.SETUP, creator=user1)
    database.GameSessionMembership.create(user=user1, session=session, row=0, admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1

    # Run
    with pytest.raises(InvalidAction), flask_app.test_request_context():
        game_session.game_session_admin_session(sio, 1, SessionAdminGlobalAction.RESET_SESSION.value, None)
Beispiel #12
0
def test_game_session_admin_session_delete_session(mock_emit_session_update: MagicMock, flask_app, clean_database):
    user1 = database.User.create(id=1234, name="The Name")
    session = database.GameSession.create(id=1, name="Debug", state=GameSessionState.SETUP, creator=user1)
    database.GameSessionMembership.create(user=user1, session=session, row=None, admin=True)
    sio = MagicMock()
    sio.get_current_user.return_value = user1

    # Run
    with flask_app.test_request_context():
        game_session.game_session_admin_session(sio, 1, SessionAdminGlobalAction.DELETE_SESSION.value, None)

    # Assert
    mock_emit_session_update.assert_called_once_with(session)
    assert list(database.GameSession.select()) == []