Completed
Push — master ( 03ffe6...2c1c5a )
by Will
11s
created

SqsIntegrationTest::stubQueueVisibilityTimeout()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 13
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 13
loc 13
rs 9.4285
c 1
b 0
f 0
cc 1
eloc 9
nc 1
nop 1
1
<?php
2
3
/**
4
 * This file is part of graze/queue.
5
 *
6
 * Copyright (c) 2015 Nature Delivered Ltd. <https://www.graze.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 *
11
 * @license https://github.com/graze/queue/blob/master/LICENSE MIT
12
 *
13
 * @link    https://github.com/graze/queue
14
 */
15
16
namespace Graze\Queue;
17
18
use Aws\ResultInterface;
19
use Aws\Sqs\SqsClient;
20
use Graze\Queue\Adapter\SqsAdapter;
21
use Mockery as m;
22
use Mockery\MockInterface;
23
use PHPUnit_Framework_TestCase as TestCase;
24
25
class SqsIntegrationTest extends TestCase
26
{
27
    /** @var string */
28
    private $queueName;
29
    /** @var SqsClient|MockInterface */
30
    private $sqsClient;
31
    /** @var Client */
32
    private $client;
33
34
    public function setUp()
35
    {
36
        $this->queueName = 'queue_foo';
37
        $this->sqsClient = m::mock(SqsClient::class);
38
        $this->client = new Client(new SqsAdapter($this->sqsClient, 'queue_foo'));
39
    }
40
41
    /**
42
     * Create a queue
43
     *
44
     * @return string
45
     */
46 View Code Duplication
    protected function stubCreateQueue()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
47
    {
48
        $url = 'queue://foo';
49
        $model = m::mock(ResultInterface::class);
50
        $model->shouldReceive('get')->once()->with('QueueUrl')->andReturn($url);
51
52
        $this->sqsClient->shouldReceive('createQueue')->once()->with([
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
53
            'QueueName'  => $this->queueName,
54
            'Attributes' => [],
55
        ])->andReturn($model);
56
57
        return $url;
58
    }
59
60
    /**
61
     * @param string $url
62
     *
63
     * @return int
64
     */
65 View Code Duplication
    protected function stubQueueVisibilityTimeout($url)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
66
    {
67
        $timeout = 120;
68
        $model = m::mock(ResultInterface::class);
69
        $model->shouldReceive('get')->once()->with('Attributes')->andReturn(['VisibilityTimeout' => $timeout]);
70
71
        $this->sqsClient->shouldReceive('getQueueAttributes')->once()->with([
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
72
            'QueueUrl'       => $url,
73
            'AttributeNames' => ['VisibilityTimeout'],
74
        ])->andReturn($model);
75
76
        return $timeout;
77
    }
78
79 View Code Duplication
    public function testReceive()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
80
    {
81
        $url = $this->stubCreateQueue();
82
        $timeout = $this->stubQueueVisibilityTimeout($url);
83
84
        $receiveModel = m::mock(ResultInterface::class);
85
        $receiveModel->shouldReceive('get')->once()->with('Messages')->andReturn([
86
            ['Body' => 'foo', 'Attributes' => [], 'MessageAttributes' => [], 'MessageId' => 0, 'ReceiptHandle' => 'a'],
87
        ]);
88
        $this->sqsClient->shouldReceive('receiveMessage')->once()->with([
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
89
            'QueueUrl'            => $url,
90
            'AttributeNames'      => ['All'],
91
            'MaxNumberOfMessages' => 1,
92
            'VisibilityTimeout'   => $timeout,
93
        ])->andReturn($receiveModel);
94
95
        $deleteModel = m::mock(ResultInterface::class);
96
        $deleteModel->shouldReceive('get')->once()->with('Failed')->andReturn([]);
97
        $this->sqsClient->shouldReceive('deleteMessageBatch')->once()->with([
98
            'QueueUrl' => $url,
99
            'Entries'  => [['Id' => 0, 'ReceiptHandle' => 'a']],
100
        ])->andReturn($deleteModel);
101
102
        $msgs = [];
103
        $this->client->receive(function ($msg) use (&$msgs) {
104
            $msgs[] = $msg;
105
        });
106
107
        assertThat($msgs, is(arrayWithSize(1)));
108
    }
109
110
    public function testReceiveWithReceiveMessageReturningLessThanMaxNumberOfMessages()
111
    {
112
        $url = $this->stubCreateQueue();
113
        $timeout = $this->stubQueueVisibilityTimeout($url);
0 ignored issues
show
Unused Code introduced by
$timeout is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
114
115
        $receiveModel = m::mock(ResultInterface::class);
116
        $receiveModel->shouldReceive('get')->with('Messages')->andReturn(
117
            [
118
                [
119
                    'Body'              => 'foo',
120
                    'Attributes'        => [],
121
                    'MessageAttributes' => [],
122
                    'MessageId'         => 0,
123
                    'ReceiptHandle'     => 'a',
124
                ],
125
                [
126
                    'Body'              => 'foo',
127
                    'Attributes'        => [],
128
                    'MessageAttributes' => [],
129
                    'MessageId'         => 0,
130
                    'ReceiptHandle'     => 'a',
131
                ],
132
                [
133
                    'Body'              => 'foo',
134
                    'Attributes'        => [],
135
                    'MessageAttributes' => [],
136
                    'MessageId'         => 0,
137
                    'ReceiptHandle'     => 'a',
138
                ],
139
                [
140
                    'Body'              => 'foo',
141
                    'Attributes'        => [],
142
                    'MessageAttributes' => [],
143
                    'MessageId'         => 0,
144
                    'ReceiptHandle'     => 'a',
145
                ],
146
                [
147
                    'Body'              => 'foo',
148
                    'Attributes'        => [],
149
                    'MessageAttributes' => [],
150
                    'MessageId'         => 0,
151
                    'ReceiptHandle'     => 'a',
152
                ],
153
                [
154
                    'Body'              => 'foo',
155
                    'Attributes'        => [],
156
                    'MessageAttributes' => [],
157
                    'MessageId'         => 0,
158
                    'ReceiptHandle'     => 'a',
159
                ],
160
                [
161
                    'Body'              => 'foo',
162
                    'Attributes'        => [],
163
                    'MessageAttributes' => [],
164
                    'MessageId'         => 0,
165
                    'ReceiptHandle'     => 'a',
166
                ],
167
                [
168
                    'Body'              => 'foo',
169
                    'Attributes'        => [],
170
                    'MessageAttributes' => [],
171
                    'MessageId'         => 0,
172
                    'ReceiptHandle'     => 'a',
173
                ],
174
                [
175
                    'Body'              => 'foo',
176
                    'Attributes'        => [],
177
                    'MessageAttributes' => [],
178
                    'MessageId'         => 0,
179
                    'ReceiptHandle'     => 'a',
180
                ],
181
            ],
182
            [
183
                [
184
                    'Body'              => 'foo',
185
                    'Attributes'        => [],
186
                    'MessageAttributes' => [],
187
                    'MessageId'         => 0,
188
                    'ReceiptHandle'     => 'a',
189
                ],
190
                [
191
                    'Body'              => 'foo',
192
                    'Attributes'        => [],
193
                    'MessageAttributes' => [],
194
                    'MessageId'         => 0,
195
                    'ReceiptHandle'     => 'a',
196
                ],
197
            ],
198
            null
199
        );
200
201
        $this->sqsClient->shouldReceive('receiveMessage')->andReturn($receiveModel);
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
202
203
        $deleteModel = m::mock(ResultInterface::class);
204
        $deleteModel->shouldReceive('get')->twice()->with('Failed')->andReturn([]);
205
        $this->sqsClient->shouldReceive('deleteMessageBatch')->with(m::type('array'))->andReturn($deleteModel);
206
207
        $msgs = [];
208
        $this->client->receive(function ($msg) use (&$msgs) {
209
            $msgs[] = $msg;
210
        }, 11);
211
212
        assertThat($msgs, is(arrayWithSize(11)));
213
    }
214
215 View Code Duplication
    public function testReceiveWithLimit()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
216
    {
217
        $url = $this->stubCreateQueue();
218
        $timeout = $this->stubQueueVisibilityTimeout($url);
219
220
        $receiveModel = m::mock(ResultInterface::class);
221
        $receiveModel->shouldReceive('get')->once()->with('Messages')->andReturn([
222
            ['Body' => 'foo', 'Attributes' => [], 'MessageAttributes' => [], 'MessageId' => 0, 'ReceiptHandle' => 'a'],
223
        ]);
224
        $this->sqsClient->shouldReceive('receiveMessage')->once()->with([
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
225
            'QueueUrl'            => $url,
226
            'AttributeNames'      => ['All'],
227
            'MaxNumberOfMessages' => SqsAdapter::BATCHSIZE_RECEIVE,
228
            'VisibilityTimeout'   => $timeout,
229
        ])->andReturn($receiveModel);
230
231
        $deleteModel = m::mock(ResultInterface::class);
232
        $deleteModel->shouldReceive('get')->once()->with('Failed')->andReturn([]);
233
        $this->sqsClient->shouldReceive('deleteMessageBatch')->once()->with([
234
            'QueueUrl' => $url,
235
            'Entries'  => [['Id' => 0, 'ReceiptHandle' => 'a']],
236
        ])->andReturn($deleteModel);
237
238
        $msgs = [];
239
        $this->client->receive(function ($msg, $done) use (&$msgs) {
240
            $msgs[] = $msg;
241
            $done();
242
        }, 100);
243
244
        assertThat($msgs, is(arrayWithSize(1)));
245
    }
246
247 View Code Duplication
    public function testReceiveWithPolling()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
248
    {
249
        $url = $this->stubCreateQueue();
250
        $timeout = $this->stubQueueVisibilityTimeout($url);
251
252
        $receiveModel = m::mock(ResultInterface::class);
253
        $receiveModel->shouldReceive('get')->once()->with('Messages')->andReturn([
254
            ['Body' => 'foo', 'Attributes' => [], 'MessageAttributes' => [], 'MessageId' => 0, 'ReceiptHandle' => 'a'],
255
        ]);
256
        $this->sqsClient->shouldReceive('receiveMessage')->once()->with([
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
257
            'QueueUrl'            => $url,
258
            'AttributeNames'      => ['All'],
259
            'MaxNumberOfMessages' => SqsAdapter::BATCHSIZE_RECEIVE,
260
            'VisibilityTimeout'   => $timeout,
261
        ])->andReturn($receiveModel);
262
263
        $deleteModel = m::mock(ResultInterface::class);
264
        $deleteModel->shouldReceive('get')->once()->with('Failed')->andReturn([]);
265
        $this->sqsClient->shouldReceive('deleteMessageBatch')->once()->with([
266
            'QueueUrl' => $url,
267
            'Entries'  => [['Id' => 0, 'ReceiptHandle' => 'a']],
268
        ])->andReturn($deleteModel);
269
270
        $msgs = [];
271
        $this->client->receive(function ($msg, $done) use (&$msgs) {
272
            $msgs[] = $msg;
273
            $done();
274
        }, null);
275
276
        assertThat($msgs, is(arrayWithSize(1)));
277
    }
278
279
    public function testSend()
280
    {
281
        $url = $this->stubCreateQueue();
282
        $model = m::mock(ResultInterface::class);
283
        $model->shouldReceive('get')->once()->with('Failed')->andReturn([]);
284
285
        $this->sqsClient->shouldReceive('sendMessageBatch')->once()->with([
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
286
            'QueueUrl' => $url,
287
            'Entries'  => [['Id' => 0, 'MessageBody' => 'foo', 'MessageAttributes' => []]],
288
        ])->andReturn($model);
289
290
        $this->client->send([$this->client->create('foo')]);
291
    }
292
293
    public function testPurge()
294
    {
295
        $url = $this->stubCreateQueue();
296
        $timeout = $this->stubQueueVisibilityTimeout($url);
297
298
        $receiveModel = m::mock(ResultInterface::class);
299
        $receiveModel->shouldReceive('get')->once()->with('Messages')->andReturn([]);
300
        $this->sqsClient->shouldReceive('receiveMessage')->once()->with([
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
301
            'QueueUrl'            => $url,
302
            'AttributeNames'      => ['All'],
303
            'MaxNumberOfMessages' => 1,
304
            'VisibilityTimeout'   => $timeout,
305
        ])->andReturn($receiveModel);
306
307
        $purgeModel = m::mock(ResultInterface::class);
308
        $this->sqsClient->shouldReceive('purgeQueue')->once()->with([
309
            'QueueUrl' => $url,
310
        ])->andReturn($purgeModel);
311
312
        $this->client->purge();
313
314
        $msgs = [];
315
        $this->client->receive(function ($msg) use (&$msgs) {
316
            $msgs[] = $msg;
317
        });
318
319
        assertThat($msgs, is(emptyArray()));
320
    }
321
322
    public function testDelete()
323
    {
324
        $url = $this->stubCreateQueue();
325
326
        $deleteModel = m::mock(ResultInterface::class);
327
        $this->sqsClient->shouldReceive('deleteQueue')->once()->with([
0 ignored issues
show
Bug introduced by
The method shouldReceive does only exist in Mockery\MockInterface, but not in Aws\Sqs\SqsClient.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
328
            'QueueUrl' => $url,
329
        ])->andReturn($deleteModel);
330
331
        $this->client->delete();
332
    }
333
}
334