Improve tasks and align page elements

This commit is contained in:
2026-03-02 13:33:04 +00:00
parent e1de6d016d
commit 56c620473f
8 changed files with 387 additions and 47 deletions

View File

@@ -0,0 +1,163 @@
from __future__ import annotations
from unittest.mock import AsyncMock, patch
from asgiref.sync import async_to_sync
from django.test import TestCase, override_settings
from core.models import (
ChatSession,
ChatTaskSource,
DerivedTask,
Message,
Person,
PersonIdentifier,
TaskProject,
User,
)
from core.tasks.engine import process_inbound_task_intelligence
from core.views.compose import _command_options_for_channel, _toggle_task_announce_for_channel
from core.views.tasks import _apply_safe_defaults_for_user
class TaskSettingsBackfillTests(TestCase):
def setUp(self):
self.user = User.objects.create_user("defaults-user", "defaults@example.com", "x")
self.person = Person.objects.create(user=self.user, name="Defaults Person")
self.identifier = PersonIdentifier.objects.create(
user=self.user,
person=self.person,
service="whatsapp",
identifier="120363402761690215@g.us",
)
self.project = TaskProject.objects.create(
user=self.user,
name="Legacy Project",
settings={
"match_mode": "balanced",
"require_prefix": False,
"allowed_prefixes": ["task:", "todo:", "action:"],
"min_chars": 8,
},
)
self.source = ChatTaskSource.objects.create(
user=self.user,
service="whatsapp",
channel_identifier="120363402761690215@g.us",
project=self.project,
settings={
"match_mode": "balanced",
"require_prefix": False,
"allowed_prefixes": ["task:", "todo:", "action:"],
"min_chars": 8,
},
enabled=True,
)
def test_backfill_applies_safe_defaults_for_legacy_rows(self):
_apply_safe_defaults_for_user(self.user)
self.project.refresh_from_db()
self.source.refresh_from_db()
self.assertEqual("strict", self.project.settings.get("match_mode"))
self.assertTrue(bool(self.project.settings.get("require_prefix")))
self.assertEqual(["task:", "todo:"], self.project.settings.get("allowed_prefixes"))
self.assertFalse(bool(self.project.settings.get("announce_task_id")))
self.assertEqual("strict", self.source.settings.get("match_mode"))
self.assertTrue(bool(self.source.settings.get("require_prefix")))
class TaskAnnounceToggleTests(TestCase):
def setUp(self):
self.user = User.objects.create_user("toggle-user", "toggle@example.com", "x")
self.person = Person.objects.create(user=self.user, name="Toggle Person")
self.identifier = PersonIdentifier.objects.create(
user=self.user,
person=self.person,
service="whatsapp",
identifier="120363402761690215@g.us",
)
self.project = TaskProject.objects.create(user=self.user, name="Toggle Project")
self.source = ChatTaskSource.objects.create(
user=self.user,
service="whatsapp",
channel_identifier="120363402761690215@g.us",
project=self.project,
settings={"announce_task_id": False},
enabled=True,
)
def test_toggle_task_announce_updates_source_settings(self):
ok, err = _toggle_task_announce_for_channel(
user=self.user,
service="whatsapp",
identifier="120363402761690215",
enabled=True,
)
self.assertTrue(ok)
self.assertEqual("", err)
self.source.refresh_from_db()
self.assertTrue(bool(self.source.settings.get("announce_task_id")))
def test_command_options_include_task_announce_state(self):
options = _command_options_for_channel(
self.user,
"whatsapp",
"120363402761690215",
)
row = [opt for opt in options if opt.get("slug") == "task_announce"][0]
self.assertFalse(bool(row.get("enabled_here")))
@override_settings(TASK_DERIVATION_USE_AI=False)
class TaskAnnounceRuntimeTests(TestCase):
def setUp(self):
self.user = User.objects.create_user("runtime-user", "runtime@example.com", "x")
self.person = Person.objects.create(user=self.user, name="Runtime Person")
self.identifier = PersonIdentifier.objects.create(
user=self.user,
person=self.person,
service="whatsapp",
identifier="120363402761690215@g.us",
)
self.session = ChatSession.objects.create(user=self.user, identifier=self.identifier)
self.project = TaskProject.objects.create(user=self.user, name="Runtime Project")
def _seed_source(self, announce_enabled: bool):
return ChatTaskSource.objects.create(
user=self.user,
service="whatsapp",
channel_identifier="120363402761690215@g.us",
project=self.project,
settings={
"match_mode": "strict",
"require_prefix": True,
"allowed_prefixes": ["task:", "todo:"],
"announce_task_id": announce_enabled,
},
enabled=True,
)
def _msg(self, text: str, ts: int = 1000):
return Message.objects.create(
user=self.user,
session=self.session,
sender_uuid="peer",
text=text,
ts=ts,
source_service="whatsapp",
source_chat_id="120363402761690215@g.us",
)
def test_no_announce_send_when_disabled(self):
self._seed_source(False)
with patch("core.tasks.engine.send_message_raw", new=AsyncMock()) as mocked_send:
async_to_sync(process_inbound_task_intelligence)(self._msg("task: rotate secrets"))
self.assertTrue(DerivedTask.objects.exists())
mocked_send.assert_not_awaited()
def test_announce_send_when_enabled(self):
self._seed_source(True)
with patch("core.tasks.engine.send_message_raw", new=AsyncMock(return_value=True)) as mocked_send:
async_to_sync(process_inbound_task_intelligence)(self._msg("task: rotate secrets"))
self.assertTrue(DerivedTask.objects.exists())
mocked_send.assert_awaited()