diff --git a/aulas/exercicios_resolvidos/aula_06.md b/aulas/exercicios_resolvidos/aula_06.md index 0c33b920..433975a4 100644 --- a/aulas/exercicios_resolvidos/aula_06.md +++ b/aulas/exercicios_resolvidos/aula_06.md @@ -2,16 +2,52 @@ ## Exercício 01 -Faça um teste para cobrir o cenário que levanta exception `credentials_exception` na autenticação caso o `User` não seja encontrado. Ao olhar a cobertura de `security.py` você vai notar que esse contexto não está coberto. +Faça um teste para cobrir o cenário que levanta exception `credentials_exception` na autenticação caso o `email` não seja enviado via JWT. Ao olhar a cobertura de `security.py` você vai notar que esse contexto não está coberto. ### Solução -... +Para executar o bloco de código você deve fazer uma chamada a qualquer endpoint que dependa do token (currentUser) e enviar um token que não contenha um endereço de e-mail (sub): + +```python title="tests/test_app.py" +def test_get_current_user_not_found__exercicio(client): + data = {'no-email': 'test'} + token = create_access_token(data) + + response = client.delete( + '/users/1', + headers={'Authorization': f'Bearer {token}'}, + ) + + assert response.status_code == HTTPStatus.UNAUTHORIZED + assert response.json() == {'detail': 'Could not validate credentials'} +``` ## Exercício 02 +Faça um teste para cobrir o cenário que levanta exception `credentials_exception` na autenticação caso o email seja enviado, mas não exista um `User` correspondente cadastrado na base de dados. Ao olhar a cobertura de `security.py` você vai notar que esse contexto não está coberto. + +### Solução + +Para executar o bloco de código você deve fazer uma chamada a qualquer endpoint que dependa do token (currentUser) e enviar um token que contenha um endereço de email (sub) que não esteja cadastrado na base de dados: + +```python title="tests/test_app.py" +def test_get_current_user_does_not_exists__exercicio(client): + data = {'sub': 'test@test'} + token = create_access_token(data) + + response = client.delete( + '/users/1', + headers={'Authorization': f'Bearer {token}'}, + ) + + assert response.status_code == HTTPStatus.UNAUTHORIZED + assert response.json() == {'detail': 'Could not validate credentials'} +``` + +## Exercício 03 + Reveja os testes criados até a aula 5 e veja se eles ainda fazem sentido (testes envolvendo `#!python 400`) ### Solução -... +Os testes para os endpoints de PUT e DELETE, que verificam usuários não existentes na base de dados não fazem mais sentido. Já que para alterar ou deletar um user, você tem que ser validado pelo token. Esses testes podem ser deletados. diff --git a/codigo_das_aulas/06/fast_zero/app.py b/codigo_das_aulas/06/fast_zero/app.py index 72e02138..1c2ec311 100644 --- a/codigo_das_aulas/06/fast_zero/app.py +++ b/codigo_das_aulas/06/fast_zero/app.py @@ -90,7 +90,7 @@ def update_user( except IntegrityError: raise HTTPException( status_code=HTTPStatus.CONFLICT, - detail='Username or Email already exists' + detail='Username or Email already exists', ) diff --git a/codigo_das_aulas/06/tests/conftest.py b/codigo_das_aulas/06/tests/conftest.py index 8c80d5aa..8eef2c69 100644 --- a/codigo_das_aulas/06/tests/conftest.py +++ b/codigo_das_aulas/06/tests/conftest.py @@ -42,7 +42,6 @@ def session(): @contextmanager def _mock_db_time(*, model, time=datetime(2024, 1, 1)): - def fake_time_handler(mapper, connection, target): if hasattr(target, 'created_at'): target.created_at = time diff --git a/codigo_das_aulas/06/tests/test_security.py b/codigo_das_aulas/06/tests/test_security.py index 655aceba..3da7ba1a 100644 --- a/codigo_das_aulas/06/tests/test_security.py +++ b/codigo_das_aulas/06/tests/test_security.py @@ -2,7 +2,10 @@ from jwt import decode -from fast_zero.security import SECRET_KEY, create_access_token +from fast_zero.security import ( + SECRET_KEY, + create_access_token, +) def test_jwt(): @@ -22,3 +25,29 @@ def test_jwt_invalid_token(client): assert response.status_code == HTTPStatus.UNAUTHORIZED assert response.json() == {'detail': 'Could not validate credentials'} + + +def test_get_current_user_not_found__exercicio(client): + data = {'no-email': 'test'} + token = create_access_token(data) + + response = client.delete( + '/users/1', + headers={'Authorization': f'Bearer {token}'}, + ) + + assert response.status_code == HTTPStatus.UNAUTHORIZED + assert response.json() == {'detail': 'Could not validate credentials'} + + +def test_get_current_user_does_not_exists__exercicio(client): + data = {'sub': 'test@test'} + token = create_access_token(data) + + response = client.delete( + '/users/1', + headers={'Authorization': f'Bearer {token}'}, + ) + + assert response.status_code == HTTPStatus.UNAUTHORIZED + assert response.json() == {'detail': 'Could not validate credentials'}