from __future__ import annotations from django.core.management import call_command from django.test import TestCase from core.models import ( ChatSession, ContactAvailabilityEvent, Person, PersonIdentifier, Message, User, ) from core.presence.inference import now_ms class BackfillContactAvailabilityCommandTests(TestCase): def setUp(self): self.user = User.objects.create_user("backfill-user", "backfill@example.com", "x") self.person = Person.objects.create(user=self.user, name="Backfill Person") self.identifier = PersonIdentifier.objects.create( user=self.user, person=self.person, service="signal", identifier="+15551234567", ) self.session = ChatSession.objects.create(user=self.user, identifier=self.identifier) def test_backfill_creates_message_and_read_receipt_availability_events(self): base_ts = now_ms() Message.objects.create( user=self.user, session=self.session, ts=base_ts, text="hello", source_service="signal", source_chat_id="+15551234567", custom_author="OTHER", ) Message.objects.create( user=self.user, session=self.session, ts=base_ts + 1000, text="hey", source_service="signal", source_chat_id="+15551234567", custom_author="USER", read_ts=base_ts + 2000, read_by_identifier="+15551234567", ) call_command( "backfill_contact_availability", "--days", "36500", "--limit", "100", ) events = list( ContactAvailabilityEvent.objects.filter(user=self.user).order_by("ts", "source_kind") ) self.assertEqual(3, len(events)) self.assertTrue(any(row.source_kind == "message_in" for row in events)) self.assertTrue(any(row.source_kind == "message_out" for row in events)) self.assertTrue(any(row.source_kind == "read_receipt" for row in events))