Implement plans

This commit is contained in:
2026-03-04 02:19:22 +00:00
parent 34ee49410d
commit 0718a06c19
31 changed files with 3987 additions and 181 deletions

View File

@@ -1,5 +1,7 @@
from __future__ import annotations
from unittest.mock import AsyncMock, patch
from django.test import TestCase
from django.urls import reverse
@@ -73,6 +75,16 @@ class TasksPagesManagementTests(TestCase):
).exists()
)
def test_tasks_hub_settings_link_preserves_scope_context(self):
response = self.client.get(
f"{reverse('tasks_hub')}?person={self.person.id}&service=signal&identifier=147e75bd-91b7-4014-b9e5-12a44b978f7b"
)
self.assertEqual(200, response.status_code)
self.assertContains(
response,
f"{reverse('tasks_settings')}?person={self.person.id}&service=signal&identifier=147e75bd-91b7-4014-b9e5-12a44b978f7b",
)
def test_project_page_can_create_and_delete_epic(self):
project = TaskProject.objects.create(user=self.user, name="Roadmap")
create_response = self.client.post(
@@ -98,6 +110,81 @@ class TasksPagesManagementTests(TestCase):
self.assertEqual(200, delete_response.status_code)
self.assertFalse(TaskEpic.objects.filter(project=project, name="Phase 1").exists())
def test_project_page_can_assign_and_clear_task_epic(self):
project = TaskProject.objects.create(user=self.user, name="Roadmap")
epic = TaskEpic.objects.create(project=project, name="Sprint A")
session = ChatSession.objects.create(user=self.user, identifier=self.pid_signal)
origin = Message.objects.create(
user=self.user,
session=session,
ts=1_700_000_000_100,
text="task: assign epic",
sender_uuid="+15551230000",
custom_author="OTHER",
source_service="signal",
source_chat_id="+15551230000",
)
task = DerivedTask.objects.create(
user=self.user,
project=project,
title="Assign me",
source_service="signal",
source_channel="+15551230000",
origin_message=origin,
reference_code="9",
status_snapshot="open",
)
assign_response = self.client.post(
reverse("tasks_project", kwargs={"project_id": str(project.id)}),
{
"action": "task_set_epic",
"task_id": str(task.id),
"epic_id": str(epic.id),
},
follow=True,
)
self.assertEqual(200, assign_response.status_code)
task.refresh_from_db()
self.assertEqual(epic.id, task.epic_id)
clear_response = self.client.post(
reverse("tasks_project", kwargs={"project_id": str(project.id)}),
{
"action": "task_set_epic",
"task_id": str(task.id),
"epic_id": "",
},
follow=True,
)
self.assertEqual(200, clear_response.status_code)
task.refresh_from_db()
self.assertIsNone(task.epic_id)
@patch("core.views.tasks.send_message_raw", new_callable=AsyncMock)
def test_project_epic_create_announces_to_project_chats(self, mocked_send):
project = TaskProject.objects.create(user=self.user, name="Roadmap")
ChatTaskSource.objects.create(
user=self.user,
service="whatsapp",
channel_identifier="120363402761690215@g.us",
project=project,
enabled=True,
)
response = self.client.post(
reverse("tasks_project", kwargs={"project_id": str(project.id)}),
{
"action": "epic_create",
"name": "Phase 2",
},
follow=True,
)
self.assertEqual(200, response.status_code)
self.assertTrue(TaskEpic.objects.filter(project=project, name="Phase 2").exists())
self.assertTrue(mocked_send.await_count >= 1)
payloads = [str(call.kwargs.get("text") or "") for call in mocked_send.await_args_list]
self.assertTrue(any("whatsapp usage" in row.lower() for row in payloads))
self.assertTrue(any("add task to epic" in row.lower() for row in payloads))
def test_group_page_create_and_map_project(self):
response = self.client.post(
reverse(
@@ -156,6 +243,36 @@ class TasksPagesManagementTests(TestCase):
self.assertEqual(200, response.status_code)
self.assertContains(response, "Scope Person")
def test_project_page_creator_column_links_to_compose(self):
project = TaskProject.objects.create(user=self.user, name="Creator Link Test")
session = ChatSession.objects.create(user=self.user, identifier=self.pid_signal)
origin = Message.objects.create(
user=self.user,
session=session,
ts=1_700_000_000_111,
text="task: creator link",
sender_uuid="+15551230000",
custom_author="OTHER",
source_service="signal",
source_chat_id="+15551230000",
)
DerivedTask.objects.create(
user=self.user,
project=project,
title="Creator link task",
source_service="signal",
source_channel="+15551230000",
origin_message=origin,
reference_code="2",
status_snapshot="open",
)
response = self.client.get(reverse("tasks_project", kwargs={"project_id": str(project.id)}))
self.assertEqual(200, response.status_code)
self.assertContains(
response,
f'{reverse("compose_page")}?service=signal&identifier=%2B15551230000&person={self.person.id}',
)
def test_task_detail_renders_payload_summary_and_json(self):
project = TaskProject.objects.create(user=self.user, name="Payload Test")
session = ChatSession.objects.create(user=self.user, identifier=self.pid_signal)