Passed
Push — master ( 751812...ad3fb0 )
by Kevin
02:24
created

ScheduleLoggerSubscriberTest   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 8
dl 0
loc 116
rs 10
c 0
b 0
f 0
eloc 53

8 Methods

Rating   Name   Duplication   Size   Complexity  
A run_successful_task() 0 12 1
A run_task_that_throws_exception() 0 13 1
A run_schedule_that_skips() 0 15 1
A run_task_that_fails() 0 13 1
A createRunnerBuilder() 0 4 1
A no_scheduled_tasks() 0 6 1
A setUp() 0 5 1
A run_task_that_skips() 0 12 1
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
48
        $this->assertCount(4, $this->logger->records);
49
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
50
        $this->assertTrue($this->logger->hasInfoThatContains('Running "MockTask": my task'));
51
        $this->assertTrue($this->logger->hasInfoThatContains('Successfully ran "MockTask": my task'));
52
        $this->assertTrue($this->logger->hasInfoThatContains('1/1 tasks ran'));
53
    }
54
55
    /**
56
     * @test
57
     */
58
    public function run_task_that_throws_exception()
59
    {
60
        $this->createRunnerBuilder()
61
            ->addTask(MockTask::exception(new \Exception('failed...'), 'my task'))
62
            ->run()
63
        ;
64
65
        $this->assertCount(4, $this->logger->records);
66
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
67
        $this->assertTrue($this->logger->hasInfoThatContains('Running "MockTask": my task'));
68
        $this->assertTrue($this->logger->hasErrorThatContains('Exception thrown when running "MockTask": my task'));
69
        $this->assertTrue($this->logger->hasErrorThatContains('1/1 tasks ran'));
70
        $this->assertSame('failed...', $this->logger->records[2]['context']['exception']->getMessage());
71
    }
72
73
    /**
74
     * @test
75
     */
76
    public function run_task_that_fails()
77
    {
78
        $this->createRunnerBuilder()
79
            ->addTask(MockTask::failure('failed', 'my task', 'task output'))
80
            ->run()
81
        ;
82
83
        $this->assertCount(4, $this->logger->records);
84
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
85
        $this->assertTrue($this->logger->hasInfoThatContains('Running "MockTask": my task'));
86
        $this->assertTrue($this->logger->hasErrorThatContains('Failure when running "MockTask": my task'));
87
        $this->assertTrue($this->logger->hasErrorThatContains('1/1 tasks ran'));
88
        $this->assertSame('task output', $this->logger->records[2]['context']['output']);
89
    }
90
91
    /**
92
     * @test
93
     */
94
    public function run_task_that_skips()
95
    {
96
        $this->createRunnerBuilder()
97
            ->addTask(MockTask::success()->skip('skip reason', true))
98
            ->run()
99
        ;
100
101
        $this->assertCount(4, $this->logger->records);
102
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
103
        $this->assertTrue($this->logger->hasInfoThatContains('Running "MockTask": my task'));
104
        $this->assertTrue($this->logger->hasInfoThatContains('Skipped "MockTask": my task'));
105
        $this->assertTrue($this->logger->hasInfoThatContains('0/1 tasks ran'));
106
    }
107
108
    /**
109
     * @test
110
     */
111
    public function run_schedule_that_skips()
112
    {
113
        $event = $this->createRunnerBuilder()
114
            ->addTask(new MockTask())
115
            ->addExtension(CallbackExtension::scheduleFilter(function () {
116
                throw new SkipSchedule('the schedule has skipped');
117
            }))
118
            ->run()
119
        ;
120
121
        $this->assertTrue($event->isSkipped());
122
        $this->assertTrue($event->isSuccessful());
123
        $this->assertCount(2, $this->logger->records);
124
        $this->assertTrue($this->logger->hasInfoThatContains('Running 1 due task.'));
125
        $this->assertTrue($this->logger->hasInfoThatContains('the schedule has skipped'));
126
    }
127
128
    private function createRunnerBuilder(): MockScheduleBuilder
129
    {
130
        return (new MockScheduleBuilder())
131
            ->addSubscriber(new ScheduleLoggerSubscriber($this->logger))
132
        ;
133
    }
134
}
135