"""Tests for error classes and error page rendering."""
from __future__ import annotations
import pytest
from shared.browser.app.errors import AppError, _error_page
# ---------------------------------------------------------------------------
# AppError
# ---------------------------------------------------------------------------
class TestAppError:
def test_single_message(self):
err = AppError("Something went wrong")
assert str(err) == "Something went wrong"
assert err.messages == ["Something went wrong"]
assert err.status_code == 400
def test_custom_status_code(self):
err = AppError("Not found", status_code=404)
assert err.status_code == 404
assert str(err) == "Not found"
def test_list_of_messages(self):
err = AppError(["Error 1", "Error 2", "Error 3"])
assert err.messages == ["Error 1", "Error 2", "Error 3"]
assert str(err) == "Error 1" # first message as str
def test_tuple_of_messages(self):
err = AppError(("A", "B"))
assert err.messages == ["A", "B"]
def test_set_of_messages(self):
err = AppError({"only one"})
assert err.messages == ["only one"]
def test_empty_list(self):
err = AppError([])
assert err.messages == []
assert str(err) == ""
def test_is_value_error(self):
"""AppError should be catchable as ValueError for backwards compat."""
err = AppError("test")
assert isinstance(err, ValueError)
def test_default_status_is_400(self):
err = AppError("test")
assert err.status_code == 400
def test_integer_message_coerced(self):
err = AppError([42, "text"])
assert err.messages == ["42", "text"]
def test_status_code_override(self):
err = AppError("conflict", status_code=409)
assert err.status_code == 409
def test_messages_are_strings(self):
err = AppError([None, 123, True])
assert all(isinstance(m, str) for m in err.messages)
# ---------------------------------------------------------------------------
# _error_page
# ---------------------------------------------------------------------------
class TestErrorPage:
def test_returns_html_string(self):
html = _error_page("Not Found")
assert isinstance(html, str)
assert "" in html
def test_contains_message(self):
html = _error_page("Something broke")
assert "Something broke" in html
def test_contains_error_gif(self):
html = _error_page("Error")
assert "/static/errors/error.gif" in html
def test_contains_reload_link(self):
html = _error_page("Error")
assert "Reload" in html
def test_html_in_message(self):
"""Messages can contain HTML (used by fragment_error handler)."""
html = _error_page("The account service is unavailable")
assert "account" in html
def test_self_contained(self):
"""Error page should include its own styles (no external CSS deps)."""
html = _error_page("Error")
assert "" in html