49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
"""Tests for the SourceConnector base protocol and shared types."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
import pytest
|
|
|
|
from app.scouts.connectors.base import (
|
|
ItemContent,
|
|
ItemMetadata,
|
|
ItemRef,
|
|
TriageVerdict,
|
|
)
|
|
|
|
|
|
def test_item_ref_round_trips_through_pydantic():
|
|
ref = ItemRef(source_msg_ref="abc123", received_at=datetime.now(tz=timezone.utc))
|
|
parsed = ItemRef.model_validate(ref.model_dump())
|
|
assert parsed.source_msg_ref == "abc123"
|
|
assert parsed.received_at == ref.received_at
|
|
|
|
|
|
def test_item_metadata_allows_all_optional():
|
|
meta = ItemMetadata()
|
|
assert meta.subject is None
|
|
assert meta.sender is None
|
|
assert meta.snippet is None
|
|
assert meta.received_at is None
|
|
|
|
|
|
def test_item_content_requires_metadata_and_body():
|
|
content = ItemContent(
|
|
metadata=ItemMetadata(subject="hi"),
|
|
body_text="hello world",
|
|
raw_headers={"X-Foo": "bar"},
|
|
)
|
|
assert content.metadata.subject == "hi"
|
|
assert content.body_text == "hello world"
|
|
assert content.raw_headers["X-Foo"] == "bar"
|
|
|
|
|
|
def test_triage_verdict_constraints():
|
|
v = TriageVerdict(verdict="relevant", reason="contains task language", confidence=0.92)
|
|
assert v.verdict == "relevant"
|
|
|
|
with pytest.raises(ValueError):
|
|
TriageVerdict(verdict="meh", reason="x", confidence=0.5) # bad enum value
|