public async Task UpdateMatchRoundScoreInvalidMatch()
        {
            var session = await Login();

            using (var client = new HttpClient {
                BaseAddress = new Uri(ServerUrl)
            })
            {
                client.AcceptJson().AddSessionHeader(session.Id);

                // Update Round Score Match with Invalid Id
                var invalidMatchId = Guid.NewGuid();

                var matchRoundForm = new MatchRoundForm {
                    ActorId = session.Player.Id, RoundNumber = 1, Score = 10
                };

                var response = await client.PutAsJsonAsync($"/api/matches/{invalidMatchId}/rounds", matchRoundForm);

                Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);

                var content = await response.Content.ReadAsJsonAsync <ApiError>();

                Assert.Equal($"No such Match found.", content.Error);
            }
        }
        public async Task <IActionResult> UpdateMatchRoundScore([FromRoute] Guid id, [FromBody] MatchRoundForm form)
        {
            if (!ModelState.IsValid)
            {
                return(HttpResponseHelper.BadRequest(ModelState));
            }

            var match = await _context.Matches.Where(m => m.Id.Equals(id)).Include(m => m.Actors).FirstOrDefaultAsync();

            if (match == null)
            {
                return(HttpResponseHelper.NotFound("No such Match found."));
            }

            if (match.IsFinished)
            {
                return(HttpResponseHelper.BadRequest("This match is already finished."));
            }

            foreach (var actor in match.Actors.Where(actor => actor.ActorId.Equals(form.ActorId)))
            {
                var round =
                    await
                    _context.MatchRounds.Where(r => r.MatchActorId.Equals(actor.Id))
                    .Where(r => r.RoundNumber.Equals(form.RoundNumber))
                    .FirstOrDefaultAsync();

                if (round == null)
                {
                    return(HttpResponseHelper.NotFound($"No Round #{form.RoundNumber} found for Actor {form.ActorId}"));
                }

                _context.Entry(round).State = EntityState.Modified;
                round.Score     = form.Score;
                round.DateScore = DateTime.Now;

                var error = await SaveChangesAsync();

                if (error != null)
                {
                    return(error);
                }

                return
                    (Ok(
                         new MatchRoundScoreResponse
                {
                    RoundNumber = round.RoundNumber,
                    ActorId = round.MatchActor.ActorId,
                    Actor = round.MatchActor.Actor,
                    Score = round.Score,
                    DateScore = round.DateScore
                }));
            }

            return(HttpResponseHelper.NotFound($"No Actor {form.ActorId} found for this Match."));
        }
        public async Task UpdateMatchRoundScore()
        {
            var mayur = await Login();

            var matt = await Login("matt", "matt");

            using (var client = new HttpClient {
                BaseAddress = new Uri(ServerUrl)
            })
            {
                client.AcceptJson().AddSessionHeader(mayur.Id);

                var quickMatch = new QuickMatchActors
                {
                    Actors = new List <Guid>(new[] { mayur.Player.Id, matt.Player.Id })
                };

                var matchResponse = await client.PostAsJsonAsync("/api/matches/actors", quickMatch);

                Assert.Equal(HttpStatusCode.Created, matchResponse.StatusCode);

                var matchReturn = await matchResponse.Content.ReadAsStringAsync();

                var match = JsonConvert.DeserializeObject <Match>(matchReturn, Actor.JsonSerializerSettings());
                Assert.Equal(mayur.Player.Id, match.Tournament.OwnerId);
                Assert.False(match.IsFinished);
                Assert.False(match.IsDeleted);

                // Update Match Round Score with Valid Id
                // Player 1
                var matchRoundForm = new MatchRoundForm {
                    ActorId = mayur.Player.Id, RoundNumber = 1, Score = 10
                };
                var matchRoundsResponse = await client.PutAsJsonAsync($"/api/matches/{match.Id}/rounds", matchRoundForm);

                Assert.Equal(HttpStatusCode.OK, matchRoundsResponse.StatusCode);

                var matchRoundScore = await matchRoundsResponse.Content.ReadAsJsonAsync <MatchRoundScoreResponse>();

                Assert.Equal(matchRoundForm.Score, matchRoundScore.Score);
                Assert.Equal(matchRoundForm.ActorId, matchRoundScore.ActorId);

                // Player 2
                var matchRoundForm2 = new MatchRoundForm {
                    ActorId = matt.Player.Id, RoundNumber = 1, Score = 5
                };
                matchRoundsResponse = await client.PutAsJsonAsync($"/api/matches/{match.Id}/rounds", matchRoundForm2);

                matchRoundScore = await matchRoundsResponse.Content.ReadAsJsonAsync <MatchRoundScoreResponse>();

                Assert.Equal(matchRoundForm2.Score, matchRoundScore.Score);
                Assert.Equal(matchRoundForm2.ActorId, matchRoundScore.ActorId);
            }
        }
        public async Task UpdateMatchRoundScoreFinishedMatch()
        {
            var mayur = await Login();

            var matt = await Login("matt", "matt");

            using (var client = new HttpClient {
                BaseAddress = new Uri(ServerUrl)
            })
            {
                client.AcceptJson().AddSessionHeader(mayur.Id);

                var quickMatch = new QuickMatchActors
                {
                    Actors = new List <Guid>(new[] { mayur.Player.Id, matt.Player.Id })
                };

                var matchResponse = await client.PostAsJsonAsync("/api/matches/actors", quickMatch);

                Assert.Equal(HttpStatusCode.Created, matchResponse.StatusCode);

                var matchReturn = await matchResponse.Content.ReadAsStringAsync();

                var match = JsonConvert.DeserializeObject <Match>(matchReturn, Actor.JsonSerializerSettings());
                Assert.Equal(mayur.Player.Id, match.Tournament.OwnerId);
                Assert.False(match.IsFinished);
                Assert.False(match.IsDeleted);

                // Finish Match with Valid Id
                var response = await client.DeleteAsync($"/api/matches/{match.Id}");

                Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                var finishedMatch = await response.Content.ReadAsJsonAsync <Match>();

                Assert.True(finishedMatch.IsFinished);

                // Update Finished Match Round Score with Valid Id
                var matchRoundForm = new MatchRoundForm {
                    ActorId = mayur.Player.Id, RoundNumber = 1, Score = 10
                };
                var matchRoundsResponse = await client.PutAsJsonAsync($"/api/matches/{match.Id}/rounds", matchRoundForm);

                Assert.Equal(HttpStatusCode.BadRequest, matchRoundsResponse.StatusCode);

                var content = await matchRoundsResponse.Content.ReadAsJsonAsync <ApiError>();

                Assert.Equal($"This match is already finished.", content.Error);
            }
        }
        public async Task UpdateMatchRoundScoreInvalidRound()
        {
            var mayur = await Login();

            var matt = await Login("matt", "matt");

            using (var client = new HttpClient {
                BaseAddress = new Uri(ServerUrl)
            })
            {
                client.AcceptJson().AddSessionHeader(mayur.Id);

                var quickMatch = new QuickMatchActors
                {
                    Actors = new List <Guid>(new[] { mayur.Player.Id, matt.Player.Id })
                };

                var matchResponse = await client.PostAsJsonAsync("/api/matches/actors", quickMatch);

                Assert.Equal(HttpStatusCode.Created, matchResponse.StatusCode);

                var matchReturn = await matchResponse.Content.ReadAsStringAsync();

                var match = JsonConvert.DeserializeObject <Match>(matchReturn, Actor.JsonSerializerSettings());
                Assert.Equal(mayur.Player.Id, match.Tournament.OwnerId);
                Assert.False(match.IsFinished);
                Assert.False(match.IsDeleted);

                // Update Match Round Score with Invalid Round
                var invalidActorId = Guid.NewGuid();
                var matchRoundForm = new MatchRoundForm {
                    ActorId = invalidActorId, RoundNumber = 1, Score = 10
                };
                var matchRoundsResponse = await client.PutAsJsonAsync($"/api/matches/{match.Id}/rounds", matchRoundForm);

                Assert.Equal(HttpStatusCode.NotFound, matchRoundsResponse.StatusCode);

                var content = await matchRoundsResponse.Content.ReadAsJsonAsync <ApiError>();

                Assert.Equal($"No Actor {invalidActorId} found for this Match.", content.Error);
            }
        }