From 7ccf83545034ffcfb36fb7772d01a1c25d1d25bc Mon Sep 17 00:00:00 2001 From: Ed_ Date: Fri, 12 Jun 2026 16:29:22 -0400 Subject: [PATCH] test(result_types): add red tests for Result, ErrorInfo, NilPath, NilRAGState --- tests/test_result_types.py | 76 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 tests/test_result_types.py diff --git a/tests/test_result_types.py b/tests/test_result_types.py new file mode 100644 index 00000000..3b9edaf1 --- /dev/null +++ b/tests/test_result_types.py @@ -0,0 +1,76 @@ +import pytest +from src.result_types import ( + ErrorKind, + ErrorInfo, + Result, + NilPath, + NilRAGState, +) + +def test_error_kind_enum_has_expected_values() -> None: + assert ErrorKind.NETWORK.value == "network" + assert ErrorKind.AUTH.value == "auth" + assert ErrorKind.RATE_LIMIT.value == "rate_limit" + assert ErrorKind.NOT_FOUND.value == "not_found" + assert ErrorKind.NOT_READY.value == "not_ready" + assert ErrorKind.UNKNOWN.value == "unknown" + +def test_error_info_ui_message_with_source() -> None: + e = ErrorInfo(kind=ErrorKind.RATE_LIMIT, message="too many requests", source="mcp.read_file") + assert e.ui_message() == "[mcp.read_file] rate_limit: too many requests" + +def test_error_info_ui_message_without_source() -> None: + e = ErrorInfo(kind=ErrorKind.AUTH, message="bad key") + assert e.ui_message() == "auth: bad key" + +def test_result_ok_when_no_errors() -> None: + r: Result[str] = Result(data="hello") + assert r.ok is True + assert r.data == "hello" + assert r.errors == [] + +def test_result_not_ok_when_errors_present() -> None: + r: Result[str] = Result(data="", errors=[ErrorInfo(kind=ErrorKind.NOT_FOUND, message="nope", source="test")]) + assert r.ok is False + +def test_result_with_error_returns_new_result_with_appended_error() -> None: + r1: Result[str] = Result(data="hello") + err = ErrorInfo(kind=ErrorKind.NETWORK, message="timeout", source="test") + r2 = r1.with_error(err) + assert r1.errors == [] + assert r2.errors == [err] + assert r2.data == "hello" + +def test_result_with_data_replaces_data_keeps_errors() -> None: + r1: Result[str] = Result(data="", errors=[ErrorInfo(kind=ErrorKind.NETWORK, message="x", source="t")]) + r2 = r1.with_data("new value") + assert r2.data == "new value" + assert len(r2.errors) == 1 + +def test_result_with_errors_appends_batch() -> None: + r1: Result[str] = Result(data="hello") + errs = [ + ErrorInfo(kind=ErrorKind.NETWORK, message="a", source="t"), + ErrorInfo(kind=ErrorKind.AUTH, message="b", source="t"), + ] + r2 = r1.with_errors(errs) + assert r1.errors == [] + assert r2.errors == errs + assert r2.data == "hello" + +def test_result_is_frozen() -> None: + from dataclasses import FrozenInstanceError + r: Result[str] = Result(data="x") + with pytest.raises(FrozenInstanceError): + r.data = "y" + +def test_nil_path_singleton_has_default_values() -> None: + assert NilPath.exists is False + assert NilPath.read_text == "" + assert NilPath.errors == [] + assert isinstance(NilPath(), NilPath) + +def test_nil_rag_state_singleton_has_default_values() -> None: + assert NilRAGState.enabled is False + assert NilRAGState.is_empty_result is True + assert NilRAGState.errors == []