Completed
Pull Request — master (#13)
by Antonio
04:31 queued 11s
created

testEnqueueDequeueAndAcknowledge()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 63
Code Lines 48

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 1
Metric Value
c 2
b 1
f 1
dl 0
loc 63
rs 9.4347
cc 1
eloc 48
nc 1
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
namespace Da\Mailer\Test\Queue\Backend\Redis;
3
4
use Da\Mailer\Model\MailMessage;
5
use Da\Mailer\Queue\Backend\Beanstalk\BeanstalkdQueueStoreAdapter;
6
use Da\Mailer\Queue\Backend\Beanstalk\BeanstalkdQueueStoreConnection;
7
use Da\Mailer\Test\Fixture\FixtureHelper;
8
use Mockery;
9
use Pheanstalk\Job;
10
use Pheanstalk\Response\ArrayResponse;
11
use PHPUnit_Framework_TestCase;
12
13
class BeanstalkdQueueStoreAdapterTest extends PHPUnit_Framework_TestCase
14
{
15
    private $mailJob;
16
    private $payload;
17
18
    protected function setUp()
19
    {
20
        parent::setUp();
21
        $this->mailJob = FixtureHelper::getBeanstalkdMailJob();
22
        $this->payload = json_encode(
23
            [
24
                'id' => '123456789',
25
                'attempt' => $this->mailJob->getAttempt(),
26
                'message' => $this->mailJob->getMessage()
27
            ]
28
        );
29
    }
30
31
    public function testEnqueueDequeueAndAcknowledge()
32
    {
33
        $statsTubeResponse2 = new ArrayResponse(
34
            'test', [
35
                'current-jobs-delayed' => 0,
36
                'current-jobs-urgent' => 0,
37
                'current-jobs-ready' => 0
38
            ]
39
        );
40
        $statsTubeResponse1= new ArrayResponse('test', ['current-jobs-delayed' => 1,]);
41
        $payload = json_decode($this->payload, true);
42
        $payload['job'] = new Job(1, 'demo');
43
        $btJob2 = Mockery::mock('\Pheanstalk\Job')
44
            ->shouldReceive('getData')
45
            ->andReturn(json_encode($payload))
46
            ->getMock();
47
        $btClient = Mockery::mock('\Pheanstalk\Pheanstalk')
48
            ->shouldReceive('useTube')
49
            ->with('mail_queue')
50
            ->andReturnSelf()
51
            ->shouldReceive('put')
52
            ->andReturn(1)
53
            ->shouldReceive('watchOnly')
54
            ->andReturnSelf()
55
            ->shouldReceive('statsTube')
56
            ->twice()
57
            ->andReturn($statsTubeResponse1, $statsTubeResponse2)
58
            ->shouldReceive('reserve')
59
            ->with(0)
60
            ->andReturn($btJob2, null)
61
            ->shouldReceive('delete')
62
            ->andReturn(1)
63
            ->getMock();
64
65
        $btStoreConnection = Mockery::mock('\Da\Mailer\Queue\Backend\Beanstalk\BeanstalkdQueueStoreConnection')
66
            ->shouldReceive('connect')
67
            ->andReturnSelf()
68
            ->shouldReceive('getInstance')
69
            ->andReturn($btClient)
70
            ->getMock();
71
72
        $btQueueStore = new BeanstalkdQueueStoreAdapter($btStoreConnection);
73
74
        $this->assertSame($btQueueStore, $btQueueStore->init());
75
        $this->assertTrue($btQueueStore->enqueue($this->mailJob) > 0);
76
77
        $this->assertTrue($btQueueStore->isEmpty() === false);
78
79
        $mailJob = $btQueueStore->dequeue();
80
81
        $this->assertTrue($btQueueStore->isEmpty() === true);
82
83
        $this->assertTrue(!empty($mailJob->getMessage()));
84
85
        $dequeuedMailMessage = MailMessage::fromArray(json_decode($mailJob->getMessage(), true));
86
87
        $this->assertEquals(FixtureHelper::getMailMessage(), $dequeuedMailMessage);
88
89
        $mailJob->markAsCompleted();
90
        $btQueueStore->ack($mailJob);
0 ignored issues
show
Bug introduced by
It seems like $mailJob defined by $btQueueStore->dequeue() on line 79 can be null; however, Da\Mailer\Queue\Backend\...ueueStoreAdapter::ack() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
91
92
        $this->assertTrue($btQueueStore->dequeue() === null);
93
    }
94
95
    public function testEnqueDequeueWithDelay()
96
    {
97
        $time = time() + 2;
98
        $payload = json_decode($this->payload, true);
99
        $payload['job'] = new Job(1, 'demo');
100
        $btJob2 = Mockery::mock('\Pheanstalk\Job')
101
            ->shouldReceive('getData')
102
            ->andReturn(json_encode($payload))
103
            ->getMock();
104
        $btClient = Mockery::mock('\Pheanstalk\Pheanstalk')
105
            ->shouldReceive('useTube')
106
            ->with(Mockery::mustBe('mail_queue'))
107
            ->andReturnSelf()
108
            ->shouldReceive('put')
109
            ->withAnyArgs()
110
            ->andReturn(1)
111
            ->shouldReceive('watchOnly')
112
            ->with(Mockery::mustBe('mail_queue'))
113
            ->andReturnSelf()
114
            ->shouldReceive('reserve')
115
            ->with(0)
116
            ->andReturn(null, $btJob2)
117
            ->shouldReceive('delete')
118
            ->andReturn(1)
119
            ->getMock();
120
121
        $btConnection = Mockery::mock('\Da\Mailer\Queue\Backend\Beanstalk\BeanstalkdQueueStoreConnection')
122
            ->shouldReceive('connect')
123
            ->andReturnSelf()
124
            ->shouldReceive('getInstance')
125
            ->andReturn($btClient)
126
            ->getMock();
127
128
        $btQueueStore = new BeanstalkdQueueStoreAdapter($btConnection);
129
130
        $mailJob = $this->mailJob;
131
        $mailJob->setTimeToSend($time);
132
        $this->assertTrue($btQueueStore->enqueue($mailJob) > 0);
133
        $this->assertTrue($btQueueStore->dequeue() === null);
134
        sleep(3); // sleep three seconds to expire in delayed
135
        $mailJob = $btQueueStore->dequeue(); // now it should have migrated
136
137
        $this->assertTrue(!empty($mailJob->getMessage()));
138
139
        $mailJob->markAsCompleted();
140
        $btQueueStore->ack($mailJob);
0 ignored issues
show
Bug introduced by
It seems like $mailJob defined by $btQueueStore->dequeue() on line 135 can be null; however, Da\Mailer\Queue\Backend\...ueueStoreAdapter::ack() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
141
    }
142
143
144
    /**
145
     * @expectedException \Da\Mailer\Exception\InvalidCallException
146
     */
147
    public function testBadMethodCallExceptionOnAck()
148
    {
149
        $mailJob = FixtureHelper::getBeanstalkdMailJob();
150
        $connection = new BeanstalkdQueueStoreConnection([]);
151
        $btQueueStore = new BeanstalkdQueueStoreAdapter($connection);
152
        $btQueueStore->ack($mailJob);
153
    }
154
155
    public function testNonCompletedAck()
156
    {
157
        $statsTubeResponse1 = new ArrayResponse('test', ['current-jobs-delayed' => 1,]);
158
        $statsTubeResponse2 = new ArrayResponse(
159
            'test', [
160
                'current-jobs-delayed' => 0,
161
                'current-jobs-urgent' => 0,
162
                'current-jobs-ready' => 0
163
            ]
164
        );
165
        $payload = json_decode($this->payload, true);
166
        $payload['job'] = new Job(1, 'demo');
167
        $btJob2 = Mockery::mock('\Pheanstalk\Job')
168
            ->shouldReceive('getData')
169
            ->andReturn(json_encode($payload))
170
            ->getMock();
171
        $btClient = Mockery::mock('\Pheanstalk\Pheanstalk')
0 ignored issues
show
Bug introduced by
The method shouldReceive() does not seem to exist on object<Mockery\Expectation>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
172
            ->shouldReceive('useTube')
173
            ->with(Mockery::mustBe('mail_queue'))
174
            ->andReturnSelf()
175
            ->shouldReceive('put')
176
            ->withAnyArgs()
177
            ->andReturn(3)
178
            ->shouldReceive('statsTube')
179
            ->twice()
180
            ->andReturn($statsTubeResponse1, $statsTubeResponse2)
181
            ->shouldReceive('watchOnly')
182
            ->with(Mockery::mustBe('mail_queue'))
183
            ->andReturnSelf()
184
            ->shouldReceive('reserve')
185
            ->with(0)
186
            ->andReturn($btJob2)
187
            ->shouldReceive('release')
188
            ->andReturn(1)
189
            ->shouldReceive('delete')
190
            ->andReturn(1)
191
            ->getMock();
192
193
        $btConnection = Mockery::mock('\Da\Mailer\Queue\Backend\Beanstalk\BeanstalkdQueueStoreConnection')
0 ignored issues
show
Bug introduced by
The method shouldReceive() does not seem to exist on object<Mockery\Expectation>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
194
            ->shouldReceive('connect')
195
            ->andReturnSelf()
196
            ->shouldReceive('getInstance')
197
            ->andReturn($btClient)
198
            ->getMock();
199
200
        $btQueueStore = new BeanstalkdQueueStoreAdapter($btConnection);
201
202
203
        $this->assertSame($btQueueStore, $btQueueStore->init());
204
        $this->assertTrue($btQueueStore->enqueue($this->mailJob) > 1);
205
206
        $this->assertTrue($btQueueStore->isEmpty() === false);
207
208
        $mailJob = $btQueueStore->dequeue();
209
210
        $this->assertTrue($btQueueStore->isEmpty() === true);
211
212
        $this->assertTrue(!empty($mailJob->getMessage()));
213
214
        $dequeuedMailMessage = MailMessage::fromArray(json_decode($mailJob->getMessage(), true));
215
216
        $this->assertEquals(FixtureHelper::getMailMessage(), $dequeuedMailMessage);
217
        $btQueueStore->ack($mailJob);
0 ignored issues
show
Bug introduced by
It seems like $mailJob defined by $btQueueStore->dequeue() on line 208 can be null; however, Da\Mailer\Queue\Backend\...ueueStoreAdapter::ack() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
218
    }
219
}
220