"""The follow lists are complete sets, not pages. The SPA uses `GET /api/follows/tags/` (and pools) for two things: deciding a follow toggle's state, and rendering every card on the Followed page. With the standard 48-item pagination that silently broke past 48 follows — a 49th tag could not be followed (the toggle never saw it) and the page hid it. These tests pin the unpaginated behaviour. """ from django.contrib.auth import get_user_model from django.test import Client, TestCase from rest_framework.authtoken.models import Token from apps.follows.models import FollowedPool, FollowedTag User = get_user_model() class FollowListTests(TestCase): def setUp(self): self.user = User.objects.create_user( username="follow-user", password="follow-pass-123456" ) self.other = User.objects.create_user( username="follow-other", password="follow-pass-123456" ) self.client = self.api_client(self.user) self.other_client = self.api_client(self.other) def api_client(self, user): client = Client() client.defaults["HTTP_AUTHORIZATION"] = ( f"Token {Token.objects.create(user=user).key}" ) return client def test_tag_list_is_not_paginated_past_48(self): FollowedTag.objects.bulk_create( [ FollowedTag(user=self.user, tag=f"tag_{index:03d}") for index in range(60) ] ) response = self.client.get("/api/follows/tags/") self.assertEqual(response.status_code, 200) data = response.json() self.assertIsInstance(data, list, "the list must not be paginated") self.assertEqual(len(data), 60) self.assertEqual(data[0]["tag"], "tag_000") self.assertEqual(data[-1]["tag"], "tag_059") # The shape the SPA uses for its follow state. self.assertIn("unseen_count", data[0]) self.assertIn("id", data[0]) def test_pool_list_is_not_paginated(self): FollowedPool.objects.bulk_create( [ FollowedPool(user=self.user, pool_id=59000 + index, name=f"pool {index}") for index in range(55) ] ) data = self.client.get("/api/follows/pools/").json() self.assertIsInstance(data, list) self.assertEqual(len(data), 55) def test_lists_only_contain_the_callers_follows(self): FollowedTag.objects.create(user=self.user, tag="mine") FollowedTag.objects.create(user=self.other, tag="theirs") mine = self.client.get("/api/follows/tags/").json() theirs = self.other_client.get("/api/follows/tags/").json() self.assertEqual([row["tag"] for row in mine], ["mine"]) self.assertEqual([row["tag"] for row in theirs], ["theirs"]) def test_anonymous_cannot_list(self): self.assertEqual(Client().get("/api/follows/tags/").status_code, 401) self.assertEqual(Client().get("/api/follows/pools/").status_code, 401)