diff --git a/docs/test-cases.md b/docs/test-cases.md index df2d248..89854b6 100644 --- a/docs/test-cases.md +++ b/docs/test-cases.md @@ -20,10 +20,11 @@ Legenda: | TC-006 | Consulta | Buscar bookings filtrando por firstname e lastname | Funcional | Média | Automatizado | [get_booking.feature:15](../features/get_booking.feature#L15) | | TC-007 | Atualização | Atualizar booking com token válido (PUT) | Funcional | Crítica | Automatizado | [update_booking.feature:4](../features/update_booking.feature#L4) | | TC-008 | Atualização | Tentar atualizar booking sem token de autenticação | Negativo | Alta | Automatizado | [update_booking.feature:10](../features/update_booking.feature#L10) | -| TC-009 | Atualização | Atualizar parcialmente o booking com PATCH | Funcional | Média | Automatizado | [update_booking.feature:17](../features/update_booking.feature#L17) | +| TC-009 | Atualização | Atualizar parcialmente o booking com PATCH | Funcional | Média | Automatizado | [update_booking.feature:27](../features/update_booking.feature#L27) | | TC-010 | Remoção | Remover booking com token válido | Funcional | Crítica | Automatizado | [delete_booking.feature:3](../features/delete_booking.feature#L3) | | TC-011 | Remoção | Tentar remover booking sem token de autenticação | Negativo | Alta | Automatizado | [delete_booking.feature:9](../features/delete_booking.feature#L9) | -| TC-012 | Atualização | Tentar atualizar parcialmente booking sem token (PATCH) | Negativo | Alta | Automatizado | [update_booking.feature:27](../features/update_booking.feature#L27) | +| TC-012 | Atualização | Tentar atualizar parcialmente booking sem token (PATCH) | Negativo | Alta | Automatizado | [update_booking.feature:36](../features/update_booking.feature#L36) | +| TC-013 | Atualização | Tentar atualizar booking com token inválido (PUT) | Negativo | Alta | Automatizado | [update_booking.feature:17](../features/update_booking.feature#L17) | `BookingApiClient.get_booking_ids` também aceita filtro por `checkin`/`checkout`, mas o TC-006 cobre só `firstname`/`lastname`: o filtro por data na API pública de demonstração é conhecido por ser instável, e testá-lo arriscaria um teste flaky em vez de validar um comportamento real. diff --git a/features/update_booking.feature b/features/update_booking.feature index f329ef9..44f980c 100644 --- a/features/update_booking.feature +++ b/features/update_booking.feature @@ -15,6 +15,16 @@ Feature: Atualização de booking (PUT e PATCH) When ele tenta atualizar o booking com novos dados Then a resposta deve indicar acesso não autorizado + # Diferente do TC-008 (token ausente): aqui o token existe, mas é inválido. + # Validado manualmente que PATCH e DELETE se comportam da mesma forma (403), + # então não repetimos esse caso pros outros dois verbos. + @TC-013 + Scenario: Tentar atualizar booking com token inválido + Given que existe um booking criado + And que ele possui um token de autenticação inválido + When ele tenta atualizar o booking com novos dados + Then a resposta deve indicar acesso não autorizado + # PATCH atualiza somente os campos enviados, mantendo o restante do booking. @TC-009 Scenario: Atualizar parcialmente o booking com PATCH diff --git a/pyproject.toml b/pyproject.toml index 1289c76..2957605 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ markers = [ "TC-010: id do test case, ver docs/test-cases.md", "TC-011: id do test case, ver docs/test-cases.md", "TC-012: id do test case, ver docs/test-cases.md", + "TC-013: id do test case, ver docs/test-cases.md", ] [tool.ruff] diff --git a/steps/test_booking_steps.py b/steps/test_booking_steps.py index 1cc126e..5e02ed9 100644 --- a/steps/test_booking_steps.py +++ b/steps/test_booking_steps.py @@ -28,6 +28,11 @@ def com_token_de_autenticacao_valido(context: Context) -> None: context.token = context.auth_client.get_valid_token() +@given("que ele possui um token de autenticação inválido") +def com_token_de_autenticacao_invalido(context: Context) -> None: + context.token = "token-invalido-qualquer" + + @when(parsers.parse('ele solicita um token com o usuário "{username}" e a senha "{password}"')) def solicita_um_token(context: Context, username: str, password: str) -> None: context.last_response = context.auth_client.create_token(username, password)