mirror of
https://github.com/ipnet-mesh/meshcore-hub.git
synced 2026-07-28 04:22:51 +02:00
527c860bf8
Frontend CI (closes the no-coverage gap for the TSX): - ci.yml: new 'frontend' job — npm ci, tsc --noEmit, test:frontend, build. - package.json: engines.node>=20, test:frontend/typecheck scripts. vitest unit + component tests (jsdom, @testing-library/react): - utils/charts.test.ts — tier math + every chart builder. - utils/format.test.ts — parseAppDate, formatNumber, truncateKey, emoji helpers, formatRelativeTime. - components/Navbar.test.tsx — feature-gated nav, custom pages, OIDC/maintenance auth gating. - components/Announcements.test.tsx — banner rendering, ordering, dismiss + sessionStorage (covers behaviour moved out of the Python suite). Navbar → React (full SPA shell): - New Navbar/ThemeToggle/Announcements components + useNavItems hook (shared feature-gated nav for desktop + mobile); nav uses react-router NavLink (client-side nav + auto active) — drops the imperative data-nav-link bridge. - main.tsx single root; App.tsx renders Navbar + Announcements above routed <main>. - spa.html slimmed to SEO/config/footer shell (Jinja2 navbar/banners/theme script removed; #app is a plain div React fills). - Backend: _build_config_json exposes system_announcement/network_announcement. Tests (server-rendered nav/banner assertions → config): - conftest.py: get_app_config() helper (robust __APP_CONFIG__ extraction). - test_features/app/home/pages/dashboard rewritten to assert __APP_CONFIG__; dashboard client-rendered-stats tests replaced with a shell assertion. Docs: REACT_MIGRATION.md Phase 5 (incl. deliberately-skipped react-query/ Storybook/Playwright), AGENTS.md Frontend section. Verified: tsc clean, npm run build, vitest (49 passed), pytest tests/test_web (251 passed), full suite (1459 passed), pre-commit (passed).
79 lines
2.8 KiB
Python
79 lines
2.8 KiB
Python
"""Tests for the dashboard page route."""
|
|
|
|
from typing import Any
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
from tests.test_web.conftest import MockHttpClient
|
|
|
|
|
|
class TestDashboardPage:
|
|
"""Tests for the dashboard page."""
|
|
|
|
def test_dashboard_returns_200(self, client: TestClient) -> None:
|
|
"""Test that dashboard page returns 200 status code."""
|
|
response = client.get("/dashboard")
|
|
assert response.status_code == 200
|
|
|
|
def test_dashboard_returns_html(self, client: TestClient) -> None:
|
|
"""Test that dashboard page returns HTML content."""
|
|
response = client.get("/dashboard")
|
|
assert "text/html" in response.headers["content-type"]
|
|
|
|
def test_dashboard_contains_network_name(self, client: TestClient) -> None:
|
|
"""Test that dashboard page contains the network name."""
|
|
response = client.get("/dashboard")
|
|
assert "Test Network" in response.text
|
|
|
|
def test_dashboard_serves_spa_shell(
|
|
self, client: TestClient, mock_http_client: MockHttpClient
|
|
) -> None:
|
|
"""The dashboard route serves the SPA shell.
|
|
|
|
Dashboard statistics are fetched and rendered client-side by React from
|
|
the API, so they are not present in the server-rendered shell; we assert
|
|
the mount point and embedded config instead.
|
|
"""
|
|
response = client.get("/dashboard")
|
|
assert response.status_code == 200
|
|
assert 'id="app"' in response.text
|
|
assert "window.__APP_CONFIG__" in response.text
|
|
|
|
|
|
class TestDashboardPageAPIErrors:
|
|
"""Tests for dashboard page handling API errors."""
|
|
|
|
def test_dashboard_handles_api_error(
|
|
self, web_app: Any, mock_http_client: MockHttpClient
|
|
) -> None:
|
|
"""Test that dashboard page handles API errors gracefully."""
|
|
# Set error response for stats endpoint
|
|
mock_http_client.set_response(
|
|
"GET", "/api/v1/dashboard/stats", status_code=500, json_data=None
|
|
)
|
|
web_app.state.http_client = mock_http_client
|
|
|
|
client = TestClient(web_app, raise_server_exceptions=True)
|
|
response = client.get("/dashboard")
|
|
|
|
# Should still return 200 (page renders with defaults)
|
|
assert response.status_code == 200
|
|
|
|
def test_dashboard_handles_api_not_found(
|
|
self, web_app: Any, mock_http_client: MockHttpClient
|
|
) -> None:
|
|
"""Test that dashboard page handles API 404 gracefully."""
|
|
mock_http_client.set_response(
|
|
"GET",
|
|
"/api/v1/dashboard/stats",
|
|
status_code=404,
|
|
json_data={"detail": "Not found"},
|
|
)
|
|
web_app.state.http_client = mock_http_client
|
|
|
|
client = TestClient(web_app, raise_server_exceptions=True)
|
|
response = client.get("/dashboard")
|
|
|
|
# Should still return 200 (page renders with defaults)
|
|
assert response.status_code == 200
|