public async Task GetAllCharactersTest()
        {
            // Arrange
            var repo       = new FakeCharacterRepository(TestData.Characters());
            var controller = new CharactersController(repo, null);

            // Act
            var result = await controller.GetCharacter();

            // Assert
            Assert.IsNotNull(result);
            var objResult = result.Result as OkObjectResult;

            Assert.IsNotNull(objResult);
            var retResult = objResult.Value as List <CharacterDTO>;

            Assert.IsNotNull(retResult);
            Assert.AreEqual(TestData.Characters().Count, retResult.Count);
            foreach (var character in retResult)
            {
                var testItem = TestData.Characters().Find(c => c.Id == character.Id);
                Assert.AreEqual(testItem.IsActive, character.IsActive);
                Assert.AreEqual(testItem.Name, character.Name);
                Assert.AreEqual(testItem.PlayerId, character.PlayerId);
            }
        }
        public async Task GetCharacterTest()
        {
            // Arrange
            var repo       = new FakeCharacterRepository(TestData.Characters());
            var controller = new CharactersController(repo, null);
            var charId     = 1;

            // Act
            var result = await controller.GetCharacter(charId);

            // Assert
            Assert.IsNotNull(result);
            var testItem  = TestData.Characters().Find(c => c.Id == charId);
            var objResult = result.Result as OkObjectResult;

            Assert.IsNotNull(objResult);
            var retResult = objResult.Value as CharacterDTO;

            Assert.IsNotNull(retResult);
            Assert.AreEqual(testItem.Id, retResult.Id);
            Assert.AreEqual(testItem.IsActive, retResult.IsActive);
            Assert.AreEqual(testItem.IsRetired, retResult.IsRetired);
            Assert.AreEqual(testItem.Name, retResult.Name);
            Assert.AreEqual(testItem.PlayerId, retResult.PlayerId);
        }
        public async Task DeleteCharacterTest()
        {
            // Arrange
            var repo       = new FakeCharacterRepository(TestData.Characters());
            var controller = new CharactersController(repo, null);
            var charId     = 1;

            // Act
            var result = await controller.DeleteCharacter(charId);

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(charId, result.Value.Id);
        }
        public async Task GetCharacterNotFoundTest()
        {
            // Arrange
            var repo       = new FakeCharacterRepository(TestData.Characters());
            var controller = new CharactersController(repo, null);
            var charId     = 100;

            // Act
            var result = await controller.GetCharacter(charId);

            // Assert
            Assert.IsNotNull(result);
            var objResult = result.Result as NotFoundResult;

            Assert.IsNotNull(objResult);
        }
        public async Task PostCharacterInvalidTest()
        {
            // Arrange
            var repo       = new FakeCharacterRepository(TestData.Characters());
            var controller = new CharactersController(repo, null);
            var character  = new CharacterDTO {
                Id = 5, IsActive = true, IsRetired = false, PlayerId = 2, Name = ""
            };

            // Act
            var result = await controller.PostCharacter(character);

            // Assert
            Assert.IsNotNull(result);
            var objResult = result.Result as BadRequestObjectResult;

            Assert.IsNotNull(objResult);
        }
        public async Task PutCharacterTest()
        {
            // Arrange
            var repo       = new FakeCharacterRepository(TestData.Characters());
            var controller = new CharactersController(repo, NullLogger <CharactersController> .Instance);
            var charId     = 1;
            var character  = new CharacterDTO
            {
                Id        = charId,
                IsRetired = true,
                IsActive  = false,
                Name      = "NAME",
                PlayerId  = 1
            };

            // Act
            var result = await controller.PutCharacter(charId, character);

            // Assert
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(NoContentResult));
        }
        public async Task PostCharacterNoIdTest()
        {
            // Arrange
            var repo       = new FakeCharacterRepository(TestData.Characters());
            var controller = new CharactersController(repo, null);
            var character  = new CharacterDTO
            {
                Id = 5, IsActive = true, IsRetired = false, PlayerId = 2, Name = "Created Character"
            };

            // Act
            var result = await controller.PostCharacter(character);

            // Assert
            Assert.IsNotNull(result);
            var objResult = result.Result as CreatedAtActionResult;

            Assert.IsNotNull(objResult);
            var retResult = objResult.Value as CharacterDTO;

            Assert.IsNotNull(retResult);
            Assert.AreEqual(character, retResult);
        }
        public async Task PutCharacterNotFoundTest()
        {
            // Arrange
            var repo       = new FakeCharacterRepository(TestData.Characters());
            var controller = new CharactersController(repo, NullLogger <CharactersController> .Instance);
            var charId     = 100;
            var character  = new CharacterDTO
            {
                Id        = charId,
                IsRetired = true,
                IsActive  = false,
                Name      = "NAME",
                PlayerId  = 1
            };

            // Act
            var result = await controller.PutCharacter(charId, character);

            // Assert
            Assert.IsNotNull(result);
            var objResult = result as NotFoundResult;

            Assert.IsNotNull(objResult);
        }