Skip to content

Commit 8bc1ed5

Browse files
authored
Added tests. (#117)
1 parent 5de77c4 commit 8bc1ed5

File tree

3 files changed

+60
-5
lines changed

3 files changed

+60
-5
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
steps:
4343
- uses: actions/checkout@v5
4444
- name: Set up Redis instance and Redis cluster
45-
run: docker compose up -d
45+
run: docker compose up -d --wait
4646
- name: Set up uv and enable cache
4747
id: setup-uv
4848
uses: astral-sh/setup-uv@v7

taskiq_redis/list_schedule_source.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ def _get_cron_key(self) -> str:
8585
"""Get the key for a cron-based schedule."""
8686
return f"{self._prefix}:cron"
8787

88+
def _get_interval_key(self) -> str:
89+
return f"{self._prefix}:interval"
90+
8891
def _get_data_key(self, schedule_id: str) -> str:
8992
"""Get the key for a schedule data."""
9093
return f"{self._prefix}:data:{schedule_id}"
@@ -150,6 +153,8 @@ async def delete_schedule(self, schedule_id: str) -> None:
150153
elif schedule.time is not None:
151154
time_key = self._get_time_key(schedule.time)
152155
await redis.lrem(time_key, 0, schedule_id) # type: ignore[misc]
156+
elif schedule.interval:
157+
await redis.lrem(self._get_interval_key(), 0, schedule_id) # type: ignore[misc]
153158

154159
async def add_schedule(self, schedule: "ScheduledTask") -> None:
155160
"""Add a schedule to the source."""
@@ -169,6 +174,11 @@ async def add_schedule(self, schedule: "ScheduledTask") -> None:
169174
self._get_time_key(schedule.time),
170175
schedule.schedule_id,
171176
)
177+
elif schedule.interval:
178+
await redis.rpush( # type: ignore[misc]
179+
self._get_interval_key(),
180+
schedule.schedule_id,
181+
)
172182

173183
async def post_send(self, task: ScheduledTask) -> None:
174184
"""Delete a task after it's completed."""
@@ -199,6 +209,10 @@ async def get_schedules(self) -> list["ScheduledTask"]:
199209
logger.debug("Got %d cron schedules", len(crons))
200210
if crons:
201211
buffer.extend(crons)
212+
intervals = await redis.lrange(self._get_interval_key(), 0, -1) # type: ignore[misc]
213+
logger.debug("Got %d interval schedules", len(intervals))
214+
if intervals:
215+
buffer.extend(intervals)
202216
timed.extend(await redis.lrange(self._get_time_key(current_time), 0, -1)) # type: ignore[misc]
203217
logger.debug("Got %d timed schedules", len(timed))
204218
if timed:

tests/test_list_schedule_source.py

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,24 @@ async def test_schedule_cron(redis_url: str) -> None:
2727
assert scehdules == [schedule]
2828

2929

30+
@pytest.mark.anyio
31+
@freeze_time("2025-01-01 00:00:00")
32+
async def test_schedule_interval(redis_url: str) -> None:
33+
"""Test adding a cron schedule."""
34+
prefix = uuid.uuid4().hex
35+
source = ListRedisScheduleSource(redis_url, prefix=prefix)
36+
schedule = ScheduledTask(
37+
task_name="test_task",
38+
labels={},
39+
args=[],
40+
kwargs={},
41+
interval=datetime.timedelta(seconds=5),
42+
)
43+
await source.add_schedule(schedule)
44+
scehdules = await source.get_schedules()
45+
assert scehdules == [schedule]
46+
47+
3048
@pytest.mark.anyio
3149
@freeze_time("2025-01-01 00:00:00")
3250
async def test_schedule_from_past(redis_url: str) -> None:
@@ -56,7 +74,7 @@ async def test_schedule_from_past(redis_url: str) -> None:
5674

5775
@pytest.mark.anyio
5876
@freeze_time("2025-01-01 00:00:00")
59-
async def test_schedule_removal(redis_url: str) -> None:
77+
async def test_removal_time(redis_url: str) -> None:
6078
"""Test adding a cron schedule."""
6179
prefix = uuid.uuid4().hex
6280
source = ListRedisScheduleSource(redis_url, prefix=prefix)
@@ -81,16 +99,39 @@ async def test_schedule_removal(redis_url: str) -> None:
8199

82100
@pytest.mark.anyio
83101
@freeze_time("2025-01-01 00:00:00")
84-
async def test_deletion(redis_url: str) -> None:
85-
"""Test adding a cron schedule."""
102+
async def test_removal_cron(redis_url: str) -> None:
103+
"""Test removing cron schedules."""
104+
prefix = uuid.uuid4().hex
105+
source = ListRedisScheduleSource(redis_url, prefix=prefix)
106+
schedule = ScheduledTask(
107+
task_name="test_task",
108+
labels={},
109+
args=[],
110+
kwargs={},
111+
cron="* * * * *",
112+
)
113+
await source.add_schedule(schedule)
114+
# When running for the first time, the scheduler will get all the
115+
# schedules that are in the past.
116+
scehdules = await source.get_schedules()
117+
assert scehdules == [schedule]
118+
await source.delete_schedule(schedule.schedule_id)
119+
scehdules = await source.get_schedules()
120+
assert scehdules == []
121+
122+
123+
@pytest.mark.anyio
124+
@freeze_time("2025-01-01 00:00:00")
125+
async def test_removal_interval(redis_url: str) -> None:
126+
"""Test removing cron schedules."""
86127
prefix = uuid.uuid4().hex
87128
source = ListRedisScheduleSource(redis_url, prefix=prefix)
88129
schedule = ScheduledTask(
89130
task_name="test_task",
90131
labels={},
91132
args=[],
92133
kwargs={},
93-
time=datetime.datetime.now(datetime.timezone.utc),
134+
interval=datetime.timedelta(seconds=30),
94135
)
95136
await source.add_schedule(schedule)
96137
# When running for the first time, the scheduler will get all the

0 commit comments

Comments
 (0)