Improve tasks and align page elements
This commit is contained in:
163
core/tests/test_tasks_settings_and_toggle.py
Normal file
163
core/tests/test_tasks_settings_and_toggle.py
Normal 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()
|
||||
Reference in New Issue
Block a user