Функция входа / выхода в FastAPI работает в браузере, но я пытаюсь написать для нее модульные тесты. Когда мое приложение устанавливает повара ie, я вижу ответ, отправляет ли повара ie. Когда я получаю его с запросом Python, повар ie удаляется из ответа, следовательно, логин не работает.
@pytest.fixture(scope='module')
def test_client():
app = create_app(testing=True)
client = TestClient(app)
client.base_url = 'https://localhost'
from app.models import Base, User
Base.metadata.create_all(bind=engine)
yield client
db.flush()
Base.metadata.drop_all(bind=engine)
# Simple login functions.
def test_login(test_client):
response = test_client.post(url='/login', data=dict(
username=username,
password=password
), allow_redirects=True, proxies=proxies)
breakpointB()
assert response.headers
Затем серверная часть, которая работает в браузере:
@core.post("/login", response_model=schemas.Token)
async def login_for_access_token(*, request: Request, form_data: OAuth2PasswordRequestForm = Depends(),
db: Session = Depends(get_db)):
token = jsonable_encoder(access_token)
response = RedirectResponse(url=request.url_for('index'), status_code=303)
response.set_cookie(
"Authorization",
value=f"Bearer {token}",
domain=os.environ.get('DOMAIN'),
httponly=False,
max_age=1800,
expires=1800,
)
breakpointA()
return response
Итак, в BreakpointA () перед отправкой ответа response.headers
выглядит так:
MutableHeaders({'location': 'https://localhost/', 'set-cookie': 'Authorization="Bearer e
yJ0eXAiO5JKV1iLCJ4bGciOiJ2UzI1NiJ9.eyJzdWIiOi2b2Vqb2UiL253JleH1iOjE1DM0ODEzNTR7.zwbT9yV
OnV2V14Yrtuc1PP8wv82alz2354sgm0Rc7PgZIvc"; Domain=https://localhost; expires=Fri, 06 Mar 202
0 07:55:54 GMT; Max-Age=1800; Path=/'})
В BreakpointB (), на моей тестовой клиентской стороне ПОСЛЕ ответ получен, вот как выглядят response.headers и response.cookies:
(Pdb) response.headers
{'content-length': '24956', 'content-type': 'text/html; charset=utf-8'}
(Pdb) response.cookies
<RequestsCookieJar[]>
(Pdb) response.cookies.get_dict()
{}
У меня есть сильное подозрение, что это связано с проблемой домена - но как мне исправить это? В моем TestClient ( Starlette TestClient ) я установил client.base_url = 'https://localhost'
, и в моей конечной точке при приготовлении пищи ie я установил DOMAIN=https://localhost
. У кого-нибудь есть опыт исправления этого?