Coverage for website/photos/tests/test_views.py: 100.00%
170 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1import os
2from datetime import date
4from django.conf import settings
5from django.core.files.uploadedfile import SimpleUploadedFile
6from django.test import Client, TestCase, override_settings
7from django.urls import reverse
9from members.models import Member, Membership
10from photos.models import Album, Photo
13@override_settings(SUSPEND_SIGNALS=True)
14class AlbumIndexTest(TestCase):
15 fixtures = ["members.json"]
17 @classmethod
18 def setUpTestData(cls):
19 cls.member = Member.objects.filter(last_name="Wiggers").first()
20 cls.client = Client()
22 def setUp(self):
23 self.client.force_login(self.member)
25 def test_index(self):
26 with self.subTest(album_objects__count=Album.objects.count()):
27 response = self.client.get(reverse("photos:index"))
28 self.assertEqual(response.status_code, 200)
30 for i in range(12):
31 Album.objects.create(
32 title=f"test_album_a{i}",
33 date=date(year=2018, month=9, day=5),
34 slug=f"test_album_a{i}",
35 )
37 with self.subTest(album_objects__count=Album.objects.count()):
38 response = self.client.get(reverse("photos:index"))
39 self.assertEqual(response.status_code, 200)
40 self.assertEqual(len(response.context["albums"]), 12)
41 self.assertEqual(response.context["page_range"], range(1, 2))
43 for i in range(12):
44 Album.objects.create(
45 title=f"test_album_b{i}",
46 date=date(year=2018, month=9, day=5),
47 slug=f"test_album_b{i}",
48 )
50 with self.subTest(album_objects__count=Album.objects.count()):
51 response = self.client.get(reverse("photos:index"))
52 self.assertEqual(response.status_code, 200)
53 self.assertEqual(len(response.context["albums"]), 16)
54 self.assertEqual(response.context["page_range"], range(1, 3))
56 for i in range(72):
57 Album.objects.create(
58 title=f"test_album_c{i}",
59 date=date(year=2018, month=9, day=5),
60 slug=f"test_album_c{i}",
61 )
63 with self.subTest(album_objects__count=Album.objects.count()):
64 response = self.client.get(reverse("photos:index"))
65 self.assertEqual(response.status_code, 200)
66 self.assertEqual(len(response.context["albums"]), 16)
67 self.assertEqual(response.context["page_range"], range(1, 6))
69 def test_empty_page(self):
70 Album.objects.create(
71 title="test_album",
72 date=date(year=2018, month=9, day=5),
73 slug="test_album",
74 )
76 response = self.client.get(reverse("photos:index") + "?page=5")
77 self.assertEqual(response.status_code, 404)
79 def test_keywords(self):
80 Album.objects.create(
81 title="test_album1",
82 date=date(year=2018, month=9, day=5),
83 slug="test_album1",
84 )
86 Album.objects.create(
87 title="test_album12",
88 date=date(year=2018, month=9, day=5),
89 slug="test_album2",
90 )
92 Album.objects.create(
93 title="test_album3",
94 date=date(year=2018, month=9, day=5),
95 slug="test_album3",
96 )
98 for count, keywords in [(3, ""), (2, "1"), (1, "12"), (1, "3")]:
99 with self.subTest(keywords=keywords):
100 response = self.client.get(
101 reverse("photos:index") + f"?keywords={keywords}"
102 )
103 self.assertEqual(response.status_code, 200)
104 self.assertEqual(len(response.context["albums"]), count)
105 self.assertEqual(response.context["page_range"], range(1, 2))
107 def test_many_pages(self):
108 for i in range(120):
109 Album.objects.create(
110 title=f"test_album_{i}",
111 date=date(year=2018, month=9, day=5),
112 slug=f"test_album_{i}",
113 )
115 with self.subTest(page=1):
116 response = self.client.get(reverse("photos:index") + "?page=1")
117 self.assertEqual(response.status_code, 200)
118 self.assertEqual(len(response.context["albums"]), 16)
119 self.assertEqual(response.context["page_range"], range(1, 6))
121 with self.subTest(page=4):
122 response = self.client.get(reverse("photos:index") + "?page=4")
123 self.assertEqual(response.status_code, 200)
124 self.assertEqual(len(response.context["albums"]), 16)
125 self.assertEqual(response.context["page_range"], range(2, 7))
127 with self.subTest(page=8):
128 response = self.client.get(reverse("photos:index") + "?page=8")
129 self.assertEqual(response.status_code, 200)
130 self.assertEqual(len(response.context["albums"]), 8)
131 self.assertEqual(response.context["page_range"], range(4, 9))
134@override_settings(SUSPEND_SIGNALS=True)
135class AlbumTest(TestCase):
136 fixtures = ["members.json"]
138 @classmethod
139 def setUpTestData(cls):
140 cls.member = Member.objects.filter(username="testuser").first()
141 cls.client = Client()
143 def setUp(self):
144 self.album = Album.objects.create(
145 title="test_album",
146 date=date(year=2017, month=9, day=5),
147 slug="test_album",
148 )
150 self.client.force_login(self.member)
152 def test_get(self):
153 Membership.objects.create(
154 type=Membership.MEMBER,
155 user=self.member,
156 since=date(year=2015, month=1, day=1),
157 until=None,
158 )
160 for i in range(1, 4):
161 with open(
162 os.path.join(settings.BASE_DIR, f"photos/fixtures/poker_{i}.jpg"),
163 "rb",
164 ) as f:
165 fi = SimpleUploadedFile(
166 name=f"photo{i}.jpg",
167 content=f.read(),
168 content_type="image/jpeg",
169 )
170 photo = Photo(album=self.album, file=fi)
171 photo.save()
173 response = self.client.get(reverse("photos:album", args=(self.album.slug,)))
174 self.assertEqual(response.status_code, 200)
175 self.assertEqual(response.context["album"], self.album)
176 self.assertEqual(len(response.context["photos"]), 3)
178 def test_unaccessible(self):
179 Membership.objects.create(
180 type=Membership.MEMBER,
181 user=self.member,
182 since=date(year=2016, month=1, day=1),
183 until=date(year=2018, month=1, day=1),
184 )
186 with self.subTest():
187 self.album.date = date(year=2017, month=1, day=1)
188 self.album.save()
190 response = self.client.get(reverse("photos:album", args=(self.album.slug,)))
191 self.assertEqual(response.status_code, 200)
193 with self.subTest():
194 self.album.date = date(year=2018, month=9, day=5)
195 self.album.save()
197 response = self.client.get(reverse("photos:album", args=(self.album.slug,)))
198 self.assertEqual(response.status_code, 404)
201@override_settings(SUSPEND_SIGNALS=True)
202class SharedAlbumTest(TestCase):
203 fixtures = ["members.json"]
205 @classmethod
206 def setUpTestData(cls):
207 cls.member = Member.objects.filter(username="testuser").first()
208 cls.client = Client()
210 def setUp(self):
211 self.album = Album.objects.create(
212 title="test_album",
213 date=date(year=2017, month=9, day=5),
214 shareable=True,
215 slug="test_album",
216 )
218 def test_get(self):
219 for i in range(1, 4):
220 with open(
221 os.path.join(settings.BASE_DIR, f"photos/fixtures/poker_{i}.jpg"),
222 "rb",
223 ) as f:
224 file = SimpleUploadedFile(
225 name=f"photo{i}.jpg",
226 content=f.read(),
227 content_type="image/jpeg",
228 )
229 Photo.objects.create(album=self.album, file=file)
231 response = self.client.get(
232 reverse(
233 "photos:shared-album",
234 args=(
235 self.album.slug,
236 self.album.access_token,
237 ),
238 )
239 )
240 self.assertEqual(response.status_code, 200)
241 self.assertEqual(response.context["album"], self.album)
242 self.assertEqual(len(response.context["photos"]), 3)
245@override_settings(SUSPEND_SIGNALS=True)
246class DownloadTest(TestCase):
247 fixtures = ["members.json"]
249 @classmethod
250 def setUpTestData(cls):
251 cls.member = Member.objects.filter(last_name="Wiggers").first()
253 def setUp(self):
254 self.client = Client()
256 self.album = Album.objects.create(
257 title="test_album",
258 date=date(year=2017, month=9, day=5),
259 slug="test_album",
260 )
262 with open(
263 os.path.join(settings.BASE_DIR, "photos/fixtures/thom_assessor.png"), "rb"
264 ) as f:
265 file = SimpleUploadedFile(
266 name="photo.png", content=f.read(), content_type="image/png"
267 )
269 self.photo = Photo.objects.create(album=self.album, file=file)
271 def test_download(self):
272 self.client.force_login(self.member)
274 response = self.client.get(
275 reverse(
276 "photos:download",
277 args=(
278 self.album.slug,
279 self.photo,
280 ),
281 )
282 )
283 self.assertEqual(response.status_code, 302)
284 self.assertIn(
285 f"{settings.MEDIA_URL}{self.photo.file.name}", response.headers["Location"]
286 )
288 def test_logged_out(self):
289 response = self.client.get(
290 reverse(
291 "photos:download",
292 args=(
293 self.album.slug,
294 self.photo,
295 ),
296 )
297 )
298 self.assertEqual(response.status_code, 302)
299 self.assertIn("/user/account/login", response.headers["Location"])
302class _DownloadBaseTestCase(TestCase):
303 def setUp(self):
304 self.client = Client()
306 self.album = Album.objects.create(
307 title="test_album",
308 date=date(year=2017, month=9, day=5),
309 slug="test_album",
310 )
312 with open(
313 os.path.join(settings.BASE_DIR, "photos/fixtures/thom_assessor.png"), "rb"
314 ) as f:
315 file = SimpleUploadedFile(
316 name="photo.png", content=f.read(), content_type="image/png"
317 )
319 self.photo = Photo.objects.create(album=self.album, file=file)
322@override_settings(SUSPEND_SIGNALS=True)
323class SharedDownloadTest(_DownloadBaseTestCase):
324 fixtures = ["members.json"]
326 @classmethod
327 def setUpTestData(cls):
328 cls.member = Member.objects.filter(last_name="Wiggers").first()
329 cls.client = Client()
331 def test_download(self):
332 with self.subTest():
333 response = self.client.get(
334 reverse(
335 "photos:shared-download",
336 args=(
337 self.album.slug,
338 self.album.access_token,
339 self.photo,
340 ),
341 )
342 )
343 self.assertEqual(response.status_code, 302)
344 self.assertIn(
345 f"{settings.MEDIA_URL}{self.photo.file.name}",
346 response.headers["Location"],
347 )
349 self.client.force_login(self.member)
351 with self.subTest():
352 response = self.client.get(
353 reverse(
354 "photos:shared-download",
355 args=(
356 self.album.slug,
357 self.album.access_token,
358 self.photo,
359 ),
360 )
361 )
362 self.assertEqual(response.status_code, 302)
363 self.assertIn(
364 f"{settings.MEDIA_URL}{self.photo.file.name}",
365 response.headers["Location"],
366 )