Passed
Push — master ( 9213a8...e174b6 )
by Kevin
02:14
created

php$0 ➔ force_running_an_invalid_task_throws_exception()   A

Complexity

Conditions 1

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 13
rs 9.8333
cc 1
1
<?php
2
3
namespace Zenstruck\ScheduleBundle\Tests\Command;
4
5
use PHPUnit\Framework\TestCase;
0 ignored issues
show
Bug introduced by
The type PHPUnit\Framework\TestCase was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
6
use Symfony\Component\Console\Output\OutputInterface;
7
use Symfony\Component\Console\Tester\CommandTester;
8
use Symfony\Component\EventDispatcher\EventDispatcher;
9
use Zenstruck\ScheduleBundle\Command\ScheduleRunCommand;
10
use Zenstruck\ScheduleBundle\Schedule;
11
use Zenstruck\ScheduleBundle\Schedule\ScheduleBuilder;
12
use Zenstruck\ScheduleBundle\Tests\Fixture\MockScheduleBuilder;
13
use Zenstruck\ScheduleBundle\Tests\Fixture\MockTask;
14
15
/**
16
 * @author Kevin Bond <[email protected]>
17
 */
18
final class ScheduleRunCommandTest extends TestCase
19
{
20
    /**
21
     * @test
22
     */
23
    public function no_tasks_defined()
24
    {
25
        $dispatcher = new EventDispatcher();
26
        $runner = (new MockScheduleBuilder())->getRunner($dispatcher);
27
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
28
29
        $exit = $commandTester->execute([]);
30
31
        $this->assertSame(0, $exit);
32
        $this->assertStringContainsString('No tasks due to run. (0 total tasks)', $commandTester->getDisplay());
33
    }
34
35
    /**
36
     * @test
37
     */
38
    public function skipped_schedule()
39
    {
40
        $dispatcher = new EventDispatcher();
41
        $runner = (new MockScheduleBuilder())
42
            ->addTask(MockTask::success('my task 1'))
43
            ->addBuilder(new class() implements ScheduleBuilder {
44
                public function buildSchedule(Schedule $schedule): void
45
                {
46
                    $schedule->skip('This schedule was skipped.', true);
47
                }
48
            })
49
            ->getRunner($dispatcher)
50
        ;
51
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
52
53
        $exit = $commandTester->execute([]);
54
55
        $this->assertSame(0, $exit);
56
        $this->assertStringNotContainsString('my task 1', $commandTester->getDisplay());
57
        $this->assertStringContainsString('Running 1 due task. (1 total tasks)', $commandTester->getDisplay());
58
        $this->assertStringContainsString('This schedule was skipped.', $commandTester->getDisplay());
59
    }
60
61
    /**
62
     * @test
63
     */
64
    public function skipped_task()
65
    {
66
        $dispatcher = new EventDispatcher();
67
        $runner = (new MockScheduleBuilder())
68
            ->addTask(MockTask::skipped('this task skipped', 'my task 1'))
69
            ->addTask(MockTask::success('my task 2'))
70
            ->getRunner($dispatcher)
71
        ;
72
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
73
74
        $exit = $commandTester->execute([]);
75
76
        $this->assertSame(0, $exit);
77
        $this->assertStringContainsString('Running 2 due tasks. (2 total tasks)', $commandTester->getDisplay());
78
        $this->assertStringContainsString('1/2 tasks ran, 1 succeeded, 1 skipped.', $commandTester->getDisplay());
79
        $this->assertStringContainsString("Running MockTask: my task 1\n Skipped: this task skipped", $commandTester->getDisplay());
80
        $this->assertStringContainsString("Running MockTask: my task 2\n Success.", $commandTester->getDisplay());
81
    }
82
83
    /**
84
     * @test
85
     */
86
    public function successful_task()
87
    {
88
        $dispatcher = new EventDispatcher();
89
        $runner = (new MockScheduleBuilder())
90
            ->addTask(MockTask::success('my task 1'))
91
            ->addTask(MockTask::success('my task 2', 'task 2 output'))
92
            ->getRunner($dispatcher)
93
        ;
94
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
95
96
        $exit = $commandTester->execute([]);
97
98
        $this->assertSame(0, $exit);
99
        $this->assertStringContainsString('Running 2 due tasks. (2 total tasks)', $commandTester->getDisplay());
100
        $this->assertStringContainsString('2/2 tasks ran, 2 succeeded.', $commandTester->getDisplay());
101
        $this->assertStringContainsString("Running MockTask: my task 1\n Success", $commandTester->getDisplay());
102
        $this->assertStringContainsString("Running MockTask: my task 2\n Success.", $commandTester->getDisplay());
103
        $this->assertStringNotContainsString('task 2 output', $commandTester->getDisplay());
104
    }
105
106
    /**
107
     * @test
108
     */
109
    public function successful_task_verbose()
110
    {
111
        $dispatcher = new EventDispatcher();
112
        $runner = (new MockScheduleBuilder())
113
            ->addTask(MockTask::success('my task 1'))
114
            ->addTask(MockTask::success('my task 2', 'task 2 output'))
115
            ->getRunner($dispatcher)
116
        ;
117
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
118
119
        $exit = $commandTester->execute([], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE]);
120
121
        $this->assertSame(0, $exit);
122
        $this->assertStringContainsString('Running 2 due tasks. (2 total tasks)', $commandTester->getDisplay());
123
        $this->assertStringContainsString('2/2 tasks ran, 2 succeeded.', $commandTester->getDisplay());
124
        $this->assertStringContainsString("Running MockTask: my task 1\n Success", $commandTester->getDisplay());
125
        $this->assertStringContainsString("Running MockTask: my task 2\n ---begin output---\ntask 2 output\n ---end output---\n Success.", $commandTester->getDisplay());
126
    }
127
128
    /**
129
     * @test
130
     */
131
    public function failed_task()
132
    {
133
        $dispatcher = new EventDispatcher();
134
        $runner = (new MockScheduleBuilder())
135
            ->addTask(MockTask::failure('task 1 failure', 'my task 1', 'task 1 output'))
136
            ->addTask(MockTask::success('my task 2'))
137
            ->getRunner($dispatcher)
138
        ;
139
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
140
141
        $exit = $commandTester->execute([]);
142
143
        $this->assertSame(1, $exit);
144
        $this->assertStringContainsString('Running 2 due tasks. (2 total tasks)', $commandTester->getDisplay());
145
        $this->assertStringContainsString('2/2 tasks ran, 1 succeeded, 1 failed.', $commandTester->getDisplay());
146
        $this->assertStringContainsString("Running MockTask: my task 1\n Failure: task 1 failure", $commandTester->getDisplay());
147
        $this->assertStringContainsString("Running MockTask: my task 2\n Success.", $commandTester->getDisplay());
148
        $this->assertStringNotContainsString('task 1 output', $commandTester->getDisplay());
149
    }
150
151
    /**
152
     * @test
153
     */
154
    public function failed_task_verbose()
155
    {
156
        $dispatcher = new EventDispatcher();
157
        $runner = (new MockScheduleBuilder())
158
            ->addTask(MockTask::failure('task 1 failure', 'my task 1', 'task 1 output'))
159
            ->addTask(MockTask::success('my task 2'))
160
            ->getRunner($dispatcher)
161
        ;
162
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
163
164
        $exit = $commandTester->execute([], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE]);
165
166
        $this->assertSame(1, $exit);
167
        $this->assertStringContainsString('Running 2 due tasks. (2 total tasks)', $commandTester->getDisplay());
168
        $this->assertStringContainsString('2/2 tasks ran, 1 succeeded, 1 failed.', $commandTester->getDisplay());
169
        $this->assertStringContainsString("Running MockTask: my task 1\n ---begin output---\ntask 1 output\n ---end output---\n Failure: task 1 failure", $commandTester->getDisplay());
170
        $this->assertStringContainsString("Running MockTask: my task 2\n Success.", $commandTester->getDisplay());
171
    }
172
173
    /**
174
     * @test
175
     */
176
    public function failed_task_via_exception()
177
    {
178
        $dispatcher = new EventDispatcher();
179
        $runner = (new MockScheduleBuilder())
180
            ->addTask(MockTask::exception(new \RuntimeException('task 1 exception message'), 'my task 1', 'task 1 output'))
181
            ->addTask(MockTask::success('my task 2'))
182
            ->getRunner($dispatcher)
183
        ;
184
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
185
186
        $exit = $commandTester->execute([]);
187
188
        $this->assertSame(1, $exit);
189
        $this->assertStringContainsString('Running 2 due tasks. (2 total tasks)', $commandTester->getDisplay());
190
        $this->assertStringContainsString('2/2 tasks ran, 1 succeeded, 1 failed.', $commandTester->getDisplay());
191
        $this->assertStringContainsString("Running MockTask: my task 1\n Exception: RuntimeException: task 1 exception message", $commandTester->getDisplay());
192
        $this->assertStringContainsString("Running MockTask: my task 2\n Success.", $commandTester->getDisplay());
193
        $this->assertStringNotContainsString('task 1 output', $commandTester->getDisplay());
194
    }
195
196
    /**
197
     * @test
198
     */
199
    public function failed_task_via_exception_verbose()
200
    {
201
        $dispatcher = new EventDispatcher();
202
        $runner = (new MockScheduleBuilder())
203
            ->addTask(MockTask::exception(new \RuntimeException('task 1 exception message'), 'my task 1', 'task 1 output'))
204
            ->addTask(MockTask::success('my task 2'))
205
            ->getRunner($dispatcher)
206
        ;
207
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
208
209
        $exit = $commandTester->execute([], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE]);
210
211
        $this->assertSame(1, $exit);
212
        $this->assertStringContainsString('Running 2 due tasks. (2 total tasks)', $commandTester->getDisplay());
213
        $this->assertStringContainsString('2/2 tasks ran, 1 succeeded, 1 failed.', $commandTester->getDisplay());
214
        $this->assertStringContainsString("Running MockTask: my task 1\n ---begin output---\ntask 1 output\n ---end output---\n Exception: RuntimeException: task 1 exception message", $commandTester->getDisplay());
215
        $this->assertStringContainsString("Running MockTask: my task 2\n Success.", $commandTester->getDisplay());
216
    }
217
218
    /**
219
     * @test
220
     */
221
    public function can_force_run_tasks()
222
    {
223
        $dispatcher = new EventDispatcher();
224
        $runner = (new MockScheduleBuilder())
225
            ->addTask(MockTask::success('my task 1'))
226
            ->addTask($task2 = MockTask::success('my task 2')->cron('@yearly'))
227
            ->addTask($task3 = MockTask::success('my task 3')->cron('@yearly'))
228
            ->getRunner($dispatcher)
229
        ;
230
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
231
232
        $exit = $commandTester->execute([
233
            'id' => [$task2->getId(), $task3->getId()],
234
        ]);
235
236
        $this->assertSame(0, $exit);
237
        $this->assertStringContainsString('Force Running 2 tasks. (3 total tasks)', $commandTester->getDisplay());
238
        $this->assertStringContainsString('2/2 tasks ran, 2 succeeded.', $commandTester->getDisplay());
239
        $this->assertStringContainsString("Force Running MockTask: my task 2\n Success", $commandTester->getDisplay());
240
        $this->assertStringContainsString("Force Running MockTask: my task 3\n Success.", $commandTester->getDisplay());
241
        $this->assertStringNotContainsString("MockTask: my task 1\n Success.", $commandTester->getDisplay());
242
    }
243
244
    /**
245
     * @test
246
     */
247
    public function force_running_an_invalid_task_throws_exception()
248
    {
249
        $dispatcher = new EventDispatcher();
250
        $runner = (new MockScheduleBuilder())
251
            ->addTask(MockTask::success('my task 1'))
252
            ->getRunner($dispatcher)
253
        ;
254
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
255
256
        $this->expectException(\InvalidArgumentException::class);
257
        $this->expectExceptionMessage('Task with ID "invalid-id" not found.');
258
259
        $commandTester->execute(['id' => ['invalid-id']]);
260
    }
261
262
    /**
263
     * @test
264
     */
265
    public function force_running_a_task_with_a_duplicate_id_throws_exception()
266
    {
267
        $dispatcher = new EventDispatcher();
268
        $runner = (new MockScheduleBuilder())
269
            ->addTask($task = MockTask::success('my task'))
270
            ->addTask(MockTask::success('my task'))
271
            ->getRunner($dispatcher)
272
        ;
273
        $commandTester = new CommandTester(new ScheduleRunCommand($runner, $dispatcher));
274
275
        $this->expectException(\RuntimeException::class);
276
        $this->expectExceptionMessage("Task ID \"{$task->getId()}\" is ambiguous, there are 2 tasks this id.");
277
278
        $commandTester->execute(['id' => [$task->getId()]]);
279
    }
280
}
281