"""Integration smoke tests, one per blueprint's main route (Chapter 12).""" from __future__ import annotations def test_root_redirects_to_login_when_not_authenticated(client): resp = client.get("/", follow_redirects=False) assert resp.status_code == 302 assert resp.headers["Location"] == "/login" def test_root_redirects_to_overview_when_authenticated(logged_in_client): resp = logged_in_client.get("/", follow_redirects=False) assert resp.status_code == 302 assert resp.headers["Location"] == "/overview" def test_healthz_is_public_and_ok(client): resp = client.get("/healthz") assert resp.status_code == 200 assert resp.get_json()["data"]["status"] == "ok" def test_overview_redirects_when_not_logged_in(client): resp = client.get("/overview") assert resp.status_code in (302, 401) def test_overview_reachable_when_logged_in(logged_in_client): resp = logged_in_client.get("/overview") assert resp.status_code == 200 def test_seo_reachable_when_logged_in(logged_in_client): resp = logged_in_client.get("/seo") assert resp.status_code == 200 def test_security_reachable_when_logged_in(logged_in_client): resp = logged_in_client.get("/security") assert resp.status_code == 200 def test_api_endpoint_returns_401_json_when_not_logged_in(client): resp = client.get("/api/overview/kpis") assert resp.status_code == 401 assert resp.get_json()["error"]["code"] == "unauthorized" def test_login_with_bad_credentials_shows_flash(client): resp = client.post("/login", data={"email": "nope@example.com", "password": "wrong"}, follow_redirects=True) assert resp.status_code == 200 assert b"Invalid email or password" in resp.data