public async Task Get_com_id_inexistente_deverá_retornar_NOTFOUND()
        {
            //Arrange
            var id = 4;
            var repo = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Get(id) as NotFoundResult;

            //Assert
            Assert.IsNotNull(result);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Get_deverá_retornar_todos_os_clientes()
        {
            //Arrange
            var repo       = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Get() as OkNegotiatedContentResult <List <Cliente> >;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(repo.Todos().Count(), result.Content.Count);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Get_deverá_retornar_todos_os_clientes()
        {
            //Arrange
            var repo = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Get() as OkNegotiatedContentResult<List<Cliente>>;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(repo.Todos().Count(), result.Content.Count);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Get_com_id_inexistente_deverá_retornar_NOTFOUND()
        {
            //Arrange
            var id         = 4;
            var repo       = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Get(id) as NotFoundResult;

            //Assert
            Assert.IsNotNull(result);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Get_com_id_deverá_retornar_o_cliente_desejado()
        {
            //Arrange
            var id = 1;
            var repo = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Get(id) as OkNegotiatedContentResult<Cliente>;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(repo.ObterPorId(id), result.Content);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Get_com_id_deverá_retornar_o_cliente_desejado()
        {
            //Arrange
            var id         = 1;
            var repo       = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Get(id) as OkNegotiatedContentResult <Cliente>;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(repo.ObterPorId(id), result.Content);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Post_deverá_falhar_qdo_o_cliente_for_nulo()
        {
            //Arrange
            Cliente cliente    = null;
            var     repo       = new ClienteRepositorioStub();
            var     controller = new ClientesController(repo);

            //Action
            var result = await controller.Post(cliente) as BadRequestErrorMessageResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Cliente não pode ser nulo", result.Message);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Put_deverá_falhar_qdo_o_param_id_for_diferente_do_cliente_id()
        {
            //Arrange
            var id         = 1;
            var repo       = new ClienteRepositorioStub();
            var cliente    = repo.ObterPorId(3);
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Put(id, cliente) as BadRequestErrorMessageResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Os id's não conferem", result.Message);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Put_deverá_atualizar_o_cliente_e_retornar_NoContent()
        {
            //Arrange
            var repo       = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);
            var cliente    = repo.ObterPorId(3);

            //Action
            var result = await controller.Put(cliente.Id, cliente) as StatusCodeResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(StatusCodeResult));
            Assert.AreEqual(HttpStatusCode.NoContent, result.StatusCode);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Post_deverá_falhar_qdo_o_cliente_já_possuir_um_Id()
        {
            //Arrange
            var cliente = new Cliente {
                Id = 1, Nome = "Novo Cliente", Sexo = CadCli.Dominio.Enums.Sexo.Masculino, Nascimento = new DateTime()
            };
            var repo       = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Post(cliente) as BadRequestErrorMessageResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Id do cliente inválido", result.Message);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Delete_deverá_excluir_o_cliente_e_retornar_Ok()
        {
            //Arrange
            var id         = 1;
            var repo       = new ClienteRepositorioStub();
            var cliente    = repo.ObterPorId(id);
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Delete(id) as OkNegotiatedContentResult <Cliente>;

            //Assert
            Assert.IsNotNull(result);
            Assert.IsNull(repo.ObterPorId(id));
            Assert.AreEqual(id, result.Content.Id);
            Assert.AreEqual(cliente, result.Content);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Post_deverá_adicionar_o_cliente_e_retornar_o_caminho_do_mesmo()
        {
            //Arrange
            var cliente = new Cliente {
                Nome = "Novo Cliente", Sexo = CadCli.Dominio.Enums.Sexo.Masculino, Nascimento = new DateTime()
            };
            var repo       = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Post(cliente) as CreatedNegotiatedContentResult <Cliente>;

            //Assert
            Assert.IsNotNull(result);
            //Assert.AreEqual(result.RouteName, "DefaultApi");
            //Assert.AreEqual(result.RouteValues["id"], result.Content.Id);
            Assert.AreEqual(result.Content.Nome, cliente.Nome);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Post_deverá_falhar_qdo_o_cliente_já_possuir_um_Id()
        {
            //Arrange
            var cliente = new Cliente { Id = 1, Nome = "Novo Cliente", Sexo = CadCli.Dominio.Enums.Sexo.Masculino, Nascimento = new DateTime() };
            var repo = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Post(cliente) as BadRequestErrorMessageResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Id do cliente inválido", result.Message);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Put_deverá_falhar_qdo_o_cliente_for_nulo()
        {
            //Arrange
            var id = 1;
            Cliente cliente = null;
            var repo = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Put(id, cliente) as BadRequestErrorMessageResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Cliente não pode ser nulo", result.Message);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Put_deverá_falhar_qdo_o_param_id_for_diferente_do_cliente_id()
        {
            //Arrange
            var id = 1;
            var repo = new ClienteRepositorioStub();
            var cliente = repo.ObterPorId(3);
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Put(id, cliente) as BadRequestErrorMessageResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Os id's não conferem", result.Message);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Delete_deverá_excluir_o_cliente_e_retornar_Ok()
        {
            //Arrange
            var id = 1;
            var repo = new ClienteRepositorioStub();
            var cliente = repo.ObterPorId(id);
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Delete(id) as OkNegotiatedContentResult<Cliente>;

            //Assert
            Assert.IsNotNull(result);
            Assert.IsNull(repo.ObterPorId(id));
            Assert.AreEqual(id, result.Content.Id);
            Assert.AreEqual(cliente, result.Content);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Post_deverá_adicionar_o_cliente_e_retornar_o_caminho_do_mesmo()
        {
            //Arrange
            var cliente = new Cliente { Nome = "Novo Cliente", Sexo = CadCli.Dominio.Enums.Sexo.Masculino, Nascimento = new DateTime() };
            var repo = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);

            //Action
            var result = await controller.Post(cliente) as CreatedNegotiatedContentResult<Cliente>;

            //Assert
            Assert.IsNotNull(result);
            //Assert.AreEqual(result.RouteName, "DefaultApi");
            //Assert.AreEqual(result.RouteValues["id"], result.Content.Id);
            Assert.AreEqual(result.Content.Nome, cliente.Nome);

            controller.Dispose();
            repo.Dispose();
        }
        public async Task Put_deverá_atualizar_o_cliente_e_retornar_NoContent()
        {
            //Arrange
            var repo = new ClienteRepositorioStub();
            var controller = new ClientesController(repo);
            var cliente = repo.ObterPorId(3);

            //Action
            var result = await controller.Put(cliente.Id, cliente) as StatusCodeResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(StatusCodeResult));
            Assert.AreEqual(HttpStatusCode.NoContent, result.StatusCode);

            controller.Dispose();
            repo.Dispose();
        }