53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
"""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
|