Skip to content

Commit

Permalink
Add create_task function (#74)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>

* Refactor code

- Removed all save() operations and replaced with Django's default object creation.
- Changed user creation in tests to use create_user funciton.
- Removed raise of ValueError in cases where Django raises its own exception.

* Update test_create_task.py

Fixed flake8 errors

* Refactor create_task tests

Change the negative tests of create_task to be one  parameterized test.

* Refactor create_tasks tests

Co-authored-by: Kobi Hakimi <[email protected]>
  • Loading branch information
orzionpour and kobihk authored Nov 29, 2021
1 parent 57025ed commit a27e44f
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 2 deletions.
24 changes: 22 additions & 2 deletions tasks/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.db import models
from django.db import models, transaction
from enumchoicefield import ChoiceEnum, EnumChoiceField
from users.models import User
from users.models import Role, User


class Status(ChoiceEnum):
Expand Down Expand Up @@ -53,6 +53,26 @@ def filter_by_symbol(cls, priority_filter):
print(priority_filter)
return cls.objects.filter(priority=priority_filter)

@classmethod
@transaction.atomic
def create_task(cls, title, assignee, created_by, priority, status, description):
if title == "":
raise ValueError("Title must contain at lease one character")
assigner_role = created_by.role
assigner_team = created_by.team
assigne_team = assignee.team
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=created_by,
priority=priority,
status=status,
description=description)
return task

def update_status(self, status):
self.status = status
self.save()
Expand Down
103 changes: 103 additions & 0 deletions tasks/tests/test_create_task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import pytest
from tasks.models import Priority, Status, Task
from users.models import User, Team, Role


@pytest.mark.django_db
class TestCreateTask:
"""
Add test team to DB
"""
@pytest.fixture
def team(self):
team = Team.objects.create(name="TestTeam",
description="This is a test team")
return team

"""
Add another test team to DB
"""
@pytest.fixture
def other_team(self):
team = Team.objects.create(name="TestOtherTeam",
description="This is a test team")
return team

"""
Add manager user to the DB
"""
@pytest.fixture
def manager(self, team):
manager = User.create_user(username="TestManager",
email="[email protected]",
password='xsdDS23',
first_name='Test',
last_name='Test',
role=Role.MANAGER,
team=team)
return manager

"""
Add an employee to the team in "team" fixture
"""
@pytest.fixture
def employee(self, team):
employee = User.create_user(username="TestEmployee",
email="[email protected]",
password='xsdDS23',
first_name='Test',
last_name='Test',
role=Role.EMPLOYEE,
team=team)
return employee

"""
Add an employee to the team in "other_team" fixture
"""
@pytest.fixture
def employee_other_team(self, other_team):
employee = User.create_user(username="TestEmployee",
email="[email protected]",
password='xsdDS23',
first_name='Test',
last_name='Test',
role=Role.EMPLOYEE,
team=other_team)
return employee

@pytest.mark.parametrize('title, assignee, assigner, priority, status, description, length', [
('TestTask', 'employee', 'manager', Priority.CRITICAL, Status.BACKLOG,
'This is description', 1),
('TestTask', 'manager', 'employee', Priority.CRITICAL, Status.BACKLOG,
'This is description', 0),
('', 'employee', 'manager', Priority.CRITICAL, Status.BACKLOG,
'This is description', 0),
('TestTask', 'employee', 'manager', 'INVALID', Status.BACKLOG,
'This is description', 0),
('TestTask', 'employee', 'manager', Priority.CRITICAL, 'INVALID',
'This is description', 0),
('TestTask', 'employee_other_team', 'manager', Priority.CRITICAL, Status.BACKLOG,
'This is description', 0),
],
ids=[
"test_add_task_to_db",
"test_assigned_by_non_manager",
"test_no_title",
"test_invalid_priority",
"test_invalid_status",
"test_assign_other_team",
]
)
def test_create_task(self, request, title, assignee, assigner, priority, status, description, length):
assignee = request.getfixturevalue(assignee)
created_by = request.getfixturevalue(assigner)
try:
Task.create_task(title=title,
assignee=assignee,
created_by=created_by,
priority=priority,
status=status,
description=description)
except ValueError:
pass
assert len(Task.objects.all()) == length

0 comments on commit a27e44f

Please sign in to comment.