from datetime import datetime from django.contrib.auth import get_user_model from django.test import TestCase from django.urls import reverse from helpdesk.models import Checklist, ChecklistTask, ChecklistTemplate, Queue, Ticket class TicketChecklistTestCase(TestCase): @classmethod def setUpTestData(cls): user = get_user_model().objects.create_user("User", password="pass") user.is_staff = True user.save() cls.user = user def setUp(self) -> None: self.client.login(username="User", password="pass") self.ticket = Ticket.objects.create( queue=Queue.objects.create(title="Queue", slug="queue") ) def test_create_checklist(self): self.assertEqual(self.ticket.checklists.count(), 0) checklist_name = "test empty checklist" response = self.client.post( reverse("helpdesk:view", kwargs={"ticket_id": self.ticket.id}), data={"name": checklist_name}, follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/checklist_form.html") self.assertContains(response, checklist_name) self.assertEqual(self.ticket.checklists.count(), 1) def test_create_checklist_from_template(self): self.assertEqual(self.ticket.checklists.count(), 0) checklist_name = "test checklist from template" checklist_template = ChecklistTemplate.objects.create( name="Test template", task_list=["first", "second", "last"] ) response = self.client.post( reverse("helpdesk:view", kwargs={"ticket_id": self.ticket.id}), data={"name": checklist_name, "checklist_template": checklist_template.id}, follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/checklist_form.html") self.assertContains(response, checklist_name) self.assertEqual(self.ticket.checklists.count(), 1) created_checklist = self.ticket.checklists.get() self.assertEqual(created_checklist.tasks.count(), 3) self.assertEqual(created_checklist.tasks.all()[0].description, "first") self.assertEqual(created_checklist.tasks.all()[1].description, "second") self.assertEqual(created_checklist.tasks.all()[2].description, "last") def test_edit_checklist(self): checklist = self.ticket.checklists.create(name="Test checklist") first_task = checklist.tasks.create(description="First task", position=1) checklist.tasks.create(description="To delete task", position=2) url = reverse( "helpdesk:edit_ticket_checklist", kwargs={ "ticket_id": self.ticket.id, "checklist_id": checklist.id, }, ) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/checklist_form.html") self.assertContains(response, "Test checklist") self.assertContains(response, "First task") self.assertContains(response, "To delete task") response = self.client.post( url, data={ "name": "New name", "tasks-TOTAL_FORMS": 3, "tasks-INITIAL_FORMS": 2, "tasks-0-id": "1", "tasks-0-description": "First task edited", "tasks-0-position": "2", "tasks-1-id": "2", "tasks-1-description": "To delete task", "tasks-1-DELETE": "on", "tasks-1-position": "2", "tasks-2-description": "New first task", "tasks-2-position": "1", }, follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/ticket.html") checklist.refresh_from_db() self.assertEqual(checklist.name, "New name") self.assertEqual(checklist.tasks.count(), 2) first_task.refresh_from_db() self.assertEqual(first_task.description, "First task edited") self.assertEqual(checklist.tasks.all()[0].description, "New first task") self.assertEqual(checklist.tasks.all()[1].description, "First task edited") def test_delete_checklist(self): checklist = self.ticket.checklists.create(name="Test checklist") checklist.tasks.create(description="First task", position=1) self.assertEqual(Checklist.objects.count(), 1) self.assertEqual(ChecklistTask.objects.count(), 1) response = self.client.post( reverse( "helpdesk:delete_ticket_checklist", kwargs={"ticket_id": self.ticket.id, "checklist_id": checklist.id}, ), follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/ticket.html") self.assertEqual(Checklist.objects.count(), 0) self.assertEqual(ChecklistTask.objects.count(), 0) def test_mark_task_as_done(self): checklist = self.ticket.checklists.create(name="Test checklist") task = checklist.tasks.create(description="Task", position=1) self.assertIsNone(task.completion_date) self.assertEqual(self.ticket.followup_set.count(), 0) response = self.client.post( reverse("helpdesk:update", kwargs={"ticket_id": self.ticket.id}), data={f"checklist-{checklist.id}": task.id}, follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/ticket.html") self.assertEqual(self.ticket.followup_set.count(), 1) followup = self.ticket.followup_set.get() self.assertEqual(followup.ticketchange_set.count(), 1) self.assertEqual(followup.ticketchange_set.get().old_value, "To do") self.assertEqual(followup.ticketchange_set.get().new_value, "Completed") task.refresh_from_db() self.assertIsNotNone(task.completion_date) def test_mark_task_as_undone(self): checklist = self.ticket.checklists.create(name="Test checklist") task = checklist.tasks.create( description="Task", position=1, completion_date=datetime(2023, 5, 1) ) self.assertIsNotNone(task.completion_date) self.assertEqual(self.ticket.followup_set.count(), 0) response = self.client.post( reverse("helpdesk:update", kwargs={"ticket_id": self.ticket.id}), follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/ticket.html") self.assertEqual(self.ticket.followup_set.count(), 1) followup = self.ticket.followup_set.get() self.assertEqual(followup.ticketchange_set.count(), 1) self.assertEqual(followup.ticketchange_set.get().old_value, "Completed") self.assertEqual(followup.ticketchange_set.get().new_value, "To do") task.refresh_from_db() self.assertIsNone(task.completion_date) def test_display_checklist_templates(self): ChecklistTemplate.objects.create( name="Test checklist template", task_list=["first", "second", "third"] ) response = self.client.get(reverse("helpdesk:checklist_templates")) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/checklist_templates.html") self.assertContains(response, "Test checklist template") self.assertContains(response, "3 tasks") def test_create_checklist_template(self): self.assertEqual(ChecklistTemplate.objects.count(), 0) response = self.client.post( reverse("helpdesk:checklist_templates"), data={ "name": "Test checklist template", "task_list": '["first", "second", "third"]', }, follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/checklist_templates.html") self.assertEqual(ChecklistTemplate.objects.count(), 1) checklist_template = ChecklistTemplate.objects.get() self.assertEqual(checklist_template.name, "Test checklist template") self.assertEqual(checklist_template.task_list, ["first", "second", "third"]) def test_edit_checklist_template(self): checklist_template = ChecklistTemplate.objects.create( name="Test checklist template", task_list=["first", "second", "third"] ) self.assertEqual(ChecklistTemplate.objects.count(), 1) response = self.client.post( reverse( "helpdesk:edit_checklist_template", kwargs={"checklist_template_id": checklist_template.id}, ), data={ "name": "New checklist template", "task_list": '["new first", "second", "third", "last"]', }, follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/checklist_templates.html") self.assertEqual(ChecklistTemplate.objects.count(), 1) checklist_template.refresh_from_db() self.assertEqual(checklist_template.name, "New checklist template") self.assertEqual( checklist_template.task_list, ["new first", "second", "third", "last"] ) def test_delete_checklist_template(self): checklist_template = ChecklistTemplate.objects.create( name="Test checklist template", task_list=["first", "second", "third"] ) self.assertEqual(ChecklistTemplate.objects.count(), 1) response = self.client.post( reverse( "helpdesk:delete_checklist_template", kwargs={"checklist_template_id": checklist_template.id}, ), follow=True, ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "helpdesk/checklist_templates.html") self.assertEqual(ChecklistTemplate.objects.count(), 0)