From c1f2ad16c809c5892a1a2760228ae805e7ef59cf Mon Sep 17 00:00:00 2001 From: orzionpour Date: Thu, 25 Nov 2021 11:33:46 +0200 Subject: [PATCH] Add create_task function - Add a function "create_task" to add task to DB - Add tests for the above function Co-Authored-By: Kobi Hakimi --- tasks/models.py | 25 +++++- tasks/tests/test_create_task.py | 154 ++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 tasks/tests/test_create_task.py diff --git a/tasks/models.py b/tasks/models.py index 6bdb404..8f22a6b 100644 --- a/tasks/models.py +++ b/tasks/models.py @@ -1,6 +1,6 @@ from django.db import models from enumchoicefield import ChoiceEnum, EnumChoiceField -from users.models import User +from users.models import Role, User class Status(ChoiceEnum): @@ -53,6 +53,29 @@ def filter_by_symbol(cls, priority_filter): print(priority_filter) return cls.objects.filter(priority=priority_filter) + @classmethod + def create_task(cls, title, assignee, assigner, priority, status, description): + if not title or title == "": + raise ValueError("Must add title") + if not isinstance(priority, Priority): + raise ValueError("Must use Priority enum") + if not isinstance(status, Status): + raise ValueError("Must use Status enum") + assigner_role = assigner.role + assigner_team = assigner.team_id + assigne_team = assignee.team_id + if assigne_team != assigner_team: + raise ValueError("Manager can assign tasks only for his own employees") + if assigner_role != Role.MANAGER: + raise ValueError("User must be a manager to assign tasks") + task = Task.objects.create(title=title, + assignee=assignee, + created_by=assigner, + priority=priority, + status=status, + description=description) + return task + class Comment(models.Model): appUser = models.ForeignKey( diff --git a/tasks/tests/test_create_task.py b/tasks/tests/test_create_task.py new file mode 100644 index 0000000..5e34c5e --- /dev/null +++ b/tasks/tests/test_create_task.py @@ -0,0 +1,154 @@ +import pytest +from tasks.models import Priority, Status, Task +from users.models import User, Team, Role +from django.contrib.auth.models import User as DjangoUser + + +@pytest.mark.django_db +class TestCreateTask: + """ + Add test team to DB + """ + @pytest.fixture + def team(self): + team = Team(name="TestTeam", + description="This is a test team") + team.save() + return team + + """ + Add another test team to DB + """ + @pytest.fixture + def other_team(self): + team = Team(name="TestOtherTeam", + description="This is a test team") + team.save() + return team + + """ + Add manager user to the DB + """ + @pytest.fixture + def manager(self, team): + django_user = DjangoUser.objects.create_user(username="TestManager", + email="example@gmail.com", + password='xsdDS23', + first_name="Test", + last_name="Test") + manager = User.objects.create(user=django_user, + role=Role.MANAGER, + team=team) + manager.save() + return manager + + """ + Add an employee to the team in "team" fixture + """ + @pytest.fixture + def employee(self, team): + django_user = DjangoUser.objects.create_user(username="TestEmployee", + email="example@gmail.com", + password='xsdDS23', + first_name="Test", + last_name="Test") + employee = User.objects.create(user=django_user, + role=Role.EMPLOYEE, + team=team) + employee.save() + return employee + + """ + Add an employee to the team in "other_team" fixture + """ + @pytest.fixture + def employee_other_team(self, other_team): + django_user = DjangoUser.objects.create_user(username="TestEmployee", + email="example@gmail.com", + password='xsdDS23', + first_name="Test", + last_name="Test") + employee = User.objects.create(user=django_user, + role=Role.EMPLOYEE, + team=other_team) + employee.save() + return employee + + """ + Test add new task + """ + def test_add_task_to_db(self, manager, employee): + Task.create_task(title="TestTask", + assignee=employee, + assigner=manager, + priority=Priority.CRITICAL, + status=Status.BACKLOG, + description="This is a test task") + assert len(Task.objects.all()) == 1 + + """ + Test that a user who is not manager cannot assign task to other + teams employees. + """ + def test_assigned_by_non_manager(self, manager, employee): + assert employee.role != Role.MANAGER + with pytest.raises(ValueError): + Task.create_task(title="TestTask", + assignee=manager, + assigner=employee, + priority=Priority.CRITICAL, + status=Status.BACKLOG, + description="This is a test task") + assert len(Task.objects.all()) == 0 + + """ + Test that title is required when creating a task. + """ + def test_no_title(self, manager, employee): + with pytest.raises(ValueError): + Task.create_task(title="", + assignee=employee, + assigner=manager, + priority=Priority.CRITICAL, + status=Status.BACKLOG, + description="This is a test task") + assert len(Task.objects.all()) == 0 + + """ + Test that priority must be a valid enum value + """ + def test_invalid_priority(self, manager, employee): + with pytest.raises(ValueError): + Task.create_task(title="TestTask", + assignee=employee, + assigner=manager, + priority='INVALID', + status=Status.BACKLOG, + description="This is a test task") + assert len(Task.objects.all()) == 0 + + """ + Test that status must be a valid enum value + """ + def test_invalid_status(self, manager, employee): + with pytest.raises(ValueError): + Task.create_task(title="TestTask", + assignee=employee, + assigner=manager, + priority=Priority.CRITICAL, + status='INVALID', + description="This is a test task") + assert len(Task.objects.all()) == 0 + + """ + Test that manager cannot assign task to other teams employees + """ + def test_assign_other_team(self, manager, employee_other_team): + with pytest.raises(ValueError): + Task.create_task(title="TestTask", + assignee=employee_other_team, + assigner=manager, + priority=Priority.CRITICAL, + status=Status.BACKLOG, + description="This is a test task") + assert len(Task.objects.all()) == 0