From 3f8783989b5610cba38e2be751609d74882ac6be Mon Sep 17 00:00:00 2001 From: Thomas Steinacher Date: Tue, 23 Mar 2021 22:31:06 +0100 Subject: [PATCH 1/2] Ensure task exists in the given queue when retrieving it --- tasktiger/task.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tasktiger/task.py b/tasktiger/task.py index 98fe234e..9d668457 100644 --- a/tasktiger/task.py +++ b/tasktiger/task.py @@ -400,18 +400,24 @@ def from_id(self, tiger, queue, state, task_id, load_executions=0): to indicate how many executions should be loaded (starting from the latest). If the task doesn't exist, None is returned. """ + pipeline = tiger.connection.pipeline() + pipeline.get(tiger._key('task', task_id)) + pipeline.zscore(tiger._key(state, queue), task_id) if load_executions: - pipeline = tiger.connection.pipeline() - pipeline.get(tiger._key('task', task_id)) pipeline.lrange( tiger._key('task', task_id, 'executions'), -load_executions, -1 ) - serialized_data, serialized_executions = pipeline.execute() + ( + serialized_data, + is_queued, + serialized_executions, + ) = pipeline.execute() else: - serialized_data = tiger.connection.get(tiger._key('task', task_id)) + serialized_data, is_queued = pipeline.execute() serialized_executions = [] + # XXX: No timestamp for now - if serialized_data: + if serialized_data and is_queued: data = json.loads(serialized_data) executions = [json.loads(e) for e in serialized_executions if e] return Task( From c7ec6849b05440e3ffeb16d573043107d9234c84 Mon Sep 17 00:00:00 2001 From: Thomas Steinacher Date: Wed, 24 Mar 2021 16:22:45 +0100 Subject: [PATCH 2/2] Test task from ID --- tests/test_task.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tests/test_task.py diff --git a/tests/test_task.py b/tests/test_task.py new file mode 100644 index 00000000..9f6dd0fa --- /dev/null +++ b/tests/test_task.py @@ -0,0 +1,28 @@ +import pytest + +from tasktiger import Task, TaskNotFound + +from .tasks import simple_task +from .utils import get_tiger + + +class TestTaskFromId: + @pytest.fixture + def tiger(self): + return get_tiger() + + @pytest.fixture + def queued_task(self, tiger): + return tiger.delay(simple_task) + + def test_task_found(self, tiger, queued_task): + task = Task.from_id(tiger, "default", "queued", queued_task.id) + assert queued_task.id == task.id + + def test_task_wrong_state(self, tiger, queued_task): + with pytest.raises(TaskNotFound): + Task.from_id(tiger, "default", "active", queued_task.id) + + def test_task_wrong_queue(self, tiger, queued_task): + with pytest.raises(TaskNotFound): + Task.from_id(tiger, "other", "active", queued_task.id)