createRunnerBuilder()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
eloc 2
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Zenstruck\ScheduleBundle\Tests\EventListener;
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 Psr\Log\Test\TestLogger;
7
use Zenstruck\ScheduleBundle\EventListener\ScheduleLoggerSubscriber;
8
use Zenstruck\ScheduleBundle\Schedule\Exception\SkipSchedule;
9
use Zenstruck\ScheduleBundle\Schedule\Extension\CallbackExtension;
10
use Zenstruck\ScheduleBundle\Tests\Fixture\MockScheduleBuilder;
11
use Zenstruck\ScheduleBundle\Tests\Fixture\MockTask;
12
13
/**
14
 * @author Kevin Bond <[email protected]>
15
 */
16
final class ScheduleLoggerSubscriberTest extends TestCase
17
{
18
    private $logger;
19
20
    protected function setUp(): void
21
    {
22
        parent::setUp();
23
24
        $this->logger = new TestLogger();
25
    }
26
27
    /**
28
     * @test
29
     */
30
    public function no_scheduled_tasks()
31
    {
32
        $this->createRunnerBuilder()->run();
33
34
        $this->assertCount(1, $this->logger->records);
35
        $this->assertTrue($this->logger->hasDebugThatContains('No tasks due to run.'));
36
    }
37
38
    /**
39
     * @test
40
     */
41
    public function run_successful_task()
42
    {
43
        $this->createRunnerBuilder()
44
            ->addTask(MockTask::success('my task'))
45
            ->run()
46
        ;
47
        $this->assertCount(4, $this->logger->records);
48
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
49
        $this->assertTrue($this->logger->hasInfoThatContains('Running "MockTask: my task"'));
50
        $this->assertTrue($this->logger->hasInfoThatContains('Successfully ran "MockTask: my task"'));
51
        $this->assertTrue($this->logger->hasInfoThatContains('1/1 tasks ran'));
52
    }
53
54
    /**
55
     * @test
56
     */
57
    public function run_task_that_throws_exception()
58
    {
59
        $this->createRunnerBuilder()
60
            ->addTask(MockTask::exception(new \Exception('failed...'), 'my task'))
61
            ->run()
62
        ;
63
64
        $this->assertCount(4, $this->logger->records);
65
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
66
        $this->assertTrue($this->logger->hasInfoThatContains('Running "MockTask: my task"'));
67
        $this->assertTrue($this->logger->hasCriticalThatContains('Exception thrown when running "MockTask: my task"'));
68
        $this->assertTrue($this->logger->hasErrorThatContains('1/1 tasks ran'));
69
        $this->assertSame('failed...', $this->logger->records[2]['context']['exception']->getMessage());
70
    }
71
72
    /**
73
     * @test
74
     */
75
    public function run_task_that_fails()
76
    {
77
        $this->createRunnerBuilder()
78
            ->addTask(MockTask::failure('failed', 'my task', 'task output'))
79
            ->run()
80
        ;
81
82
        $this->assertCount(4, $this->logger->records);
83
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
84
        $this->assertTrue($this->logger->hasInfoThatContains('Running "MockTask: my task"'));
85
        $this->assertTrue($this->logger->hasErrorThatContains('Failure when running "MockTask: my task"'));
86
        $this->assertTrue($this->logger->hasErrorThatContains('1/1 tasks ran'));
87
        $this->assertSame('task output', $this->logger->records[2]['context']['output']);
88
    }
89
90
    /**
91
     * @test
92
     */
93
    public function run_task_that_skips()
94
    {
95
        $this->createRunnerBuilder()
96
            ->addTask(MockTask::success()->skip('skip reason', true))
97
            ->run()
98
        ;
99
100
        $this->assertCount(4, $this->logger->records);
101
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
102
        $this->assertTrue($this->logger->hasInfoThatContains('Running "MockTask: my task"'));
103
        $this->assertTrue($this->logger->hasInfoThatContains('Skipped "MockTask: my task" (skip reason)'));
104
        $this->assertTrue($this->logger->hasInfoThatContains('0/1 tasks ran'));
105
    }
106
107
    /**
108
     * @test
109
     */
110
    public function run_schedule_that_skips()
111
    {
112
        $context = $this->createRunnerBuilder()
113
            ->addTask(new MockTask())
114
            ->addExtension(CallbackExtension::scheduleFilter(function() {
115
                throw new SkipSchedule('the schedule has skipped');
116
            }))
117
            ->run()
118
        ;
119
120
        $this->assertTrue($context->isSkipped());
121
        $this->assertTrue($context->isSuccessful());
122
        $this->assertCount(2, $this->logger->records);
123
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
124
        $this->assertTrue($this->logger->hasInfoThatContains('the schedule has skipped'));
125
    }
126
127
    /**
128
     * @test
129
     */
130
    public function force_run_tasks()
131
    {
132
        $this->createRunnerBuilder()
133
            ->addTask($task = MockTask::success('my task'))
134
            ->run($task->getId())
135
        ;
136
        $this->assertCount(4, $this->logger->records);
137
        $this->assertTrue($this->logger->hasInfoThatContains('Force running 1 task.'));
138
        $this->assertTrue($this->logger->hasInfoThatContains('Force running "MockTask: my task"'));
139
        $this->assertTrue($this->logger->hasInfoThatContains('Successfully ran "MockTask: my task"'));
140
        $this->assertTrue($this->logger->hasInfoThatContains('1/1 tasks ran'));
141
    }
142
143
    private function createRunnerBuilder(): MockScheduleBuilder
144
    {
145
        return (new MockScheduleBuilder())
146
            ->addSubscriber(new ScheduleLoggerSubscriber($this->logger))
147
        ;
148
    }
149
}
150