from django.contrib.auth import get_user_model from django.core.cache import cache from django.test import TestCase from django.urls import reverse class ServerStatsTests(TestCase): def setUp(self): User = get_user_model() self.staff = User.objects.create_user( username='Boss', password='pw', is_staff=True, ) self.normal = User.objects.create_user(username='NormalUser', password='pw') cache.clear() def _authorized(self, user=None): session = self.client.session session['authorized'] = True session.save() if user is not None: self.client.force_login(user) return session def test_staff_api_returns_snapshot(self): self._authorized(self.staff) resp = self.client.get(reverse('landing:server_stats_api')) self.assertEqual(resp.status_code, 200) data = resp.json() for key in ('app', 'system', 'content', 'recent', 'generated_at'): self.assertIn(key, data) self.assertIn('users', data['content']) self.assertIn('versions', data['recent']) def test_api_payload_cached(self): self._authorized(self.staff) first = self.client.get(reverse('landing:server_stats_api')).json() second = self.client.get(reverse('landing:server_stats_api')).json() self.assertEqual(first['generated_at'], second['generated_at']) def test_non_staff_api_forbidden(self): self._authorized(self.normal) resp = self.client.get(reverse('landing:server_stats_api')) self.assertEqual(resp.status_code, 403) self.assertEqual(resp.json()['detail'], 'Only staff can view server stats.') def test_page_is_staff_shell(self): self._authorized(self.staff) resp = self.client.get(reverse('landing:server_stats')) self.assertEqual(resp.status_code, 200) self.assertContains(resp, 'stats-updated') self.assertContains(resp, '/api/stats/') def test_page_forbidden_for_non_staff(self): self._authorized(self.normal) resp = self.client.get(reverse('landing:server_stats')) self.assertEqual(resp.status_code, 403) def test_anonymous_redirects_to_login(self): self._authorized() resp = self.client.get(reverse('landing:server_stats')) self.assertEqual(resp.status_code, 302)