Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F7123173
D1173.id3719.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Subscribers
None
D1173.id3719.diff
View Options
diff --git a/conftest.py b/conftest.py
--- a/conftest.py
+++ b/conftest.py
@@ -4,3 +4,11 @@
# https://hypothesis.readthedocs.io/en/latest/settings.html#settings-profiles
settings.register_profile("fast", max_examples=5, deadline=5000)
settings.register_profile("slow", max_examples=20, deadline=5000)
+
+# Modules that should not be loaded by --doctest-modules
+collect_ignore = [
+ # ImportError
+ 'swh/scheduler/updater/ghtorrent/fake.py',
+ # NotImplementedError: save_group is not supported by this backend.
+ 'swh/scheduler/tests/tasks.py',
+]
diff --git a/swh/scheduler/cli.py b/swh/scheduler/cli.py
--- a/swh/scheduler/cli.py
+++ b/swh/scheduler/cli.py
@@ -70,6 +70,46 @@
"""Pretty-print a task
If 'full' is True, also print the status and priority fields.
+
+ >>> task = {
+ ... 'id': 1234,
+ ... 'arguments': {
+ ... 'args': ['foo', 'bar'],
+ ... 'kwargs': {'key': 'value'},
+ ... },
+ ... 'current_interval': datetime.timedelta(hours=1),
+ ... 'next_run': datetime.datetime(2019, 2, 21, 13, 52, 35, 407818),
+ ... 'policy': 'oneshot',
+ ... 'priority': None,
+ ... 'status': 'next_run_not_scheduled',
+ ... 'type': 'test_task',
+ ... }
+ >>> print(click.unstyle(pretty_print_task(task)))
+ Task 1234
+ Next run: ... (2019-02-21 13:52:35+00:00)
+ Interval: 1:00:00
+ Type: test_task
+ Policy: oneshot
+ Args:
+ foo
+ bar
+ Keyword args:
+ key: value
+ <BLANKLINE>
+ >>> print(click.unstyle(pretty_print_task(task, full=True)))
+ Task 1234
+ Next run: ... (2019-02-21 13:52:35+00:00)
+ Interval: 1:00:00
+ Type: test_task
+ Policy: oneshot
+ Status: next_run_not_scheduled
+ Priority:\x20
+ Args:
+ foo
+ bar
+ Keyword args:
+ key: value
+ <BLANKLINE>
"""
next_run = arrow.get(task['next_run'])
lines = [
diff --git a/swh/scheduler/tests/conftest.py b/swh/scheduler/tests/conftest.py
--- a/swh/scheduler/tests/conftest.py
+++ b/swh/scheduler/tests/conftest.py
@@ -20,7 +20,7 @@
DUMP_FILES = os.path.join(SQL_DIR, '*.sql')
# celery tasks for testing purpose; tasks themselves should be
-# in swh/scheduler/tests/celery_tasks.py
+# in swh/scheduler/tests/tasks.py
TASK_NAMES = ['ping', 'multiping', 'add', 'error']
diff --git a/swh/scheduler/tests/test_cli.py b/swh/scheduler/tests/test_cli.py
new file mode 100644
--- /dev/null
+++ b/swh/scheduler/tests/test_cli.py
@@ -0,0 +1,131 @@
+# Copyright (C) 2019 The Software Heritage developers
+# See the AUTHORS file at the top-level directory of this distribution
+# License: GNU General Public License version 3, or any later version
+# See top-level LICENSE file for more information
+
+import datetime
+import re
+import tempfile
+from unittest.mock import patch
+
+from click.testing import CliRunner
+
+from swh.scheduler.cli import cli
+
+
+CLI_CONFIG = '''
+scheduler:
+ cls: foo
+ args: {}
+'''
+
+
+def invoke(scheduler, catch_exceptions, args):
+ runner = CliRunner()
+ with patch('swh.scheduler.cli.get_scheduler') as get_scheduler_mock, \
+ tempfile.NamedTemporaryFile('a', suffix='.yml') as config_fd:
+ config_fd.write(CLI_CONFIG)
+ config_fd.seek(0)
+ get_scheduler_mock.return_value = scheduler
+ result = runner.invoke(cli, ['-C' + config_fd.name] + args)
+ if not catch_exceptions and result.exception:
+ print(result.output)
+ raise result.exception
+ return result
+
+
+def test_schedule_tasks(swh_scheduler):
+ csv_data = (
+ b'swh-test-ping;[["arg1", "arg2"]];{"key": "value"};'
+ + datetime.datetime.utcnow().isoformat().encode() + b'\n'
+ + b'swh-test-ping;[["arg3", "arg4"]];{"key": "value"};'
+ + datetime.datetime.utcnow().isoformat().encode() + b'\n')
+ print(csv_data.decode())
+ with tempfile.NamedTemporaryFile(suffix='.csv') as csv_fd:
+ csv_fd.write(csv_data)
+ csv_fd.seek(0)
+ result = invoke(swh_scheduler, False, [
+ 'task', 'schedule',
+ '-d', ';',
+ csv_fd.name
+ ])
+ assert result.exit_code == 0, result.output
+ expected = r'''^\[INFO\] swh.core.config -- Loading config file .*
+Created 2 tasks
+
+Task 1
+ Next run: just now \(.*\)
+ Interval: 1 day, 0:00:00
+ Type: swh-test-ping
+ Policy: recurring
+ Args:
+ \['arg1', 'arg2'\]
+ Keyword args:
+ key: value
+
+Task 2
+ Next run: just now \(.*\)
+ Interval: 1 day, 0:00:00
+ Type: swh-test-ping
+ Policy: recurring
+ Args:
+ \['arg3', 'arg4'\]
+ Keyword args:
+ key: value
+
+'''
+ assert re.match(expected, result.output, re.MULTILINE), result.output
+
+
+def test_schedule_tasks_columns(swh_scheduler):
+ with tempfile.NamedTemporaryFile(suffix='.csv') as csv_fd:
+ csv_fd.write(
+ b'swh-test-ping;oneshot;["arg1", "arg2"];{"key": "value"}\n')
+ csv_fd.seek(0)
+ result = invoke(swh_scheduler, False, [
+ 'task', 'schedule',
+ '-c', 'type', '-c', 'policy', '-c', 'args', '-c', 'kwargs',
+ '-d', ';',
+ csv_fd.name
+ ])
+ assert result.exit_code == 0, result.output
+ expected = r'''^\[INFO\] swh.core.config -- Loading config file .*
+Created 1 tasks
+
+Task 1
+ Next run: just now \(.*\)
+ Interval: 1 day, 0:00:00
+ Type: swh-test-ping
+ Policy: oneshot
+ Args:
+ arg1
+ arg2
+ Keyword args:
+ key: value
+
+'''
+ assert re.match(expected, result.output, re.MULTILINE), result.output
+
+
+def test_schedule_task(swh_scheduler):
+ result = invoke(swh_scheduler, False, [
+ 'task', 'add',
+ 'swh-test-ping', 'arg1', 'arg2', 'key=value',
+ ])
+ assert result.exit_code == 0, result.output
+ expected = r'''^\[INFO\] swh.core.config -- Loading config file .*
+Created 1 tasks
+
+Task 1
+ Next run: just now \(.*\)
+ Interval: 1 day, 0:00:00
+ Type: swh-test-ping
+ Policy: recurring
+ Args:
+ arg1
+ arg2
+ Keyword args:
+ key: value
+
+'''
+ assert re.match(expected, result.output, re.MULTILINE), result.output
diff --git a/tox.ini b/tox.ini
--- a/tox.ini
+++ b/tox.ini
@@ -11,7 +11,7 @@
LC_CTYPE=C.UTF-8
LANG=C.UTF-8
commands =
- pifpaf run postgresql -- pytest --hypothesis-profile=fast --cov=swh --cov-branch {posargs}
+ pifpaf run postgresql -- pytest --doctest-modules --hypothesis-profile=fast --cov=swh --cov-branch {posargs}
[testenv:py3-slow]
deps =
@@ -19,7 +19,7 @@
pytest-cov
pifpaf
commands =
- pifpaf run postgresql -- pytest --hypothesis-profile=slow --cov=swh --cov-branch {posargs}
+ pifpaf run postgresql -- pytest --doctest-modules --hypothesis-profile=slow --cov=swh --cov-branch {posargs}
[testenv:flake8]
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Dec 18, 1:25 AM (2 d, 5 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3229545
Attached To
D1173: Start writing tests for the scheduler CLI.
Event Timeline
Log In to Comment