import unittest from unittest.mock import Mock, patch from api.tasks import memoir_tasks from api.tasks.memoir_tasks import ( _acquire_chapter_lock, _release_chapter_lock, _update_task_status_sync, ) class MemoirTasksRedisReuseTest(unittest.TestCase): def setUp(self): memoir_tasks._REDIS_CLIENTS.clear() @patch("api.tasks.memoir_tasks.redis.from_url") def test_chapter_lock_helpers_reuse_same_redis_client(self, from_url_mock): client = Mock() client.set.return_value = True from_url_mock.return_value = client self.assertTrue(_acquire_chapter_lock("user-1", "childhood")) _release_chapter_lock("user-1", "childhood") self.assertEqual(from_url_mock.call_count, 1) client.set.assert_called_once() client.delete.assert_called_once() @patch("api.tasks.memoir_tasks.redis.from_url") def test_task_status_updates_reuse_decode_response_client(self, from_url_mock): client = Mock() client.hget.return_value = None from_url_mock.return_value = client _update_task_status_sync("user-1", "task-1", "running") _update_task_status_sync("user-1", "task-1", "success", {"processed": 1}) self.assertEqual(from_url_mock.call_count, 1) client.hset.assert_called()