1 | from unittest.mock import Mock, patch |
---|
2 | from io import StringIO |
---|
3 | |
---|
4 | import pytest |
---|
5 | |
---|
6 | from ow.tasks.manager import TasksManager |
---|
7 | |
---|
8 | |
---|
9 | def 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 | |
---|
21 | class 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 |
---|