Passed
Pull Request — master (#132)
by
unknown
02:04
created

UrlBundleServiceTest::chunkCases()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 5
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 10
rs 10
1
<?php
2
3
namespace SilverStripe\StaticPublishQueue\Test;
4
5
use ReflectionMethod;
6
use SilverStripe\Core\Config\Config;
7
use SilverStripe\Core\Injector\Injector;
8
use SilverStripe\Dev\SapphireTest;
9
use SilverStripe\ORM\ValidationException;
10
use SilverStripe\StaticPublishQueue\Job;
11
use SilverStripe\StaticPublishQueue\Job\DeleteStaticCacheJob;
12
use SilverStripe\StaticPublishQueue\Job\GenerateStaticCacheJob;
13
use SilverStripe\StaticPublishQueue\Service\UrlBundleService;
14
use Symbiote\QueuedJobs\DataObjects\QueuedJobDescriptor;
15
use Symbiote\QueuedJobs\Services\QueuedJobHandler;
16
use Symbiote\QueuedJobs\Services\QueuedJobService;
17
use Symbiote\QueuedJobs\Tests\QueuedJobsTest\QueuedJobsTest_Handler;
0 ignored issues
show
Bug introduced by
The type Symbiote\QueuedJobs\Test...\QueuedJobsTest_Handler 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...
18
19
class UrlBundleServiceTest extends SapphireTest
20
{
21
    /**
22
     * @var bool
23
     */
24
    protected $usesDatabase = true;
25
26
    protected function setUp(): void
27
    {
28
        parent::setUp();
29
        Injector::inst()->registerService(new QueuedJobsTest_Handler(), QueuedJobHandler::class);
30
        Config::modify()->set(QueuedJobService::class, 'use_shutdown_function', false);
31
    }
32
33
    /**
34
     * @param string $jobClass
35
     * @throws ValidationException
36
     * @dataProvider jobClasses
37
     */
38
    public function testJobsFromDataDefault(string $jobClass): void
39
    {
40
        $urls = [
41
            'http://some-locale/some-page/',
42
            'http://some-locale/some-other-page/',
43
        ];
44
        $message = 'Test message';
45
46
        $service = UrlBundleService::singleton();
47
        $service->addUrls($urls);
48
        $service->queueJobsForUrls($jobClass, $message);
49
50
        $jobs = QueuedJobDescriptor::get()->filter(['Implementation' => $jobClass]);
51
        $this->assertCount(1, $jobs);
52
53
        /** @var QueuedJobDescriptor $jobDescriptor */
54
        $jobDescriptor = $jobs->first();
55
        $savedJobData = unserialize($jobDescriptor->SavedJobData);
56
57
        $this->assertEquals([
58
            'http://some-locale/some-page/' => 0,
59
            'http://some-locale/some-other-page/' => 1,
60
61
        ], $savedJobData->URLsToProcess);
62
63
        $savedJobMessages = unserialize($jobDescriptor->SavedJobMessages);
64
        $this->assertCount(1, $savedJobMessages);
65
66
        $messageData = array_shift($savedJobMessages);
0 ignored issues
show
Bug introduced by
It seems like $savedJobMessages can also be of type Countable and Traversable; however, parameter $array of array_shift() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

66
        $messageData = array_shift(/** @scrutinizer ignore-type */ $savedJobMessages);
Loading history...
67
        $this->assertContains($message, $messageData);
68
    }
69
70
    /**
71
     * @param string $jobClass
72
     * @throws ValidationException
73
     * @dataProvider jobClasses
74
     */
75
    public function testJobsFromDataExplicitUrlsPerJob(string $jobClass): void
76
    {
77
        Config::modify()->set($jobClass, 'urls_per_job', 1);
78
        $urls = [
79
            'http://some-locale/some-page/',
80
            'http://some-locale/some-other-page/',
81
        ];
82
83
        $service = UrlBundleService::singleton();
84
        $service->addUrls($urls);
85
        $service->queueJobsForUrls($jobClass);
86
87
        $jobs = QueuedJobDescriptor::get()->filter(['Implementation' => $jobClass]);
88
        $this->assertCount(2, $jobs);
89
    }
90
91
    /**
92
     * @param string $jobClass
93
     * @param int $urlsPerJob
94
     * @dataProvider urlsPerJobCases
95
     */
96
    public function testUrlsPerJob(string $jobClass, int $urlsPerJob): void
97
    {
98
        Config::modify()->set($jobClass, 'urls_per_job', $urlsPerJob);
99
100
        /** @var Job $job */
101
        $job = singleton($jobClass);
102
103
        $method = new ReflectionMethod(Job::class, 'getUrlsPerJob');
104
        $method->setAccessible(true);
105
        $this->assertEquals($urlsPerJob, $method->invoke($job));
106
    }
107
108
    /**
109
     * @param string $jobClass
110
     * @param int $chunkSize
111
     * @dataProvider chunkCases
112
     */
113
    public function testChunkSize(string $jobClass, int $chunkSize): void
114
    {
115
        Config::modify()->set($jobClass, 'chunk_size', $chunkSize);
116
117
        /** @var Job $job */
118
        $job = singleton($jobClass);
119
120
        $method = new ReflectionMethod(Job::class, 'getChunkSize');
121
        $method->setAccessible(true);
122
        $this->assertEquals($chunkSize, $method->invoke($job));
123
    }
124
125
    /**
126
     * @return array
127
     */
128
    public function jobClasses(): array
129
    {
130
        return [
131
            [GenerateStaticCacheJob::class],
132
            [DeleteStaticCacheJob::class],
133
        ];
134
    }
135
136
    /**
137
     * @return array
138
     */
139
    public function urlsPerJobCases(): array
140
    {
141
        return [
142
            [
143
                GenerateStaticCacheJob::class,
144
                8,
145
            ],
146
            [
147
                DeleteStaticCacheJob::class,
148
                9,
149
            ],
150
        ];
151
    }
152
153
    /**
154
     * @return array
155
     */
156
    public function chunkCases(): array
157
    {
158
        return [
159
            [
160
                GenerateStaticCacheJob::class,
161
                10,
162
            ],
163
            [
164
                DeleteStaticCacheJob::class,
165
                15,
166
            ],
167
        ];
168
    }
169
}
170