Files
ietf-draft-analyzer/tests/test_web.py
Christian Nennemann 9d4b70919f
Some checks failed
CI / test (3.11) (push) Failing after 9s
CI / test (3.12) (push) Failing after 9s
Observatory Update / update (push) Failing after 1m48s
chore(webui): remove timeline animation page
The animated t-SNE 'embedding landscape' added no real analytical value and
its cumulative-by-month logic was inherently confusing (ancient drafts
appearing late in the animation). Removed entirely rather than maintained.

Drops the /timeline route, template, nav link, data builder
(get_timeline_animation_data / _compute_timeline_animation_data) and its test.
The Overview mini-timeline and /api/timeline (separate features) are untouched.
2026-05-23 21:52:54 +02:00

265 lines
6.7 KiB
Python

"""Tests for Flask web routes using the test client.
Uses the real data/drafts.db so templates can render with actual data.
"""
from __future__ import annotations
import sys
import os
import pytest
# Ensure src is on path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
from webui.app import create_app
@pytest.fixture
def client():
"""Create a Flask test client in dev mode (admin enabled)."""
# Reset auth module state so create_app can re-initialize
import webui.auth as auth_mod
auth_mod._initialized = False
auth_mod._dev_mode = False
app = create_app(dev=True)
app.config["TESTING"] = True
with app.test_client() as c:
yield c
@pytest.fixture
def prod_client():
"""Create a Flask test client in production mode (admin disabled)."""
import webui.auth as auth_mod
auth_mod._initialized = False
auth_mod._dev_mode = False
app = create_app(dev=False)
app.config["TESTING"] = True
with app.test_client() as c:
yield c
# ── Public pages ──────────────────────────────────────────────────────
def test_overview_page(client):
resp = client.get("/")
assert resp.status_code == 200
def test_drafts_page(client):
resp = client.get("/drafts")
assert resp.status_code == 200
def test_authors_page(client):
resp = client.get("/authors")
assert resp.status_code == 200
def test_search_page_empty(client):
resp = client.get("/search")
assert resp.status_code == 200
def test_search_page_with_query(client):
resp = client.get("/search?q=agent")
assert resp.status_code == 200
def test_about_page(client):
resp = client.get("/about")
assert resp.status_code == 200
def test_ratings_page(client):
resp = client.get("/ratings")
assert resp.status_code == 200
def test_citations_page(client):
resp = client.get("/citations")
assert resp.status_code == 200
def test_ideas_page(client):
resp = client.get("/ideas")
assert resp.status_code == 200
def test_idea_clusters_page(client):
resp = client.get("/idea-clusters")
assert resp.status_code == 200
def test_architecture_page(client):
resp = client.get("/architecture")
assert resp.status_code == 200
def test_impressum_page(client):
resp = client.get("/impressum")
assert resp.status_code == 200
def test_datenschutz_page(client):
resp = client.get("/datenschutz")
assert resp.status_code == 200
# ── 404 handling ──────────────────────────────────────────────────────
def test_404_for_nonexistent_page(client):
resp = client.get("/this-page-does-not-exist")
assert resp.status_code == 404
def test_404_for_nonexistent_draft(client):
resp = client.get("/drafts/draft-nonexistent-foobar-xyz")
assert resp.status_code == 404
# ── Admin pages (dev mode) ───────────────────────────────────────────
def test_gaps_page_dev(client):
resp = client.get("/gaps")
assert resp.status_code == 200
def test_monitor_page_dev(client):
resp = client.get("/monitor")
assert resp.status_code == 200
def test_proposals_page_dev(client):
resp = client.get("/proposals")
assert resp.status_code == 200
# ── Admin pages (production = 404) ───────────────────────────────────
def test_gaps_page_prod_hidden(prod_client):
resp = prod_client.get("/gaps")
assert resp.status_code == 404
def test_monitor_page_prod_hidden(prod_client):
resp = prod_client.get("/monitor")
assert resp.status_code == 404
def test_proposals_page_prod_hidden(prod_client):
resp = prod_client.get("/proposals")
assert resp.status_code == 404
# ── API endpoints ─────────────────────────────────────────────────────
def test_api_stats(client):
resp = client.get("/api/stats")
assert resp.status_code == 200
data = resp.get_json()
assert isinstance(data, dict)
assert "total_drafts" in data or "drafts" in data or len(data) > 0
def test_api_drafts(client):
resp = client.get("/api/drafts")
assert resp.status_code == 200
data = resp.get_json()
assert isinstance(data, dict)
def test_api_ratings(client):
resp = client.get("/api/ratings")
assert resp.status_code == 200
data = resp.get_json()
assert isinstance(data, dict)
def test_api_timeline(client):
resp = client.get("/api/timeline")
assert resp.status_code == 200
data = resp.get_json()
assert isinstance(data, (dict, list))
def test_api_categories(client):
resp = client.get("/api/categories")
assert resp.status_code == 200
data = resp.get_json()
assert isinstance(data, dict)
def test_api_ideas(client):
resp = client.get("/api/ideas")
assert resp.status_code == 200
data = resp.get_json()
assert isinstance(data, dict)
def test_api_search_empty(client):
resp = client.get("/api/search")
assert resp.status_code == 200
data = resp.get_json()
assert "drafts" in data
def test_api_search_with_query(client):
resp = client.get("/api/search?q=agent")
assert resp.status_code == 200
data = resp.get_json()
assert isinstance(data, dict)
def test_api_draft_detail_not_found(client):
resp = client.get("/api/drafts/nonexistent-draft-xyz")
assert resp.status_code == 404
data = resp.get_json()
assert "error" in data
def test_api_architecture(client):
resp = client.get("/api/architecture")
assert resp.status_code == 200
data = resp.get_json()
assert isinstance(data, dict)
def test_api_idea_clusters(client):
resp = client.get("/api/idea-clusters")
assert resp.status_code == 200
def test_api_citations(client):
resp = client.get("/api/citations")
assert resp.status_code == 200
def test_api_author_network(client):
resp = client.get("/api/authors/network")
assert resp.status_code == 200
# ── CSV export format ─────────────────────────────────────────────────
def test_api_drafts_csv(client):
resp = client.get("/api/drafts?format=csv")
assert resp.status_code == 200
assert "text/csv" in resp.content_type
def test_api_categories_csv(client):
resp = client.get("/api/categories?format=csv")
assert resp.status_code == 200
assert "text/csv" in resp.content_type