I'm trying to test my /login
API with FastAPI's Testclient.
But when I pass data to the post api. It shows, 422 error
with content username
and password
fields are required.
API:
@router.post('/token', response_model=schemas.Token)
async def login(user_credentials: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
"""
Login to the system with (Email | Username | Contact)
"""
user = db.query(models.User).filter(
(models.User.email == user_credentials.username) |
(models.User.username == user_credentials.username) |
(models.User.contact == user_credentials.username)
).first()
if not user:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN, detail="Invalid Credentials"
)
if not utils.verify_pwd(user_credentials.password, user.password):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN, detail="Invalid Credentials"
)
access_token = oauth2.create_access_token(data={'user_id': user.id})
return {"access_token": access_token, "token_type": "bearer"}
Test Code:
from fastapi.testclient import TestClient
from ..main import app
client = TestClient(app)
def test_auth_token(get_client: TestClient):
client = get_client.post('/token', json={"username": "admin", "password": "1234567890"})
assert client.status_code == 200
Error
(venv) ✘ genex@Genexs-MacBook-Pro: pytest -s
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.10.8, pytest-7.2.1, pluggy-1.0.0
rootdir: /Users/genex/Desktop/basha-bari
plugins: asyncio-0.20.3, anyio-3.6.2
asyncio: mode=strict
collected 1 item
apps/utility/test_utility_routers.py {'detail': [{'loc': ['body', 'username'], 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ['body', 'password'], 'msg': 'field required', 'type': 'value_error.missing'}]}
F
======================================================================================== FAILURES ========================================================================================
____________________________________________________________________________________ test_auth_token _____________________________________________________________________________________
def test_auth_token():
result = client.post('/token', json={"username": "admin", "password": "1234567890"})
print(result.json())
> assert result.status_code == 200
E assert 422 == 200
E + where 422 = <Response [422 Unprocessable Entity]>.status_code
apps/utility/test_utility_routers.py:12: AssertionError
================================================================================ short test summary info =================================================================================
FAILED apps/utility/test_utility_routers.py::test_auth_token - assert 422 == 200
=================================================================================== 1 failed in 1.06s ====================================================================================
I'm using httpx and pytest.
How should I pass the payload, so that the API receives it.