TaskTest   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 199
Duplicated Lines 0 %

Importance

Changes 10
Bugs 0 Features 2
Metric Value
wmc 6
eloc 97
c 10
b 0
f 2
dl 0
loc 199
rs 10

19 Methods

Rating   Name   Duplication   Size   Complexity  
A can_determine_if_due() 0 3 1
A hp$0 ➔ has_unique_id_based_on_description_and_frequency() 0 7 1
A can_cast_to_string() 0 5 1
can_add_email_on_failure_extension() 0 11 ?
A hp$0 ➔ can_add_email_after_extension() 0 11 1
A frequencyProvider() 0 59 1
A hp$0 ➔ emailAfterMethodProvider() 0 5 1
A can_fluently_create_frequency() 0 6 1
can_add_email_after_extension() 0 11 ?
task() 0 3 ?
has_unique_id_based_on_description_and_frequency() 0 7 ?
A can_set_description() 0 5 1
A hp$0 ➔ task() 0 3 1
A can_get_next_run() 0 5 1
A hp$0 ➔ can_add_single_server_extension() 0 5 1
can_add_single_server_extension() 0 5 ?
emailAfterMethodProvider() 0 5 ?
A can_set_timezone() 0 13 1
A hp$0 ➔ can_add_email_on_failure_extension() 0 11 1
1
<?php
2
3
namespace Zenstruck\ScheduleBundle\Tests\Schedule;
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\Mime\Email;
7
use Zenstruck\ScheduleBundle\Schedule\Extension\SingleServerExtension;
8
use Zenstruck\ScheduleBundle\Schedule\Task;
9
use Zenstruck\ScheduleBundle\Tests\Fixture\MockTask;
10
11
/**
12
 * @author Kevin Bond <[email protected]>
13
 */
14
final class TaskTest extends TestCase
15
{
16
    /**
17
     * @test
18
     */
19
    public function can_set_description()
20
    {
21
        $task = self::task()->description('my description');
22
23
        $this->assertSame('my description', $task->getDescription());
24
    }
25
26
    /**
27
     * @test
28
     */
29
    public function can_cast_to_string()
30
    {
31
        $task = new MockTask('my description');
32
33
        $this->assertSame('MockTask: my description', (string) $task);
34
    }
35
36
    /**
37
     * @test
38
     */
39
    public function can_set_timezone()
40
    {
41
        $task = self::task();
42
43
        $this->assertNull($task->getTimezone());
44
45
        $task->timezone('UTC');
46
47
        $this->assertSame('UTC', $task->getTimezone()->getName());
48
49
        $task->timezone(new \DateTimeZone('America/Los_Angeles'));
50
51
        $this->assertSame('America/Los_Angeles', $task->getTimezone()->getName());
52
    }
53
54
    /**
55
     * @test
56
     */
57
    public function can_get_next_run()
58
    {
59
        $this->assertSame(
60
            (new \DateTime('1st Jan next year'))->getTimestamp(),
61
            self::task()->yearly()->getNextRun()->getTimestamp()
62
        );
63
    }
64
65
    /**
66
     * @test
67
     */
68
    public function can_determine_if_due()
69
    {
70
        $this->assertTrue(self::task()->everyMinute()->isDue(new \DateTime()));
71
    }
72
73
    /**
74
     * @test
75
     * @dataProvider frequencyProvider
76
     */
77
    public function can_fluently_create_frequency(callable $createTask, string $expectedExpression)
78
    {
79
        $task = $createTask();
80
81
        $this->assertSame($expectedExpression, (string) $task->getExpression());
82
        $this->assertInstanceOf(\DateTimeInterface::class, $task->getNextRun());
83
    }
84
85
    public static function frequencyProvider(): array
86
    {
87
        return [
88
            [function() { return self::task(); }, '* * * * *'],
89
            [function() { return self::task()->minutes(37)->cron('0 0,12 1 */2 *'); }, '0 0,12 1 */2 *'],
90
            [function() { return self::task()->weekly()->everyMinute(); }, '* * * * *'],
91
            [function() { return self::task()->weekly()->everyFiveMinutes(); }, '*/5 * * * *'],
92
            [function() { return self::task()->weekly()->everyTenMinutes(); }, '*/10 * * * *'],
93
            [function() { return self::task()->weekly()->everyFifteenMinutes(); }, '*/15 * * * *'],
94
            [function() { return self::task()->weekly()->everyTwentyMinutes(); }, '*/20 * * * *'],
95
            [function() { return self::task()->weekly()->everyThirtyMinutes(); }, '0,30 * * * *'],
96
            [function() { return self::task()->minutes(37)->hourly(); }, '0 * * * *'],
97
            [function() { return self::task()->minutes(37)->hourlyAt(2); }, '2 * * * *'],
98
            [function() { return self::task()->minutes(37)->hourlyAt(2, 3, '4-5'); }, '2,3,4-5 * * * *'],
99
            [function() { return self::task()->minutes(37)->daily(); }, '0 0 * * *'],
100
            [function() { return self::task()->minutes(37)->dailyOn(2, 3, '4-5'); }, '0 2,3,4-5 * * *'],
101
            [function() { return self::task()->minutes(37)->dailyBetween(9, 17); }, '0 9-17 * * *'],
102
            [function() { return self::task()->minutes(37)->twiceDaily(); }, '0 1,13 * * *'],
103
            [function() { return self::task()->minutes(37)->twiceDaily(2, 14); }, '0 2,14 * * *'],
104
            [function() { return self::task()->minutes(37)->dailyAt(2); }, '0 2 * * *'],
105
            [function() { return self::task()->minutes(37)->dailyAt('1:34'); }, '34 1 * * *'],
106
            [function() { return self::task()->minutes(37)->weekly(); }, '0 0 * * 0'],
107
            [function() { return self::task()->minutes(37)->weeklyOn(2, 3, '4-5'); }, '0 0 * * 2,3,4-5'],
108
            [function() { return self::task()->minutes(37)->monthly(); }, '0 0 1 * *'],
109
            [function() { return self::task()->minutes(37)->monthlyOn(2, 3, '4-5'); }, '0 0 2,3,4-5 * *'],
110
            [function() { return self::task()->minutes(37)->twiceMonthly(); }, '0 0 1,16 * *'],
111
            [function() { return self::task()->minutes(37)->twiceMonthly(3, 17); }, '0 0 3,17 * *'],
112
            [function() { return self::task()->minutes(37)->quarterly(); }, '0 0 1 */3 *'],
113
            [function() { return self::task()->minutes(37)->yearly(); }, '0 0 1 1 *'],
114
            [function() { return self::task()->weekly()->minutes(2, 3, '4-5'); }, '2,3,4-5 0 * * 0'],
115
            [function() { return self::task()->weekly()->hours(2, 3, '4-5'); }, '0 2,3,4-5 * * 0'],
116
            [function() { return self::task()->weekly()->daysOfMonth(2, 3, '4-5'); }, '0 0 2,3,4-5 * 0'],
117
            [function() { return self::task()->weekly()->months(2, 3, '4-5'); }, '0 0 * 2,3,4-5 0'],
118
            [function() { return self::task()->monthly()->daysOfWeek(2, 3, '4-5'); }, '0 0 1 * 2,3,4-5'],
119
            [function() { return self::task()->minutes(37)->weekdays(); }, '37 * * * 1-5'],
120
            [function() { return self::task()->minutes(37)->weekends(); }, '37 * * * 0,6'],
121
            [function() { return self::task()->minutes(37)->mondays(); }, '37 * * * 1'],
122
            [function() { return self::task()->minutes(37)->tuesdays(); }, '37 * * * 2'],
123
            [function() { return self::task()->minutes(37)->wednesdays(); }, '37 * * * 3'],
124
            [function() { return self::task()->minutes(37)->thursdays(); }, '37 * * * 4'],
125
            [function() { return self::task()->minutes(37)->fridays(); }, '37 * * * 5'],
126
            [function() { return self::task()->minutes(37)->saturdays(); }, '37 * * * 6'],
127
            [function() { return self::task()->minutes(37)->sundays(); }, '37 * * * 0'],
128
            [function() { return self::task()->weekly()->at(1); }, '0 1 * * 0'],
129
            [function() { return self::task()->weekly()->at('2:45'); }, '45 2 * * 0'],
130
131
            [function() { return self::task()->cron('invalid...')->mondays(); }, '* * * * 1'],
132
133
            [function() { return self::task()->cron('@hourly'); }, '@hourly'],
134
            [function() { return self::task()->cron('@daily'); }, '@daily'],
135
            [function() { return self::task()->cron('@weekly'); }, '@weekly'],
136
            [function() { return self::task()->cron('@monthly'); }, '@monthly'],
137
            [function() { return self::task()->cron('@yearly'); }, '@yearly'],
138
            [function() { return self::task()->cron('@annually'); }, '@annually'],
139
140
            [function() { return self::task('my task')->cron('# 0 * * *'); }, '56 0 * * *'],
141
            [function() { return self::task('my task')->cron('#daily'); }, '56 20 * * *'],
142
            [function() { return self::task('my task')->cron('#midnight'); }, '56 2 * * *'],
143
            [function() { return self::task('my task')->cron('#midnight')->daily(); }, '0 0 * * *'],
144
        ];
145
    }
146
147
    /**
148
     * @test
149
     */
150
    public function has_unique_id_based_on_description_and_frequency()
151
    {
152
        $this->assertSame(self::task()->getId(), self::task()->getId());
153
        $this->assertNotSame(self::task()->daily()->getId(), self::task()->getId());
154
        $this->assertNotSame(self::task('task1')->getId(), self::task('task2')->getId());
155
        $this->assertNotSame((new class('task') extends Task {
156
        })->getId(), self::task('task')->getId());
157
    }
158
159
    /**
160
     * @test
161
     * @dataProvider emailAfterMethodProvider
162
     */
163
    public function can_add_email_after_extension($method)
164
    {
165
        $task = self::task();
166
        $task->{$method}('[email protected]', 'my subject', function(Email $email) {
167
            $email->cc('[email protected]');
168
        });
169
170
        $this->assertTrue($task->getExtensions()[0]->isHook(Task::AFTER));
171
        $this->assertSame('[email protected]', $task->getExtensions()[0]->getEmail()->getTo()[0]->toString());
172
        $this->assertSame('[email protected]', $task->getExtensions()[0]->getEmail()->getCc()[0]->toString());
173
        $this->assertSame('my subject', $task->getExtensions()[0]->getEmail()->getSubject());
174
    }
175
176
    public static function emailAfterMethodProvider()
177
    {
178
        return [
179
            ['emailAfter'],
180
            ['thenEmail'],
181
        ];
182
    }
183
184
    /**
185
     * @test
186
     */
187
    public function can_add_email_on_failure_extension()
188
    {
189
        $task = self::task();
190
        $task->emailOnFailure('[email protected]', 'my subject', function(Email $email) {
191
            $email->cc('[email protected]');
192
        });
193
194
        $this->assertTrue($task->getExtensions()[0]->isHook(Task::FAILURE));
195
        $this->assertSame('[email protected]', $task->getExtensions()[0]->getEmail()->getTo()[0]->toString());
196
        $this->assertSame('[email protected]', $task->getExtensions()[0]->getEmail()->getCc()[0]->toString());
197
        $this->assertSame('my subject', $task->getExtensions()[0]->getEmail()->getSubject());
198
    }
199
200
    /**
201
     * @test
202
     */
203
    public function can_add_single_server_extension()
204
    {
205
        $task = self::task()->onSingleServer();
206
207
        $this->assertInstanceOf(SingleServerExtension::class, $task->getExtensions()[0]);
208
    }
209
210
    private static function task(string $description = 'task description'): Task
211
    {
212
        return new MockTask($description);
213
    }
214
}
215