|
4 | 4 | import signal |
5 | 5 | from unittest.mock import MagicMock |
6 | 6 |
|
| 7 | +import pytest |
7 | 8 | from aioredis import create_redis_pool |
8 | 9 |
|
9 | 10 | from arq.connections import ArqRedis |
10 | 11 | from arq.constants import health_check_key, job_key_prefix |
11 | | -from arq.worker import Retry, Worker, async_check_health, check_health, func, run_worker |
| 12 | +from arq.worker import FailedJobs, Retry, Worker, async_check_health, check_health, func, run_worker |
12 | 13 |
|
13 | 14 |
|
14 | 15 | async def foobar(ctx): |
15 | 16 | return 42 |
16 | 17 |
|
17 | 18 |
|
| 19 | +async def fails(ctx): |
| 20 | + raise TypeError('my type error') |
| 21 | + |
| 22 | + |
18 | 23 | def test_no_jobs(arq_redis: ArqRedis, loop): |
19 | 24 | class Settings: |
20 | 25 | functions = [func(foobar, name='foobar')] |
@@ -287,3 +292,49 @@ async def test_remain_keys_no_results(arq_redis: ArqRedis, worker): |
287 | 292 | worker: Worker = worker(functions=[func(foobar, keep_result=0)]) |
288 | 293 | await worker.main() |
289 | 294 | assert sorted(await arq_redis.keys('*')) == ['arq:health-check'] |
| 295 | + |
| 296 | + |
| 297 | +async def test_run_check_passes(arq_redis: ArqRedis, worker): |
| 298 | + await arq_redis.enqueue_job('foobar') |
| 299 | + await arq_redis.enqueue_job('foobar') |
| 300 | + worker: Worker = worker(functions=[func(foobar, name='foobar')]) |
| 301 | + assert 2 == await worker.run_check() |
| 302 | + |
| 303 | + |
| 304 | +async def test_run_check_error(arq_redis: ArqRedis, worker): |
| 305 | + await arq_redis.enqueue_job('fails') |
| 306 | + worker: Worker = worker(functions=[func(fails, name='fails')]) |
| 307 | + with pytest.raises(FailedJobs, match='1 job failed "TypeError: my type error"'): |
| 308 | + await worker.run_check() |
| 309 | + |
| 310 | + |
| 311 | +async def test_run_check_error2(arq_redis: ArqRedis, worker): |
| 312 | + await arq_redis.enqueue_job('fails') |
| 313 | + await arq_redis.enqueue_job('fails') |
| 314 | + worker: Worker = worker(functions=[func(fails, name='fails')]) |
| 315 | + with pytest.raises(FailedJobs, match='2 jobs failed') as exc_info: |
| 316 | + await worker.run_check() |
| 317 | + assert len(exc_info.value.job_results) == 2 |
| 318 | + |
| 319 | + |
| 320 | +async def test_return_exception(arq_redis: ArqRedis, worker): |
| 321 | + async def return_error(ctx): |
| 322 | + return TypeError('xxx') |
| 323 | + |
| 324 | + j = await arq_redis.enqueue_job('return_error') |
| 325 | + worker: Worker = worker(functions=[func(return_error, name='return_error')]) |
| 326 | + await worker.async_run() |
| 327 | + assert (worker.jobs_complete, worker.jobs_failed, worker.jobs_retried) == (1, 0, 0) |
| 328 | + r = await j.result(pole_delay=0) |
| 329 | + assert isinstance(r, TypeError) |
| 330 | + info = await j.result_info() |
| 331 | + assert info['success'] is True |
| 332 | + |
| 333 | + |
| 334 | +async def test_error_success(arq_redis: ArqRedis, worker): |
| 335 | + j = await arq_redis.enqueue_job('fails') |
| 336 | + worker: Worker = worker(functions=[func(fails, name='fails')]) |
| 337 | + await worker.async_run() |
| 338 | + assert (worker.jobs_complete, worker.jobs_failed, worker.jobs_retried) == (0, 1, 0) |
| 339 | + info = await j.result_info() |
| 340 | + assert info['success'] is False |
0 commit comments