source: OpenWorkouts-current/ow/tests/tasks/test_manager.py @ 8c2b094

current
Last change on this file since 8c2b094 was b5d87e0, checked in by Borja Lopez <borja@…>, 5 years ago

(#29) Added a tasks module, implemented a task to run the mail queue processor,
sending any automatically generated emails in the queue.

Tasks can be run manually, with the virtual env active:

python ow/tasks/run.py development.ini TASK_NAME

(where TASK_NAME is the name of a task, like send_emails)

Running the run.py script without parameters gives an usage-like message
with instructions on how to properly call the script.

  • Property mode set to 100644
File size: 4.3 KB
Line 
1from unittest.mock import Mock, patch
2from io import StringIO
3
4import pytest
5
6from ow.tasks.manager import TasksManager
7
8
9def faked_task(env):
10    """
11    This is a helper method, used in the tests below, mimicing a real
12    task we can add/remove to/from the task manager
13
14    >>> faked_task('env')
15    2
16    >>>
17    """
18    return 0 + 2
19
20
21class TestsTasksManager(object):
22
23    @pytest.fixture
24    def manager(self):
25        tm = TasksManager()
26        return tm
27
28    def test__init__(self, manager):
29        # once created, the manager has no tasks ready to be executed
30        assert manager.managers == {}
31
32    @patch('sys.stdout', new_callable=StringIO)
33    def test_usage_empty(self, stdo, manager):
34        # without tasks
35        manager.usage('tasks-script')
36        assert 'tasks-script /path/to/settings.ini' in stdo.getvalue()
37        assert 'faked-task' not in stdo.getvalue()
38
39    @patch('sys.stdout', new_callable=StringIO)
40    def test_usage_with_tasks(self, stdo, manager):
41        # with tasks
42        manager.add_task('faked-task', faked_task)
43        manager.usage('tasks-script')
44        assert 'tasks-script /path/to/settings.ini' in stdo.getvalue()
45        assert 'faked-task' in stdo.getvalue()
46        assert faked_task.__doc__ in stdo.getvalue()
47
48    def test_add_task(self, manager):
49        assert manager.managers == {}
50        manager.add_task('faked-task', faked_task)
51        assert manager.managers == {'faked-task': faked_task}
52
53    def test_override_task(self, manager):
54        # if we call add_task on an existing task name, the task gets
55        # overriden
56        assert manager.managers == {}
57        manager.add_task('faked-task', faked_task)
58        assert manager.managers == {'faked-task': faked_task}
59        manager.add_task('faked-task', 'some-faked-not-object-task')
60        assert manager.managers == {'faked-task': 'some-faked-not-object-task'}
61
62    def test_remove_task(self, manager):
63        # try first to remove a non-existant task, nothing happens
64        assert manager.managers == {}
65        manager.remove_task('faked-task')
66        assert manager.managers == {}
67        manager.add_task('faked-task', faked_task)
68        assert manager.managers == {'faked-task': faked_task}
69        manager.remove_task('faked-task')
70        assert manager.managers == {}
71
72    @patch('sys.stdout', new_callable=StringIO)
73    @patch('ow.tasks.manager.setup_logging')
74    @patch('ow.tasks.manager.bootstrap')
75    def test_run_empty(self, b, sl, stdo, manager):
76        # we try to run a task that is not there, the usage method is called
77        env = {'closer': Mock()}
78        b.return_value = env
79        manager.run('tasks-script', 'development.ini', 'faked-task')
80        assert 'tasks-script /path/to/settings.ini' in stdo.getvalue()
81        assert 'faked-task' not in stdo.getvalue()
82        b.assert_called_with('development.ini')
83        sl.assert_called_with('development.ini')
84        assert env['closer'].called
85
86    @patch('sys.stdout', new_callable=StringIO)
87    @patch('ow.tasks.manager.setup_logging')
88    @patch('ow.tasks.manager.bootstrap')
89    def test_run_invalid_task(self, b, sl, stdo, manager):
90        # we try to run a task that is not there, the usage method is called
91        env = {'closer': Mock()}
92        b.return_value = env
93        manager.add_task('faked-task', faked_task)
94        manager.run('tasks-script', 'development.ini', 'wipe-it-all')
95        assert 'tasks-script /path/to/settings.ini' in stdo.getvalue()
96        assert 'faked-task' in stdo.getvalue()
97        assert faked_task.__doc__ in stdo.getvalue()
98        b.assert_called_with('development.ini')
99        sl.assert_called_with('development.ini')
100        assert env['closer'].called
101
102    @patch('ow.tasks.manager.setup_logging')
103    @patch('ow.tasks.manager.bootstrap')
104    def test_run_ok(self, b, sl, manager):
105        # we try to run a task that is not there, the usage method is called
106        env = {'closer': Mock()}
107        b.return_value = env
108        # for this test use this, easier to assert calls later
109        mocked_faked_task = Mock()
110        manager.add_task('faked-task', mocked_faked_task)
111        manager.run('tasks-script', 'development.ini', 'faked-task')
112        b.assert_called_with('development.ini')
113        sl.assert_called_with('development.ini')
114        mocked_faked_task.assert_called_with(env)
115        assert env['closer'].called
Note: See TracBrowser for help on using the repository browser.