public async Task UpdateGroupPlayer_ExistingAdmin()
        {
            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 currentSeed = Guid.NewGuid();
                var form = new GroupFrom
                {
                    Name = $"Test.{currentSeed}",
                    Type = GroupVisibility.Invisible,
                    Players = new List<Guid> { mayur.Player.Id, matt.Player.Id }
                };

                // Create Group with valid Players
                var groupResponse = await client.PostAsJsonAsync($"/api/groups", form);
                Assert.Equal(HttpStatusCode.Created, groupResponse.StatusCode);

                var group = await groupResponse.Content.ReadAsJsonAsync<Group>();
                Assert.IsType(typeof(Group), group);
                Assert.Equal(mayur.Player.Id, group.AdminId);

                var updateForm = new GroupFrom();

                // Update Group Players with Same Admin
                groupResponse =
                    await client.PutAsJsonAsync($"/api/groups/{group.Id}/players/{mayur.Player.Id}/admin", updateForm);
                Assert.Equal(HttpStatusCode.BadRequest, groupResponse.StatusCode);

                var content = await groupResponse.Content.ReadAsJsonAsync<ApiError>();
                Assert.Equal($"You are already Admin of this Group.", content.Error);
            }
        }
        public async Task DisableGroup()
        {
            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 currentSeed = Guid.NewGuid();
                var form = new GroupFrom
                {
                    Name = $"Test.{currentSeed}",
                    Type = GroupVisibility.Invisible,
                    Players = new List<Guid> { mayur.Player.Id, matt.Player.Id }
                };

                // Create Group with valid Players
                var groupResponse = await client.PostAsJsonAsync($"/api/groups", form);
                Assert.Equal(HttpStatusCode.Created, groupResponse.StatusCode);

                var group = await groupResponse.Content.ReadAsJsonAsync<Group>();
                Assert.IsType(typeof(Group), group);
                Assert.Equal(mayur.Player.Id, group.AdminId);

                // Get Group with valid id
                groupResponse = await client.DeleteAsync($"/api/groups/{group.Id}");
                Assert.Equal(HttpStatusCode.OK, groupResponse.StatusCode);

                var response = await groupResponse.Content.ReadAsJsonAsync<Group>();
                Assert.IsType(typeof(Group), response);
                Assert.Equal(group.Id, response.Id);
                Assert.False(response.IsEnabled);
            }
        }
        public async Task UpdateGroupPlayer_RemoveExistingPlayer()
        {
            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 currentSeed = Guid.NewGuid();
                var form = new GroupFrom
                {
                    Name = $"Test.{currentSeed}",
                    Type = GroupVisibility.Invisible,
                    Players = new List<Guid> { mayur.Player.Id, matt.Player.Id }
                };

                // Create Group with valid Players
                var groupResponse = await client.PostAsJsonAsync($"/api/groups", form);
                Assert.Equal(HttpStatusCode.Created, groupResponse.StatusCode);

                var group = await groupResponse.Content.ReadAsJsonAsync<Group>();
                Assert.IsType(typeof(Group), group);
                Assert.Equal(mayur.Player.Id, group.AdminId);

                var updateForm = new GroupFrom();

                // Update Group Players with Remove Existing Player
                groupResponse =
                    await client.PutAsJsonAsync($"/api/groups/{group.Id}/players/{matt.Player.Id}/remove", updateForm);
                Assert.Equal(HttpStatusCode.OK, groupResponse.StatusCode);

                var response = await groupResponse.Content.ReadAsJsonAsync<Group>();
                Assert.IsType(typeof(Group), response);
                Assert.Equal(group.Id, response.Id);
                Assert.Equal($"Test.{currentSeed}", response.Username);
                Assert.Equal(1, response.Players.Count);
            }
        }
        public async Task UpdateGroupPlayer_WithInvalidGroup()
        {
            var session = await Login();

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

                var form = new GroupFrom();

                // Update Group Players with Invalid Group Id
                var invalidId = Guid.NewGuid();
                var groupResponse = await client.PutAsJsonAsync($"/api/groups/{invalidId}/players/{invalidId}", form);
                Assert.Equal(HttpStatusCode.NotFound, groupResponse.StatusCode);

                var content = await groupResponse.Content.ReadAsJsonAsync<ApiError>();
                Assert.Equal("No Group found.", content.Error);
            }
        }
        public async Task CreateGroup_WithInvalidPlayers()
        {
            var session = await Login();

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

                var currentSeed = Guid.NewGuid();
                var invalidPlayer = Guid.NewGuid();
                var form = new GroupFrom
                {
                    Name = $"Test.{currentSeed}",
                    Players = new List<Guid> { session.Player.Id, invalidPlayer }
                };

                // Create Group with Invalid Players
                var groupResponse = await client.PostAsJsonAsync($"/api/groups", form);
                Assert.Equal(HttpStatusCode.NotFound, groupResponse.StatusCode);

                var content = await groupResponse.Content.ReadAsJsonAsync<ApiError>();
                Assert.Equal($"No Player with Id {invalidPlayer} exists.", content.Error);
            }
        }
        public async Task CreateGroup_WithNoPlayer()
        {
            var session = await Login();

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

                var currentSeed = Guid.NewGuid();
                var form = new GroupFrom { Name = $"Test.{currentSeed}", Players = new List<Guid>() };

                // Create Group with No Player
                var groupResponse = await client.PostAsJsonAsync($"/api/groups", form);
                Assert.Equal(HttpStatusCode.BadRequest, groupResponse.StatusCode);

                var content = await groupResponse.Content.ReadAsJsonAsync<ApiError>();
                Assert.Equal("Group requires minimum 1 Player.", content.Error);
            }
        }
        public async Task CreateGroup_WithExistingName()
        {
            var session = await Login();

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

                var form = new GroupFrom { Name = "rage" };

                // Create Group with existing Name
                var groupResponse = await client.PostAsJsonAsync($"/api/groups", form);
                Assert.Equal(HttpStatusCode.BadRequest, groupResponse.StatusCode);

                var content = await groupResponse.Content.ReadAsJsonAsync<ApiError>();
                Assert.Equal("Group with this name already exists.", content.Error);
            }
        }