public async Task <Game> Handle(JoinAnyGameCommand request, CancellationToken cancellationToken) { if (!GameTypeMetadata.All.TryGetValue(request.GameType, out var metadata)) { throw new ValidationException("Invalid game type"); } var player = new Player() { Id = _playerIdentity.Id, Name = _playerIdentity.Name, }; await _repository.CreatePlayerIfNotExistingAsync(player); await _gameAssert.NotTooManyOpenGamesAsync(); Game?waitingRoom; if (!request.IsOpen) { waitingRoom = await CreateGameAsync(request, metadata); } else { waitingRoom = await _repository.AddPlayerToGameAsync( request.GameType, request.MaxPlayers, request.Duration, new Game.Player() { Id = player.Id, Name = player.Name, AcceptedAt = DateTime.UtcNow }); if (waitingRoom == null) { waitingRoom = await CreateGameAsync(request, metadata); } } if (waitingRoom.Id == null) { throw new Exception("Since the game has been created an ID must be set"); } return(await _gameService.JoinAsync(waitingRoom)); }
public async Task Should_not_add_player_to_game_if_already_in() { var game = new GameBuilder() .FirstPlayerEinstein .CardBattle .Build(); await _repository.CreateGameAsync(game); // Act var fetchedGame = await _repository.AddPlayerToGameAsync(GameType.CardBattle, null, null, GameBuilder.Einstein); fetchedGame.Should().BeNull(); }