Как я могу пропустить аутентификацию в одном тесте с помощью приспособления в Fast API вместе с pytest?Python

Программы на Python
Ответить
Anonymous
 Как я могу пропустить аутентификацию в одном тесте с помощью приспособления в Fast API вместе с pytest?

Сообщение Anonymous »

Я построил аутентификацию, аналогичную описанной в документации. Итак, я скопировал эту зависимость:

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

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
Который я использую в наборе конечных точек, например, в другом примере документации, для пользователя у меня есть GET, POST, PUT, DELETE и GET ALL.
Единственный метод, который не требует аутентификации, — это метод POST для создания нового пользователя.
Я хочу иметь возможность определять модульные тесты, которые убедитесь, что к методу невозможно получить доступ без аутентификации, а также я хочу полностью пропустить аутентификацию, когда сосредотачиваюсь на содержимом метода.
Поэтому я использовал функцию переопределения в приспособлении. Например, для этого теста:

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

test_user.py

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

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

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

conftest.py

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

@pytest.fixture
def skip_authentication() -> None:

def get_current_user():
pass
app.dependency_overrides[get_current_active_user] = get_current_user
Кажется, это работает для удаления аутентификации, но оно удаляет ее во всех тестах, а не только в тех, в которых есть приспособление Skip_authentication.
Как я могу ограничить ее только теми тестами, которые мне нужны?>

Подробнее здесь: https://stackoverflow.com/questions/714 ... api-togeth
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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