70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
"""
|
|
Tests for exception hierarchy — catch patterns, attributes.
|
|
|
|
Demonstrates: TDD (Interview Topic 8) — testing exception design.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from core.chunker.exceptions import (
|
|
ChunkChecksumError,
|
|
ChunkError,
|
|
ChunkReadError,
|
|
PipelineError,
|
|
ProcessingError,
|
|
ProcessorFailureError,
|
|
ProcessorTimeoutError,
|
|
ReassemblyError,
|
|
)
|
|
|
|
|
|
class TestExceptionHierarchy:
|
|
"""Verify the exception class hierarchy and catch patterns."""
|
|
|
|
def test_pipeline_error_is_base(self):
|
|
"""All chunker exceptions inherit from PipelineError."""
|
|
assert issubclass(ChunkError, PipelineError)
|
|
assert issubclass(ProcessingError, PipelineError)
|
|
assert issubclass(ReassemblyError, PipelineError)
|
|
|
|
def test_chunk_error_subtypes(self):
|
|
"""ChunkReadError and ChunkChecksumError are ChunkErrors."""
|
|
assert issubclass(ChunkReadError, ChunkError)
|
|
assert issubclass(ChunkChecksumError, ChunkError)
|
|
|
|
def test_processing_error_subtypes(self):
|
|
"""ProcessorTimeoutError and ProcessorFailureError are ProcessingErrors."""
|
|
assert issubclass(ProcessorTimeoutError, ProcessingError)
|
|
assert issubclass(ProcessorFailureError, ProcessingError)
|
|
|
|
def test_catch_pipeline_error_catches_all(self):
|
|
"""Catching PipelineError catches any subtype."""
|
|
with pytest.raises(PipelineError):
|
|
raise ChunkReadError("test")
|
|
|
|
with pytest.raises(PipelineError):
|
|
raise ReassemblyError("test")
|
|
|
|
def test_checksum_error_attributes(self):
|
|
"""ChunkChecksumError carries sequence, expected, actual."""
|
|
err = ChunkChecksumError(sequence=5, expected="aaa", actual="bbb")
|
|
assert err.sequence == 5
|
|
assert err.expected == "aaa"
|
|
assert err.actual == "bbb"
|
|
assert "5" in str(err)
|
|
|
|
def test_timeout_error_attributes(self):
|
|
"""ProcessorTimeoutError carries sequence and timeout."""
|
|
err = ProcessorTimeoutError(sequence=3, timeout=30.0)
|
|
assert err.sequence == 3
|
|
assert err.timeout == 30.0
|
|
|
|
def test_failure_error_attributes(self):
|
|
"""ProcessorFailureError carries sequence, retries, original error."""
|
|
original = RuntimeError("boom")
|
|
err = ProcessorFailureError(sequence=1, retries=3, original_error=original)
|
|
assert err.sequence == 1
|
|
assert err.retries == 3
|
|
assert err.original_error is original
|
|
assert "boom" in str(err)
|