from datetime import timedelta from django.contrib.auth import get_user_model from django.test import TestCase from django.urls import reverse from django.utils import timezone from artifacts.models import Artifact User = get_user_model() class FeedUpdatesViewTestCase(TestCase): def setUp(self): self.user = User.objects.create_user(username="alice", password="pw") self.other = User.objects.create_user(username="bob", password="pw") self.client.force_login(self.user) self._n = 0 def make(self, owner=None, title="Note", source="agent"): self._n += 1 return Artifact.objects.create( id=f"upd{self._n:05d}", owner=owner or self.user, source=source, title=title, kind=Artifact.MARKDOWN, day=timezone.localdate(), path=f"{source}/x.html", original_kind=Artifact.MARKDOWN, size_bytes=1, ) def marker(self, seconds_ago=60): return (timezone.now() - timedelta(seconds=seconds_ago)).isoformat() def get(self, **params): return self.client.get(reverse("feed-updates"), params) def test_requires_login(self): self.client.logout() response = self.get(after=self.marker()) self.assertEqual(response.status_code, 302) def test_returns_new_since_marker(self): self.make(title="Fresh Post") response = self.get(after=self.marker()) self.assertEqual(response.status_code, 200) data = response.json() self.assertEqual(data["count"], 1) self.assertIn("Fresh Post", data["html"]) self.assertIn("newest", data) self.assertIn("today_label", data) def test_nothing_newer_than_now(self): self.make() response = self.get(after=self.marker(seconds_ago=-60)) # 60s in the future self.assertEqual(response.json()["count"], 0) def test_missing_marker_returns_zero(self): self.make() self.assertEqual(self.get().json()["count"], 0) def test_owner_scoped(self): self.make(owner=self.other, title="Not mine") data = self.get(after=self.marker()).json() self.assertEqual(data["count"], 0) def test_respects_source_filter(self): self.make(title="Hermes post", source="hermes") self.make(title="Janus post", source="janus") data = self.get(after=self.marker(), source="hermes").json() self.assertEqual(data["count"], 1) self.assertIn("Hermes post", data["html"]) self.assertNotIn("Janus post", data["html"])