Passed
Branch master (aecce8)
by Brice
05:03
created

RedisQueueTest   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 183
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 12
dl 0
loc 183
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A testSearchTasks() 0 9 1
A testDeleteTask() 0 8 1
A testCreateQueue() 0 7 1
A testAddTasks() 0 7 2
A testUpdateTask() 0 13 1
A testRestoreTask() 0 9 2
A testFindTask() 0 7 1
A testFetchTask() 0 8 1
B setUpBeforeClass() 0 36 1
A testFlushTask() 0 4 1
1
<?php
2
3
namespace JobQueue\Tests\Infrastructure;
4
5
use JobQueue\Domain\Task\Profile;
6
use JobQueue\Domain\Task\Queue;
7
use JobQueue\Domain\Task\Status;
8
use JobQueue\Domain\Task\Task;
9
use JobQueue\Infrastructure\RedisQueue;
10
use JobQueue\Tests\Domain\Job\DummyJob;
11
use PHPUnit\Framework\TestCase;
12
use Predis\Client;
13
14
final class RedisQueueTest extends TestCase
15
{
16
    /**
17
     *
18
     * @var Task[]
19
     */
20
    private static $tasks = [];
21
22
    public static function setUpBeforeClass()
23
    {
24
        self::$tasks[] = new Task(
25
            new Profile('profile1'),
26
            new DummyJob,
27
            [
28
                'param1' => 'value1a',
29
                'param2' => 'value2a',
30
            ],
31
            [
32
                'tag1',
33
                'tag2',
34
            ]
35
        );
36
        self::$tasks[] = new Task(
37
            new Profile('profile1'),
38
            new DummyJob,
39
            [
40
                'param1' => 'value1b',
41
                'param3' => 'value3b',
42
            ],
43
            [
44
                'tag1',
45
                'tag3',
46
            ]
47
        );
48
        self::$tasks[] = new Task(
49
            new Profile('profile2'),
50
            new DummyJob,
51
            [
52
                'param2' => 'value2c',
53
                'param3' => 'value3c',
54
            ],
55
            [
56
                'tag2',
57
                'tag4',
58
            ]
59
        );
60
    }
61
62
    /**
63
     *
64
     * @return RedisQueue
65
     */
66
    public function testCreateQueue(): RedisQueue
67
    {
68
        $queue = new RedisQueue(new Client);
69
70
        $this->assertInstanceOf(Queue::class, $queue);
71
72
        return $queue;
73
    }
74
75
    /**
76
     *
77
     * @param RedisQueue $queue
78
     * @depends testCreateQueue
79
     */
80
    public function testAddTasks(RedisQueue $queue)
81
    {
82
        foreach (self::$tasks as $task) {
83
            $queue->add($task);
84
        }
85
86
        $this->assertEquals(3, count($queue->search()));
87
    }
88
89
    /**
90
     *
91
     * @param RedisQueue $queue
92
     * @depends testCreateQueue
93
     */
94
    public function testFindTask(RedisQueue $queue)
95
    {
96
        $identifier = (string) self::$tasks[0]->getIdentifier();
97
98
        $task = $queue->find($identifier);
99
100
        $this->assertEquals($identifier, (string) $task->getIdentifier());
101
    }
102
103
    /**
104
     *
105
     * @param RedisQueue $queue
106
     * @return RedisQueue
107
     * @depends testCreateQueue
108
     */
109
    public function testFetchTask(RedisQueue $queue): RedisQueue
110
    {
111
        $task = $queue->fetch(new Profile('profile1'));
112
113
        $this->assertEquals(Status::RUNNING, (string) $task->getStatus());
114
        $this->assertEquals((string) self::$tasks[0]->getIdentifier(), (string) $task->getIdentifier());
115
116
        return $queue;
117
    }
118
119
    /**
120
     *
121
     * @param RedisQueue $queue
122
     * @depends testFetchTask
123
     */
124
    public function testSearchTasks(RedisQueue $queue)
125
    {
126
        $this->assertEquals(2, count($queue->search(new Profile('profile1'))));
127
        $this->assertEquals(1, count($queue->search(new Profile('profile2'))));
128
        $this->assertEquals(2, count($queue->search(null, new Status(Status::WAITING))));
129
        $this->assertEquals(1, count($queue->search(null, new Status(Status::RUNNING))));
130
        $this->assertEquals(2, count($queue->search(null, null, ['tag1'])));
131
        $this->assertEquals(1, count($queue->search(null, null, ['tag4'])));
132
        $this->assertEquals(3, count($queue->search(null, null, ['tag1', 'tag4'])));
133
    }
134
135
    /**
136
     *
137
     * @param RedisQueue $queue
138
     * @return RedisQueue
139
     * @depends testFetchTask
140
     */
141
    public function testUpdateTask(RedisQueue $queue): RedisQueue
142
    {
143
        $identifier = (string) self::$tasks[1]->getIdentifier();
144
145
        $task = $queue->fetch(new Profile('profile1'));
146
        $this->assertEquals(Status::RUNNING, (string) $task->getStatus());
147
        $this->assertEquals($identifier, (string) $task->getIdentifier());
148
149
        $queue->updateStatus($task, new Status(Status::FINISHED));
150
        $task = $queue->find($identifier);
151
        $this->assertEquals(Status::FINISHED, (string) $task->getStatus());
152
153
        return $queue;
154
    }
155
156
    /**
157
     *
158
     * @param RedisQueue $queue
159
     * @depends testUpdateTask
160
     */
161
    public function testDeleteTask(RedisQueue $queue)
162
    {
163
        $identifier = (string) self::$tasks[2]->getIdentifier();
164
165
        $queue->delete($identifier);
166
167
        $this->expectExceptionMessage(sprintf('Task %s does not exists', $identifier));
168
        $queue->find($identifier);
169
    }
170
171
    /**
172
     *
173
     * @param RedisQueue $queue
174
     * @return RedisQueue
175
     * @depends testUpdateTask
176
     */
177
    public function testRestoreTask(RedisQueue $queue): RedisQueue
178
    {
179
        $queue->restore();
180
181
        foreach ($queue->search() as $task) {
182
            $this->assertEquals(Status::WAITING, (string) $task->getStatus());
183
        }
184
185
        return $queue;
186
    }
187
188
    /**
189
     *
190
     * @param RedisQueue $queue
191
     * @depends testRestoreTask
192
     */
193
    public function testFlushTask(RedisQueue $queue)
194
    {
195
        $queue->flush();
196
        $this->assertEmpty($queue->search());
197
    }
198
}
199