def test_add_player(client: pymongo.MongoClient):
    room_code = next(unique_id)

    signing_key = "signing_key"
    environment.create_room(room_code, signing_key)

    alice_id = "0"
    alice_name = "Alice"

    bob_id = "1"
    bob_name = "Bob"

    assert environment.add_player(alice_name, room_code) == model.Player(
        alice_id, alice_name, room_code, signing_key)
    assert environment.add_player(bob_name, room_code) == model.Player(
        bob_id, bob_name, room_code, signing_key)

    assert client.mahjong.rooms.find_one({"_id": room_code})["players"] == {
        str(alice_id): {
            constants.player.ID: alice_id,
            constants.player.NAME: alice_name,
        },
        str(bob_id): {
            constants.player.ID: bob_id,
            constants.player.NAME: bob_name,
        },
    }
def test_negotiate_rejects_different_room_code(action: func.Out):
    player = model.Player("0", "player0", "ABCD", "SIGNING KEY")
    other_code = f"not {player.room_code}"
    json_request = {
        "roomCode": other_code,
        "playerDataToken": player.get_jwt()
    }
    with patch("__app__.utils.request.get_json") as get_json_mock:
        get_json_mock.return_value = json_request
        request = func.HttpRequest("POST",
                                   "/api/negotiate",
                                   body=json.dumps(json_request).encode())

        with patch("__app__.datastore.environment.get_room_signing_key"
                   ) as get_signing_key_mock:
            get_signing_key_mock.return_value = player.room_signing_key
            response = main(request, connection_info_json, action)

    get_json_mock.assert_called_once_with(request, (
        "playerDataToken",
        "roomCode",
    ))
    get_signing_key_mock.assert_called_once_with(other_code)
    action.set.assert_not_called()

    common.validate_response_fields(response,
                                    status_code=HTTPStatus.FORBIDDEN,
                                    mimetype="text/plain")
def test_negotiate_adds_player_to_group(action: func.Out):
    player = model.Player("0", "player0", "ABCD", "SIGNING KEY")
    json_request = {
        "roomCode": player.room_code,
        "playerDataToken": player.get_jwt()
    }
    with patch("__app__.utils.request.get_json") as get_json_mock:
        get_json_mock.return_value = json_request
        request = func.HttpRequest("POST",
                                   "/api/negotiate",
                                   body=json.dumps(json_request).encode())

        with patch("__app__.datastore.environment.get_room_signing_key"
                   ) as get_signing_key_mock:
            get_signing_key_mock.return_value = player.room_signing_key
            response = main(request, connection_info_json, action)

    get_json_mock.assert_called_once_with(request, (
        "playerDataToken",
        "roomCode",
    ))
    get_signing_key_mock.assert_called_once_with(player.room_code)
    action.set.assert_called_once_with(
        json.dumps({
            "userId": player.id,
            "groupName": player.room_code,
            "action": "add"
        }))

    common.validate_response_fields(response)
    assert common.get_json(response) == json.loads(connection_info_json)
Exemple #4
0
def add_player(player_name: str, room_code: str) -> model.Player:
    """Adds a player to an existing room and returns their player ID."""

    client = MongoClient(COSMOS_CONNECTION_STRING)
    rooms = client.mahjong.rooms

    room = rooms.find_one_and_update(
        {constants.room.ID: room_code},
        {"$inc": {
            constants.room.NEXT_PLAYER_ID: 1
        }},
        return_document=pymongo.ReturnDocument.BEFORE,
    )

    if room is None:
        raise UnknownRoomCode(room_code)

    player_id = str(room[constants.room.NEXT_PLAYER_ID])
    signing_key = room[constants.room.SIGNING_KEY]

    rooms.update_one(
        {constants.room.ID: room_code},
        {
            "$set": {
                f"{constants.room.PLAYERS}.{player_id}": {
                    constants.player.ID: player_id,
                    constants.player.NAME: player_name,
                }
            }
        },
    )

    return model.Player(player_id, player_name, room_code, signing_key)
def test_add_player():
    player_id = "0"
    player_name = "Alice"

    signing_key = "signing key"
    room_code = "ABCD"

    token = "token"

    json_request = {
        "name": player_name,
        "roomCode": room_code,
    }

    with patch("__app__.utils.request.get_json") as get_json_mock:
        get_json_mock.return_value = json_request

        with patch("__app__.create_room.datastore.environment.add_player"
                   ) as add_player_mock:
            add_player_mock.return_value = model.Player(
                player_id, player_name, room_code, signing_key)

            with patch("jwt.encode") as encode_mock:
                encode_mock.return_value = token.encode("utf-8")

                request = func.HttpRequest(
                    "POST",
                    "/api/add_player",
                    body=json.dumps(json_request).encode())

                response = main(request)

    get_json_mock.assert_called_once_with(request, (
        "name",
        "roomCode",
    ))
    add_player_mock.assert_called_once_with(player_name, room_code)
    encode_mock.assert_called_once_with(
        {
            "playerId": player_id,
            "playerName": player_name,
            "roomCode": room_code
        },
        signing_key,
        algorithm=model.Player.jwt_algorithm,
    )

    common.validate_response_fields(response)
    assert common.get_json(response) == {
        "playerId": player_id,
        "playerName": player_name,
        "roomCode": room_code,
        "playerDataToken": token,
    }
def test_add_player_catches_GetJsonError():
    player_id = "0"
    player_name = "Alice"

    signing_key = "signing key"
    room_code = "ABCD"

    token = "token"

    json_request = {
        "name": player_name,
        "roomCode": room_code,
    }

    with patch("__app__.utils.request.get_json") as get_json_mock:
        get_json_mock.side_effect = utils.request.GetJsonError

        with patch("__app__.create_room.datastore.environment.add_player"
                   ) as add_player_mock:
            add_player_mock.return_value = model.Player(
                player_id, player_name, room_code, signing_key)

            with patch("jwt.encode") as encode_mock:
                encode_mock.return_value = token.encode("utf-8")

                request = func.HttpRequest(
                    "POST",
                    "/api/add_player",
                    body=json.dumps(json_request).encode())

                response = main(request)

    get_json_mock.assert_called_once_with(request, (
        "name",
        "roomCode",
    ))

    common.validate_response_fields(response,
                                    status_code=HTTPStatus.BAD_REQUEST,
                                    mimetype="text/plain")