phase 14-15: docker build validation and helm deployment
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
"""Tests for adapter base interface and result types."""
|
||||
from datetime import datetime
|
||||
|
||||
from services.adapters.base import AdapterResult, BaseAdapter
|
||||
|
||||
|
||||
class TestAdapterResult:
|
||||
def test_ok_when_items_and_no_error(self):
|
||||
r = AdapterResult(
|
||||
source_type="market_api",
|
||||
ticker="AAPL",
|
||||
items=[{"price": 150}],
|
||||
raw_payload=b'{"price":150}',
|
||||
content_hash="abc123",
|
||||
fetched_at=datetime(2026, 4, 11),
|
||||
)
|
||||
assert r.ok is True
|
||||
assert r.item_count == 1
|
||||
|
||||
def test_not_ok_when_error(self):
|
||||
r = AdapterResult(
|
||||
source_type="market_api",
|
||||
ticker="AAPL",
|
||||
items=[],
|
||||
raw_payload=b"",
|
||||
content_hash="",
|
||||
fetched_at=datetime(2026, 4, 11),
|
||||
error="timeout",
|
||||
)
|
||||
assert r.ok is False
|
||||
|
||||
def test_not_ok_when_empty_items(self):
|
||||
r = AdapterResult(
|
||||
source_type="news_api",
|
||||
ticker="MSFT",
|
||||
items=[],
|
||||
raw_payload=b"{}",
|
||||
content_hash="def456",
|
||||
fetched_at=datetime(2026, 4, 11),
|
||||
)
|
||||
assert r.ok is False
|
||||
|
||||
def test_http_metadata_defaults(self):
|
||||
r = AdapterResult(
|
||||
source_type="market_api",
|
||||
ticker="AAPL",
|
||||
items=[{"x": 1}],
|
||||
raw_payload=b"x",
|
||||
content_hash="h",
|
||||
fetched_at=datetime(2026, 4, 11),
|
||||
)
|
||||
assert r.http_status is None
|
||||
assert r.response_time_ms is None
|
||||
assert r.metadata == {}
|
||||
|
||||
|
||||
class _StubAdapter(BaseAdapter):
|
||||
async def fetch(self, ticker, config):
|
||||
return AdapterResult(
|
||||
source_type="market_api",
|
||||
ticker=ticker,
|
||||
items=[],
|
||||
raw_payload=b"",
|
||||
content_hash="",
|
||||
fetched_at=datetime(2026, 4, 11),
|
||||
)
|
||||
|
||||
def source_type(self):
|
||||
return "market_api"
|
||||
|
||||
|
||||
class _FilingsStub(BaseAdapter):
|
||||
async def fetch(self, ticker, config):
|
||||
return AdapterResult(
|
||||
source_type="filings_api",
|
||||
ticker=ticker,
|
||||
items=[],
|
||||
raw_payload=b"",
|
||||
content_hash="",
|
||||
fetched_at=datetime(2026, 4, 11),
|
||||
)
|
||||
|
||||
def source_type(self):
|
||||
return "filings_api"
|
||||
|
||||
|
||||
class TestBaseAdapterHelpers:
|
||||
def test_bucket_name_market(self):
|
||||
adapter = _StubAdapter()
|
||||
assert adapter.bucket_name() == "stonks-raw-market"
|
||||
|
||||
def test_bucket_name_filings(self):
|
||||
adapter = _FilingsStub()
|
||||
assert adapter.bucket_name() == "stonks-raw-filings"
|
||||
|
||||
def test_artifact_path_format(self):
|
||||
adapter = _StubAdapter()
|
||||
now = datetime(2026, 4, 11, 14, 30)
|
||||
path = adapter.artifact_path("AAPL", "doc-123", now)
|
||||
assert path == "market_api/AAPL/2026/04/11/doc-123/raw.json"
|
||||
Reference in New Issue
Block a user