Маршрут API вызывает `fastapi.HTTPException`, тест выполнен успешно, codecov говорит: «Нет, это не покрыто» ⇐ Python

Программы на Python
Anonymous
Маршрут API вызывает `fastapi.HTTPException`, тест выполнен успешно, codecov говорит: «Нет, это не покрыто»

Сообщение Anonymous »

Я написал пару тестов для своего API, например для этого маршрута /login:

Код: Выделить всё

@router.post("/login", response_model=schemas.TokenResponse)
async def login_for_access_token(
form_data: OAuth2PasswordRequestForm = Depends(),
user_interactor: UserInteractor = Depends(get_user_interactor),
token_interactor: TokenInteractor = Depends(get_token_interactor),
config: AppConfig = Depends(get_config),
security_service: SecurityService = Depends(get_security_service)
):
# If user with given username/pass found - returns user object,
# if not found due to any reason - None
user = await user_interactor.verify_user_password(form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
# .. some logic ..
return schemas.TokenResponse(..)
Были написаны следующие тесты:

Код: Выделить всё

async def test_login_user(client: AsyncClient, test_user):
response = await client.post(
"/api/v1/auth/login",
data={"username": test_user.username, "password": "testpassword"}
)
assert response.status_code == 200
assert "access_token" in response.json()
assert "refresh_token" in response.json()
assert response.json()["token_type"] == "bearer"

async def test_login_invalid_credentials(client: AsyncClient):
response = await client.post(
"/api/v1/auth/login",
data={"username": "nonexistentuser", "password": "wrongpassword"}
)
assert response.status_code == 401
assert "Incorrect username or password" in response.json()["detail"]
assert "WWW-Authenticate" in response.headers
assert response.headers["WWW-Authenticate"] == "Bearer"
Очевидно, что обе части первого условия — отвечающего за проверку существования такого пользователя в БД или нет — встречаются в тестах, но CodeCov думает иначе:

Изображение

Стоит упомянуть оба тесты проходят без каких-либо ошибок, и поведение соответствует ожиданиям.
Чего мне не хватает в моих тестах, чтобы инструмент покрытия кода помечал, если не пользователь: и следующую строку как покрытую ?

Пытался сделать следующее, все варианты не удалось:
  • Вызывается pytest из CLI как pytest -vv -rw --cov= --cov-report=term-missing вместо проверки app.codecov.io — тот же результат, тот же процент;
  • Попытка обернуть вызов клиента в:
< pre class="lang-py Prettyprint-override">

Код: Выделить всё

async def test_login_invalid_credentials(client: AsyncClient):
with pytest.raises(fastapi.HTTPException) as err:
response = await client.post(..)

# asserts here
Тест не пройден, поскольку не создается исключение fastapi.HTTPException.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ly-codecov

Вернуться в «Python»