"""Tests for web/exceptions.py coverage."""

from local_deep_research.web.exceptions import (
    AuthenticationRequiredError,
    WebAPIException,
)


class TestWebAPIException:
    def test_default_fields(self):
        exc = WebAPIException("something broke")
        assert exc.message == "something broke"
        assert exc.status_code == 500
        assert exc.error_code == "WebAPIException"
        assert exc.details == {}

    def test_custom_fields(self):
        exc = WebAPIException(
            "bad request",
            status_code=400,
            error_code="BAD_REQUEST",
            details={"field": "name"},
        )
        assert exc.status_code == 400
        assert exc.error_code == "BAD_REQUEST"
        assert exc.details == {"field": "name"}

    def test_to_dict_basic(self):
        exc = WebAPIException("error")
        d = exc.to_dict()
        assert d["status"] == "error"
        assert d["message"] == "error"
        assert d["error_code"] == "WebAPIException"
        assert "details" not in d  # empty details not included

    def test_to_dict_with_details(self):
        exc = WebAPIException("error", details={"key": "val"})
        d = exc.to_dict()
        assert d["details"] == {"key": "val"}

    def test_is_exception(self):
        exc = WebAPIException("test")
        assert isinstance(exc, Exception)
        assert str(exc) == "test"


class TestAuthenticationRequiredError:
    def test_default_message(self):
        exc = AuthenticationRequiredError()
        assert "Authentication required" in exc.message
        assert exc.status_code == 401
        assert exc.error_code == "AUTHENTICATION_REQUIRED"
        assert exc.details == {}

    def test_custom_message(self):
        exc = AuthenticationRequiredError(message="Please log in")
        assert exc.message == "Please log in"

    def test_with_username(self):
        exc = AuthenticationRequiredError(username="alice")
        assert exc.details == {"username": "alice"}
        assert exc.status_code == 401

    def test_to_dict(self):
        exc = AuthenticationRequiredError(username="bob")
        d = exc.to_dict()
        assert d["status"] == "error"
        assert d["error_code"] == "AUTHENTICATION_REQUIRED"
        assert d["details"]["username"] == "bob"

    def test_inherits_from_web_api_exception(self):
        exc = AuthenticationRequiredError()
        assert isinstance(exc, WebAPIException)
