diff --git a/task_app/services.py b/task_app/services.py index 5b1bf7b..9ce2838 100644 --- a/task_app/services.py +++ b/task_app/services.py @@ -5,7 +5,7 @@ from user_app.models import User def create_or_update_subtasks(subtask_data, parent_task): current_subtasks = SubTask.objects.filter(task=parent_task) - current_subtask_ids = {str(sub.id): sub for sub in current_subtasks} # Speichere Objekte zur einfachen Aktualisierung + current_subtask_ids = {str(sub.id): sub for sub in current_subtasks} new_subtasks_to_create = [] subtasks_to_update = [] @@ -58,9 +58,9 @@ def assign_users_to_task(user_ids, task): users = User.objects.filter(id__in=user_ids) found_user_ids = set(users.values_list('id', flat=True)) missing_users = set(user_ids) - found_user_ids - + if missing_users: - raise APIException(f"Users not found: {', '.join(map(str, missing_users))}") # Konvertiere UUIDs zurück zu Strings für die Fehlermeldung + raise APIException(f"Users not found: {', '.join(map(str, missing_users))}") AssignedTask.objects.bulk_create( [AssignedTask(user=user, task=task) for user in users] diff --git a/task_app/tests/__init__.py b/task_app/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/task_app/tests.py b/task_app/tests/cache_tests.py similarity index 92% rename from task_app/tests.py rename to task_app/tests/cache_tests.py index 17d55f5..f53e0a3 100644 --- a/task_app/tests.py +++ b/task_app/tests/cache_tests.py @@ -1,9 +1,9 @@ from django.test import TestCase -from django.core.cache import cache from django.contrib.auth import get_user_model -from .models import Task, AssignedTask -from .caching import get_cached_task_by_id -from .choices import TaskStatus, TaskCategory, TaskPriority +from task_app.caching import get_cached_task_by_id +from task_app.models import Task, AssignedTask +from task_app.choices import TaskCategory, TaskPriority, TaskStatus +from django.core.cache import cache User = get_user_model() @@ -71,8 +71,8 @@ class TaskCacheTests(TestCase): def test_cache_invalidation_on_assigned_task_save(self): cache.clear() - AssignedTask.objects.create(user_id=self.user, task=self.task1) - + AssignedTask.objects.create(user=self.user, task=self.task1) + self.assertIsNone(cache.get(f"task_{self.task1.id}")) task = get_cached_task_by_id(self.task1.id) @@ -81,14 +81,14 @@ class TaskCacheTests(TestCase): def test_cache_invalidation_on_assigned_task_delete(self): cache.clear() - assigned_task = AssignedTask.objects.create(user_id=self.user, task=self.task1) + assigned_task = AssignedTask.objects.create(user=self.user, task=self.task1) assigned_task.delete() self.assertIsNone(cache.get(f"task_{self.task1.id}")) task = get_cached_task_by_id(self.task1.id) self.assertEqual(task, self.task1) - + def test_cache_serialization_error_handling(self): cache.set("task_corrupted", b"corrupted_data") cache.delete("task_corrupted") diff --git a/task_app/tests/models_tests.py b/task_app/tests/models_tests.py new file mode 100644 index 0000000..7a41d54 --- /dev/null +++ b/task_app/tests/models_tests.py @@ -0,0 +1,58 @@ +import uuid +from django.test import TestCase +from django.contrib.auth import get_user_model +from task_app.models import Task, SubTask, AssignedTask +from task_app.choices import TaskCategory, TaskPriority, TaskStatus + +User = get_user_model() + +class TaskModelTests(TestCase): + + def setUp(self): + user = User.objects.create(first_name="Test", last_name="User", email="test@example.com") + self.user = user + + def test_task_creation(self): + task = Task.objects.create( + title="Test Task 1", + description="Description 1", + category=TaskCategory.TECHNICAL_TASK, + priority=TaskPriority.LOW, + status=TaskStatus.TODO, + date="2025-01-01", + creator=self.user + ) + self.assertTrue(isinstance(task, Task)) + self.assertEqual(str(task), 'Test Task') + self.assertIsNotNone(task.id) + self.assertEqual(task.creator, self.user) + self.assertIsNotNone(task.created_at) + + def test_subtask_creation(self): + task = Task.objects.create(title='Parent Task', creator=self.user) + subtask = SubTask.objects.create(task=task, title='Test SubTask') + self.assertTrue(isinstance(subtask, SubTask)) + self.assertEqual(str(subtask), 'Parent Task - Test SubTask') + self.assertIsNotNone(subtask.id) + self.assertEqual(subtask.task, task) + self.assertEqual(subtask.status, False) + + def test_assigned_task_creation(self): + task = Task.objects.create(title='Assigned Task', creator=self.user) + assigned_user = User.objects.create(username='assigneduser') + assigned_task = AssignedTask.objects.create(user=assigned_user, task=task) + self.assertTrue(isinstance(assigned_task, AssignedTask)) + self.assertEqual(str(assigned_task), 'assigneduser - Assigned Task') + self.assertEqual(assigned_task.user, assigned_user) + self.assertEqual(assigned_task.task, task) + + def test_task_default_uuid(self): + task = Task.objects.create(title='UUID Task', creator=self.user) + self.assertTrue(isinstance(task.id, uuid.UUID)) + task2 = Task.objects.create(title='Another UUID Task', creator=self.user) + self.assertNotEqual(task.id, task2.id) + + def test_subtask_default_status(self): + task = Task.objects.create(title='Task with Subtask', creator=self.user) + subtask = SubTask.objects.create(task=task, title='Default Status Subtask') + self.assertFalse(subtask.status) \ No newline at end of file diff --git a/task_app/views.py b/task_app/views.py index 457de86..cde23e4 100644 --- a/task_app/views.py +++ b/task_app/views.py @@ -1,4 +1,3 @@ -import uuid from rest_framework import viewsets from rest_framework.response import Response from rest_framework import status @@ -9,11 +8,10 @@ from .caching import get_cached_task_by_id from django.core.cache import cache from .choices import TaskStatus from rest_framework.permissions import IsAuthenticated -from user_app.models import User -from rest_framework.exceptions import APIException from .services import create_or_update_subtasks, create_or_update_assignees, assign_users_to_task, create_subtasks class TaskViewSet(viewsets.ModelViewSet): + permission_classes = [IsAuthenticated] queryset = Task.objects.all() serializer_class = TaskSerializer