HttpTest   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 137
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 3
dl 0
loc 137
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
B testShowTask() 0 24 1
B testAddTask() 0 39 1
A testListTasks() 0 55 1
1
<?php
2
3
namespace JobQueue\Tests\Application;
4
5
use JobQueue\Application\Http\AddTask;
6
use JobQueue\Application\Http\ListTasks;
7
use JobQueue\Application\Http\ShowTask;
8
use JobQueue\Domain\Task\Profile;
9
use JobQueue\Domain\Task\Status;
10
use JobQueue\Domain\Task\Task;
11
use JobQueue\Infrastructure\ServiceContainer;
12
use JobQueue\Tests\Domain\Job\DummyJob;
13
use PHPUnit\Framework\TestCase;
14
use Ramsey\Uuid\Uuid;
15
use Zend\Diactoros\ServerRequest;
16
17
final class HttpTest extends TestCase
18
{
19
    /**
20
     *
21
     * @return string
22
     */
23
    public function testAddTask(): string
24
    {
25
        $queue = ServiceContainer::getInstance()->queue;
26
27
        $task = new Task(
28
            new Profile('profile1'),
29
            new DummyJob,
30
            [
31
                'param1' => 'value1',
32
                'param2' => 'value2',
33
            ], [
34
                'tag1', 'tag2'
35
            ]
36
        );
37
38
        $request = new ServerRequest([], [], '/tasks', 'POST', 'php://input', [
39
            'content-type' => 'application/json',
40
        ], [], [], $task->jsonSerialize());
41
42
        $response = (new AddTask($queue))->handle($request);
43
        $this->assertEquals(201, $response->getStatusCode());
44
45
        $task = json_decode($response->getBody(), true);
46
47
        $uuidPattern = rtrim(ltrim(Uuid::VALID_PATTERN, '^'), '$');
48
        $this->assertEquals(1, preg_match("/$uuidPattern/", $task['identifier']), 'Missing identifier');
49
50
        $this->assertEquals(Status::WAITING, $task['status']);
51
52
        $this->assertEquals('profile1', $task['profile']);
53
54
        $this->assertTrue(isset($task['parameters']['param1']));
55
        $this->assertEquals('value1', $task['parameters']['param1']);
56
57
58
        $this->assertTrue(isset($task['tags']));
59
        $this->assertTrue(in_array('tag1', $task['tags']));
60
61
        return $task['identifier'];
62
    }
63
64
    /**
65
     *
66
     * @param string $identifier
67
     * @depends testAddTask
68
     */
69
    public function testShowTask(string $identifier)
70
    {
71
        $queue = ServiceContainer::getInstance()->queue;
72
73
        $request = new ServerRequest([], [], sprintf('/task/%s', $identifier), 'GET');
74
        $request = $request->withAttribute('identifier', $identifier);
75
76
        $response = (new ShowTask($queue))->handle($request);
77
        $this->assertEquals(200, $response->getStatusCode());
78
79
        $task = json_decode($response->getBody(), true);
80
81
        $this->assertEquals(1, preg_match("/^$identifier$/", $task['identifier']), 'Missing identifier');
82
83
        $this->assertEquals(Status::WAITING, $task['status']);
84
85
        $this->assertEquals('profile1', $task['profile']);
86
87
        $this->assertTrue(isset($task['parameters']['param1']));
88
        $this->assertEquals('value1', $task['parameters']['param1']);
89
90
91
        $this->assertTrue(isset($task['tags']));
92
        $this->assertTrue(in_array('tag1', $task['tags']));
93
    }
94
95
    /**
96
     *
97
     * @depends testAddTask
98
     */
99
    public function testListTasks()
100
    {
101
        $queue = ServiceContainer::getInstance()->queue;
102
103
        $task1 = new Task(
104
            new Profile('profile1'),
105
            new DummyJob,
106
            [
107
                'param1' => 'value1',
108
                'param2' => 'value2',
109
            ], [
110
                'tag1', 'tag2'
111
            ]
112
        );
113
114
        $request1 = new ServerRequest([], [], '/tasks', 'POST', 'php://input', [
115
            'content-type' => 'application/json',
116
        ], [], [], $task1->jsonSerialize());
117
118
        $response1 = (new AddTask($queue))->handle($request1);
119
        $this->assertEquals(201, $response1->getStatusCode());
120
121
        $task2 = new Task(
122
            new Profile('profile1'),
123
            new DummyJob,
124
            [
125
                'param1' => 'value1',
126
                'param2' => 'value2',
127
            ], [
128
                'tag1', 'tag2'
129
            ]
130
        );
131
132
        $request2 = new ServerRequest([], [], '/tasks', 'POST', 'php://input', [
133
            'content-type' => 'application/json',
134
        ], [], [], $task2->jsonSerialize());
135
136
        $response2 = (new AddTask($queue))->handle($request2);
137
        $this->assertEquals(201, $response2->getStatusCode());
138
139
        $request = new ServerRequest([], [], '/tasks', 'GET');
140
141
        $response = (new ListTasks($queue))->handle($request);
142
        $this->assertEquals(200, $response->getStatusCode());
143
144
        $tasks = json_decode($response->getBody(), true);
145
146
        $this->assertEquals(3, count($tasks));
147
148
        $profiles = [
149
            'profile1',
150
            'profile2',
151
        ];
152
        $this->assertTrue(in_array($tasks[1]['profile'], $profiles));
153
        $this->assertTrue(in_array($tasks[2]['profile'], $profiles));
154
    }
155
}
156