from __future__ import annotations from django.test import TestCase from django.urls import reverse from core.models import ( ContactAvailabilityEvent, ContactAvailabilitySettings, Person, User, ) class AvailabilitySettingsPageTests(TestCase): def setUp(self): self.user = User.objects.create_user("avail-user", "avail@example.com", "x") self.client.force_login(self.user) def test_get_page_renders(self): response = self.client.get(reverse("availability_settings")) self.assertEqual(200, response.status_code) self.assertContains(response, "Availability Settings") def test_post_updates_settings(self): response = self.client.post( reverse("availability_settings"), { "enabled": "1", "show_in_chat": "1", "show_in_groups": "0", "inference_enabled": "1", "retention_days": "120", "fade_threshold_seconds": "300", }, ) self.assertEqual(200, response.status_code) row = ContactAvailabilitySettings.objects.get(user=self.user) self.assertTrue(row.enabled) self.assertTrue(row.show_in_chat) self.assertFalse(row.show_in_groups) self.assertTrue(row.inference_enabled) self.assertEqual(120, row.retention_days) self.assertEqual(300, row.fade_threshold_seconds) def test_contact_event_stats_are_aggregated(self): person = Person.objects.create(user=self.user, name="Alice") ContactAvailabilityEvent.objects.create( user=self.user, person=person, service="whatsapp", source_kind="message_in", availability_state="available", confidence=0.9, ts=1000, payload={}, ) ContactAvailabilityEvent.objects.create( user=self.user, person=person, service="whatsapp", source_kind="inferred_timeout", availability_state="fading", confidence=0.5, ts=2000, payload={}, ) response = self.client.get(reverse("availability_settings")) self.assertEqual(200, response.status_code) stats = list(response.context["contact_stats"]) self.assertEqual(1, len(stats)) self.assertEqual("Alice", stats[0]["person__name"]) self.assertEqual(2, stats[0]["total_events"]) self.assertEqual(1, stats[0]["available_events"]) self.assertEqual(1, stats[0]["fading_events"]) self.assertEqual(1, stats[0]["message_activity_events"]) self.assertEqual(1, stats[0]["inferred_timeout_events"])