import pytest from itsdangerous import Signer def _cookie_value(response, name="session"): header = response.headers.get("Set-Cookie") assert header is not None, "no Set-Cookie header was sent" assert header.startswith(f"{name}=") return header[len(name) + 1:].split(";", 1)[0] @pytest.mark.asyncio async def test_unsigned_cookie_is_plain_sid(app_factory): """Regression: str sid used to blow up with AttributeError on .decode().""" app = app_factory(SESSION_USE_SIGNER=False) client = app.test_client() response = await client.get("/") assert response.status_code == 200 data = await response.get_json() assert data["hits"] == 1 assert _cookie_value(response) == data["sid"] @pytest.mark.asyncio async def test_signed_cookie_is_signed_sid(app_factory): app = app_factory(SESSION_USE_SIGNER=True) client = app.test_client() response = await client.get("/") assert response.status_code == 200 data = await response.get_json() cookie = _cookie_value(response) assert cookie != data["sid"] signer = Signer(app.secret_key, salt="quart-session", key_derivation="hmac") assert signer.unsign(cookie).decode() == data["sid"] @pytest.mark.asyncio @pytest.mark.parametrize("use_signer", [False, True]) async def test_session_survives_next_request(app_factory, use_signer): app = app_factory(SESSION_USE_SIGNER=use_signer) client = app.test_client() first = await client.get("/") second = await client.get("/") assert (await first.get_json())["hits"] == 1 assert (await second.get_json())["hits"] == 2 @pytest.mark.asyncio async def test_signer_without_secret_key_sets_no_cookie(app_factory): app = app_factory(SESSION_USE_SIGNER=True) app.secret_key = None client = app.test_client() response = await client.get("/") assert response.status_code == 200 assert response.headers.get("Set-Cookie") is None