V&V | Desafio | Resolução | Tecnologias | Execução | Licença | 🙋🏻♀️
É o processo no qual aferimos se as especificações e requisitos do sistema estão sendo atendidas pelo software em desenvolvimento, ou seja, a aplicação deve cumprir a finalidade pretendida. Verificação e Validação (V&V), que fazem parte da engenharia de software e também são reconhecidas como controle de qualidade, costumam fazer parte das atribuições dos testadores, como parte do ciclo de vida de desenvolvimento do projeto. De forma mais resumida podemos dizer que a Verificação busca identificar se o software atinge os objetivos propostos sem erros e/ou ausências, já a Validação verifica se o software é de fato o que deveria ter sido desenvolvido, se atende aos requisitos de alto nível.
Fonte: Wikipedia-V&V
Consiste em um desenvolvimento guiado por testes, esse método de desenvolver software se apoia em um ciclo curto de repetições e associa-se ao conceito de verificação e validação. O código é escrito a fim de validar as necessidades descritas no teste automatizado juntamente com as do software.Fonte: Wikipedia-TDD
A autorização, por sua vez, verifica nas regras de negócios se o usuário autenticado está autorizado a executar/acessar a funcionalidade/rota requisitada.
Fonte: MDN Autenticação HTTP
📝 TAREFA: Validação e Segurança
Implemente as funcionalidades necessárias para que os testes do projeto bds04 sejam executados sem falhas:
https://github.com/devsuperior/bds04
Neste sistema, somente as rotas de leitura de eventos e cidades são públicas. Usuários CLIENT podem também inserir novos eventos. Os demais acessos são permitidos apenas a usuários ADMIN.
Validações de City:
- Nome não pode ser vazio
Validações de Event:
- Nome não pode ser vazio
- Data não pode ser passada
- Cidade não pode ser nula
- Modelo de dados User-Roles;
- Adicionar pacotes Repository, Services, Controllers e pacotes de exceção para Services e Controllers;
- Infraestrutura de validação;
- Infraestrutura de segurança;
- Releitura dos testes, implementar funcionalidades e executar testes.
🚧 Adicionar pacotes Repository, Services, Controllers e pacotes de exceção para Services e Controllers
Infraestrutura de validação incluída ao projeto, composta pelos arquivos FieldMessage, ValidationError e o método MethodArgumentNotValidException no ControllerExceptionHandler, este último, inclusive, é de extrema importância para as validações.
Criada a classe UserService que implementa as interfaces do Spring Security, UserDetails e UserDetailsService, juntamente com a WebSecurityConfigurerAdapter, classe para configuração de segurança web onde é necessário implementar o AuthenticationManager.
Já no AppConfig conterá algumas configurações do aplicativo como os Beans BCrypt, JwtAccessTokenConverter e JwtTokenStore. E concluindo a infraestrutura foi incluído AuthorizationServerConfigurerAdapter que é a classe de configuração para Authorization Server e ResourceServerConfigurerAdapter que é a classe de configuração para Resource Server. 🤯
Teste de Integração CityController:
Deve retornar 401 (Unauthorized) quando um usuário não logado tentar inserir uma cidade.
Deve retornar 403 (Forbidden) quando um Client logado tentar inserir uma cidade.
Deve retornar 201 (Created), inserir a cidade, quando o Admin estiver logado e os dados estiverem corretos.
Deve retornar 422 (Unprocessable Entity) quando Admin estiver logado, mas tentar inserir a cidade com o nome em branco.
Deve retornar uma lista com todas as cidades ordenadas por nome.
Teste de Integração EventController:
Deve retornar 401 (Unauthorized) quando o usuário não logado tentar inserir um evento.
Deve retornar 201 (Created), inserir o evento, quando o Client estiver logado e os dados estiverem corretos.
Deve retornar 201 (Created), inserir o evento, quando o Admin estiver logado e os dados estiverem corretos.
Deve retornar 422 (Unprocessable Entity) quando Admin estiver logado, mas tentar inserir o nome do evento em branco.
Deve retornar 422 (Unprocessable Entity) quando Admin estiver logado, mas tentar inserir o evento com data passada.
Deve retornar 422 (Unprocessable Entity) quando Admin estiver logado, mas tentar inserir o evento sem informar a cidade.
Deve retornar os eventos de forma paginada.
Fonte: Códigos de status de respostas HTTP
- Java 11
- Spring boot
- JPA
- Maven
- OAuth 2.0
- JWT
Pré-requisitos: Java 11 e Postman (ou a API Client que preferir)
# Clonar repositório
git clone https://github.com/lilianmartinsfritzen/TDD-ValidationAndSecurity
# Entrar na pasta abaixo
cd bds04
# Executar o projeto
./mvnw spring-boot:run
# Caminhos utilizados no Postman
GET - All Cities: http://localhost:8080/cities
GET - Events Paged: http://localhost:8080/events
# Dados para Login
POST - LOGIN: http://localhost:8080
ENDPOINT: /oauth/token (Utilizado o padrão OAuth)
AUTHORIZATION:
Type: Basic Auth
USERNAME | PASSWORD |
---|---|
myclientid | myclientsecret |
Body: x-www-form-urlencoded
Ana - CLIENT
KEY | VALUE | DESCRIPTION |
---|---|---|
username | ana@gmail.com | |
password | 123456 | |
grand_type | password |
Body: x-www-form-urlencoded
Bob - ADMIN
KEY | VALUE | DESCRIPTION |
---|---|---|
username | bob@gmail.com | |
password | 123456 | |
grand_type | password |
# Caminhos utilizados com Body
POST - New City: http://localhost:8080/cities
{
"name": "New city"
}
POST - New Event: http://localhost:8080/events
{
"name": "Novo evento",
"url": "https://novoevento.com.br",
"date": "2023-07-15",
"cityId": 1
}
Esse projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.