summaryrefslogtreecommitdiff
path: root/tests/test_ingestion.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_ingestion.py')
-rw-r--r--tests/test_ingestion.py48
1 files changed, 47 insertions, 1 deletions
diff --git a/tests/test_ingestion.py b/tests/test_ingestion.py
index 3b7db16..857f1aa 100644
--- a/tests/test_ingestion.py
+++ b/tests/test_ingestion.py
@@ -4,10 +4,11 @@ from sqlalchemy import select
from srht_contrib.config import Settings
from srht_contrib.jobs.poller import PollerService
-from srht_contrib.models import SyncState, TrackedActor, TrackedRepository
+from srht_contrib.models import ServiceBackfillState, SyncState, TrackedActor, TrackedRepository
from srht_contrib.schemas import NormalizedEvent
from srht_contrib.services.git import GitIngestionService, GitPollResult
from srht_contrib.services.todo import TodoIngestionService, TodoPollResult
+from srht_contrib.services.types import BackfillBatchResult
class StubClient:
@@ -37,6 +38,9 @@ class RecordingTodoService:
events = self.events_by_call.pop(0)
return TodoPollResult(events=events, cursor="2026-03-31T00:00:00+00:00")
+ def fetch_backfill_batch(self, actor: str, cursor_state: dict | None = None) -> BackfillBatchResult:
+ return BackfillBatchResult(events=[], cursor_state=None, complete=True)
+
class EmptyGitService:
service_name = "git"
@@ -54,6 +58,30 @@ class EmptyGitService:
def fetch_recent_events(self, actor: str, since: datetime | None = None, repositories=None) -> GitPollResult:
return GitPollResult(events=[], cursor="2026-03-31T00:00:00+00:00")
+ def fetch_backfill_batch(self, actor: str, cursor_state: dict | None = None) -> BackfillBatchResult:
+ return BackfillBatchResult(events=[], cursor_state=None, complete=True)
+
+
+class BackfillingTodoService:
+ service_name = "todo"
+
+ def fetch_recent_events(self, actor: str, since: datetime | None = None) -> TodoPollResult:
+ return TodoPollResult(events=[], cursor="2026-03-31T00:00:00+00:00")
+
+ def fetch_backfill_batch(self, actor: str, cursor_state: dict | None = None) -> BackfillBatchResult:
+ event = NormalizedEvent(
+ service="todo",
+ event_type="ticket_created",
+ actor=actor,
+ repo_name="todo",
+ resource_id="backfill-ticket",
+ external_uid=f"todo:backfill:{actor}",
+ occurred_at=datetime(2024, 1, 1, 12, 0, tzinfo=UTC),
+ weight=1.0,
+ raw_payload_json=None,
+ )
+ return BackfillBatchResult(events=[event], cursor_state=None, complete=True)
+
def make_settings(**overrides) -> Settings:
values = {
@@ -424,3 +452,21 @@ def test_scheduled_poll_polls_known_actors_and_seeds_default_actor(db_session) -
assert [actor.actor for actor in tracked_actors] == ["~default", "~known"]
assert all(actor.last_poll_status == "indexed" for actor in tracked_actors)
assert all(actor.last_polled_at is not None for actor in tracked_actors)
+
+
+def test_poll_marks_backfill_complete_and_persists_service_state(db_session) -> None:
+ poller = PollerService(todo_service=BackfillingTodoService(), git_service=EmptyGitService())
+
+ inserted = poller.poll_all(db_session, "~ccleberg")
+
+ tracked_actor = db_session.scalar(select(TrackedActor).where(TrackedActor.actor == "~ccleberg"))
+ service_states = db_session.scalars(
+ select(ServiceBackfillState).where(ServiceBackfillState.actor == "~ccleberg").order_by(ServiceBackfillState.service)
+ ).all()
+
+ assert inserted == 1
+ assert tracked_actor is not None
+ assert tracked_actor.backfill_status == "completed"
+ assert tracked_actor.backfill_completed_at is not None
+ assert [state.service for state in service_states] == ["git", "todo"]
+ assert all(state.status == "completed" for state in service_states)