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 User = get_user_model() class TaskCacheTests(TestCase): def setUp(self): user = User.objects.create(first_name="Test", last_name="User", email="test@example.com") self.user = user self.task1 = 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.task2 = Task.objects.create( title="Test Task 2", description="Description 2", category=TaskCategory.USER_STORY, priority=TaskPriority.MEDIUM, status=TaskStatus.IN_PROGRESS, date="2025-01-02", creator=self.user ) cache.clear() def test_get_cached_task_by_id(self): task = get_cached_task_by_id(self.task1.id) self.assertIsNotNone(task) self.assertEqual(task, self.task1) def test_cache_invalidation_on_task_save(self): cache.clear() task = get_cached_task_by_id(self.task1.id) self.assertEqual(task, self.task1) self.task1.status = TaskStatus.DONE self.task1.save() 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_invalidation_on_task_delete(self): cache.clear() task = get_cached_task_by_id(self.task1.id) self.assertEqual(task, self.task1) task_id = self.task1.id self.task1.delete() self.assertIsNone(cache.get(f"task_{task_id}")) task = get_cached_task_by_id(task_id) self.assertIsNone(task) def test_cache_invalidation_on_assigned_task_save(self): cache.clear() AssignedTask.objects.create(user_id=self.user, task=self.task1) 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_invalidation_on_assigned_task_delete(self): cache.clear() assigned_task = AssignedTask.objects.create(user_id=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") self.assertIsNone(cache.get("task_corrupted")) task = get_cached_task_by_id(self.task1.id) self.assertEqual(task, self.task1) def test_cache_behavior_on_multiple_tasks(self): cache.clear() task1 = get_cached_task_by_id(self.task1.id) task2 = get_cached_task_by_id(self.task2.id) self.assertEqual(task1, self.task1) self.assertEqual(task2, self.task2) def test_cache_removal_on_multiple_task_deletion(self): cache.clear() task1_id = self.task1.id task2_id = self.task2.id self.task1.delete() self.task2.delete() self.assertIsNone(cache.get(f"task_{task1_id}")) self.assertIsNone(cache.get(f"task_{task2_id}")) def test_cache_after_task_update(self): cache.clear() self.task1.title = "Updated Task 1" self.task1.save() task = get_cached_task_by_id(self.task1.id) self.assertEqual(task.title, "Updated Task 1") def test_cache_check_on_no_changes(self): cache.clear() task = get_cached_task_by_id(self.task1.id) self.assertEqual(task, self.task1) cached_task = cache.get(f"task_{self.task1.id}") self.assertIsNotNone(cached_task) cache.delete(f"task_{self.task1.id}") self.assertIsNone(cache.get(f"task_{self.task1.id}"))