summaryrefslogtreecommitdiff
path: root/tests/test_git_repository_cache.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_git_repository_cache.py')
-rw-r--r--tests/test_git_repository_cache.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/tests/test_git_repository_cache.py b/tests/test_git_repository_cache.py
new file mode 100644
index 0000000..98a3db3
--- /dev/null
+++ b/tests/test_git_repository_cache.py
@@ -0,0 +1,107 @@
+from datetime import UTC, datetime
+
+from sqlalchemy import select
+
+from srht_contrib.config import Settings
+from srht_contrib.jobs.poller import PollerService
+from srht_contrib.models import DiscoveredRepository
+from srht_contrib.services.git import GitIngestionService
+from srht_contrib.services.todo import TodoIngestionService
+
+
+class StubClient:
+ def __init__(self, payload: dict | None = None, payloads_by_query: dict[str, dict] | None = None) -> None:
+ self.payload = payload or {}
+ self.payloads_by_query = payloads_by_query or {}
+ self.calls: list[tuple[str, dict | None]] = []
+
+ def execute(self, query: str, variables: dict | None = None) -> dict:
+ self.calls.append((query, variables))
+ for marker, payload in self.payloads_by_query.items():
+ if marker in query:
+ return payload
+ return self.payload
+
+
+def make_settings(**overrides) -> Settings:
+ values = {
+ "API_KEY": "test-api-key",
+ "ENABLE_SCHEDULER": False,
+ "SRHT_TOKEN": "x",
+ "DATABASE_URL": "sqlite://",
+ "DEFAULT_ACTOR": "~ccleberg",
+ "TODO_SRHT_ENDPOINT": "https://todo.sr.ht/query",
+ "GIT_SRHT_ENDPOINT": "https://git.sr.ht/query",
+ "POLL_INTERVAL_SECONDS": 60,
+ "GIT_TRACKED_REPOSITORIES": [],
+ "ACTOR_ALIASES_JSON": {"~ccleberg": ["[email protected]", "Chris Cleberg"]},
+ }
+ values.update(overrides)
+ return Settings(**values)
+
+
+def test_git_poll_reuses_cached_discovered_repositories(db_session) -> None:
+ settings = make_settings()
+ client = StubClient(
+ payloads_by_query={
+ "query UserRepositories": {
+ "user": {
+ "repositories": {
+ "results": [
+ {
+ "name": "Hutch",
+ "visibility": "PUBLIC",
+ "owner": {"canonicalName": "~ccleberg"},
+ }
+ ],
+ "cursor": None,
+ }
+ }
+ },
+ "query RepositoryLog": {
+ "user": {
+ "repository": {
+ "name": "Hutch",
+ "owner": {"canonicalName": "~ccleberg"},
+ "log": {
+ "results": [
+ {
+ "id": "abc123",
+ "shortId": "abc123",
+ "author": {
+ "name": "Chris Cleberg",
+ "email": "[email protected]",
+ "time": "2026-03-30T12:00:00Z",
+ },
+ "committer": {
+ "name": "Chris Cleberg",
+ "email": "[email protected]",
+ "time": "2026-03-30T12:00:00Z",
+ },
+ "message": "Auto-discovered repo commit",
+ }
+ ],
+ "cursor": None,
+ },
+ }
+ }
+ },
+ }
+ )
+ todo_service = TodoIngestionService(
+ StubClient(payload={"me": {"canonicalName": "~ccleberg"}, "events": {"results": [], "cursor": None}}),
+ settings,
+ )
+ git_service = GitIngestionService(client, settings)
+ poller = PollerService(todo_service=todo_service, git_service=git_service, settings=settings)
+
+ first_inserted = poller.poll_all(db_session, "~ccleberg")
+ second_inserted = poller.poll_all(db_session, "~ccleberg")
+
+ user_repository_calls = [call for call in client.calls if "query UserRepositories" in call[0]]
+ cached_names = db_session.scalars(select(DiscoveredRepository.name)).all()
+
+ assert first_inserted == 1
+ assert second_inserted == 0
+ assert len(user_repository_calls) == 1
+ assert cached_names == ["~ccleberg/Hutch"]