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)
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")