Code: Select all
async def get_current_user(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
token_data = TokenData(username=username)
except JWTError:
raise credentials_exception
user = get_user(fake_users_db, username=token_data.username)
if user is None:
raise credentials_exception
return user
Die einzige Methode, die keine Authentifizierung erfordert, ist die POST-Methode zum Erstellen eines neuen Benutzers.
Ich möchte in der Lage sein, Komponententests zu definieren, die überprüfen Auf die Methode kann nicht ohne Authentifizierung zugegriffen werden, und ich möchte die Authentifizierung auch vollständig überspringen, wenn ich mich auf den Inhalt der Methode konzentriere.
Daher habe ich die Override-Funktionalität in einem Fixture verwendet. Zum Beispiel für diesen Test:
Code: Select all
test_user.pyCode: Select all
def test_create_user(test_db, create_user, user, skip_authentication):
"""
Verify a user can be created and retrieved
"""
response = client.post(
"/api/v1/users/",
json=create_user,
)
# Assert creation
assert response.status_code == 200, response.text
data = response.json()
assert "id" in data
user_id = data["id"]
del data["id"]
assert data == user
# Assert get user
response = client.get(f"/api/v1/users/{user_id}")
assert response.status_code == 200, response.text
data = response.json()
assert user_id == data["id"]
del data["id"]
assert data == user
Code: Select all
conftest.pyCode: Select all
@pytest.fixture
def skip_authentication() -> None:
def get_current_user():
pass
app.dependency_overrides[get_current_active_user] = get_current_user
Wie kann ich es nur auf die Tests beschränken, die ich möchte?
Mobile version