Completed
Pull Request — master (#17)
by Nicolas
05:50
created

FeatureContext::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 17
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 11
nc 1
nop 0
1
<?php
2
3
use Behat\Behat\Context\Context;
4
use RabbitMQ\Management\APIClient;
5
use Puzzle\Configuration\Memory;
6
use Puzzle\AMQP\Clients\Pecl;
7
use Puzzle\AMQP\Messages\Message;
8
use Puzzle\AMQP\Messages\Bodies\Json;
9
10
/**
11
 * Defines application features from the specific context.
12
 */
13
class FeatureContext implements Context
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
14
{
15
    private
16
        $api,
1 ignored issue
show
Coding Style introduced by
The visibility should be declared for property $api.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
17
        $exchange,
18
        $client,
19
        $configuration;
20
    
21
    public function __construct()
22
    {
23
        
24
        $this->configuration = new Memory(array(
25
            'amqp/broker/host' => 'rabbitmq',
26
            'amqp/broker/login' => 'guest',
27
            'amqp/broker/password' => 'guest',
28
            'amqp/broker/vhost' => 'behat',
29
            'amqp/global/disallowSilentDropping' => true,
30
            'app/id' => 'puzzle-amqp-test',
31
        ));
32
        
33
        $this->exchange = 'puzzle';
34
        
35
        $this->api = APIClient::factory(['host' => $this->host()]);
1 ignored issue
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 4 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
36
        $this->client = new Pecl($this->configuration);
37
    }
38
    
39
    private function host()
40
    {
41
        return $this->configuration->readRequired('amqp/broker/host');
42
    }
43
    
44
    private function vhost()
45
    {
46
        return $this->configuration->readRequired('amqp/broker/vhost');
47
    }
48
49
    /**
50
     * @Given The queue :queue is empty
51
     */
52
    public function theQueueIsEmpty($queue)
53
    {
54
        $this->api->purgeQueue($this->vhost(), $queue);
55
        $this->assertMessagesInQueue($queue, 0);
56
    }
57
    
58
    /**
59
     * @When I send the text message :bodyContent with routing key :routingKey
60
     */
61
    public function iSendTheTextMessageWithRoutingKey($bodyContent, $routingKey)
62
    {
63
        $message = new Message($routingKey);
64
        $message->setText($bodyContent);
65
     
66
        $this->iSendMessage($message);
67
    }
68
    
69
    /**
70
     * @When I send the json message :bodyContent with routing key :routingKey
71
     */
72
    public function iSendTheJsonMessageWithRoutingKey($bodyContent, $routingKey)
73
    {
74
        $message = new Message($routingKey);
75
        
76
        $body = new Json();
77
        $body->changeContentWithJson($bodyContent);
78
        $message->setBody($body);
79
     
80
        $this->iSendMessage($message);
81
    }
82
    
83
    private function iSendMessage(Message $message)
84
    {
85
        $result = $this->client->publish($this->exchange, $message);
86
        
87
        \PHPUnit_Framework_Assert::assertTrue($result);
88
    }
89
    
90
    /**
91
     * @Then The queue :queue must contain :nbMessages message
92
     */
93
    public function theQueueMustContainMessage($queue, $nbMessages)
94
    {
95
        $this->assertMessagesInQueue($queue, (int) $nbMessages);
96
    }
97
    
98
    /**
99
     * @Then The message in queue :queueName has :arg1 as routing key, contains :content and is a text message
100
     */
101
    public function theMessageInQueueHasAsRoutingKeyContainsAndIsATextMessage2($routingKey, $content, $queueName)
102
    {
103
        $this->theMessageInQueueHasAsRoutingKeyContains($routingKey, $content, $queueName, "text/plain");
104
    }
105
    
106
    /**
107
     * @Then The message in queue :queueName has :arg1 as routing key, contains :content and is a json message
108
     */
109
    public function theMessageInQueueHasAsRoutingKeyContainsAndIsAJsonMessage($routingKey, $content, $queueName)
110
    {
111
        $this->theMessageInQueueHasAsRoutingKeyContains($routingKey, $content, $queueName, "application/json");
112
    }
113
    
114
    private function theMessageInQueueHasAsRoutingKeyContains($routingKey, $content, $queueName, $contentType)
115
    {
116
        $messages = $this->api->getMessagesFromQueue($this->vhost(), $queueName);
117
        $message = $messages->first();
1 ignored issue
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 2 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
118
        
119
        \PHPUnit_Framework_Assert::assertSame($routingKey, $message->routing_key);
120
        \PHPUnit_Framework_Assert::assertSame($content, $message->payload);
121
        \PHPUnit_Framework_Assert::assertSame($contentType, $message->properties['content_type']);
122
    }
123
    
124
    
125
    private function assertMessagesInQueue($queue, $expectedNbMessages, $waitingSeconds = 11)
126
    {
127
        $nbMessages = $this->nbMessagesInQueue($queue);
128
        $nbTries = 0;
1 ignored issue
show
Coding Style introduced by
Equals sign not aligned with surrounding assignments; expected 4 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

Loading history...
129
        
130
        while($nbMessages !== $expectedNbMessages && $nbTries < $waitingSeconds)
131
        {
132
            sleep(1);
133
            $nbTries++;
134
            
135
            $nbMessages = $this->nbMessagesInQueue($queue);
136
        }
137
        
138
        \PHPUnit_Framework_Assert::assertSame($expectedNbMessages, $nbMessages);
139
    }
140
    
141
    private function nbMessagesInQueue($queueName)
142
    {
143
        $queue = $this->api->getQueue($this->vhost(), $queueName);
144
        
145
        return (int) $queue->messages;
146
    }
147
}
148