Passed
Push — master ( d1ccc3...a5920b )
by Nicolas
04:01
created

SendContext::iSendTheTextMessageWithRoutingKey()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 7
rs 9.4285
cc 1
eloc 4
nc 1
nop 1
1
<?php
2
3
namespace Puzzle\AMQP\Contexts;
4
5
use Puzzle\AMQP\Messages\Message;
6
use Puzzle\AMQP\Messages\Bodies\Json;
7
use Puzzle\AMQP\Messages\ContentType;
8
use Puzzle\AMQP\Messages\Processors\GZip;
9
10
class SendContext extends AbstractRabbitMQContext
11
{
12
    /**
13
     * @Given The queue :queue is empty
14
     */
15
    public function theQueueIsEmpty($queue)
16
    {
17
        $this->api->purgeQueue($this->vhost(), $queue);
18
        $this->assertMessagesInQueue($queue, 0);
19
    }
20
    
21
    /**
22
     * @When I send the text message :bodyContent
23
     */
24
    public function iSendTheTextMessageWithRoutingKey($bodyContent)
25
    {
26
        $message = new Message(self::TEXT_ROUTING_KEY);
27
        $message->setText($bodyContent);
28
     
29
        $this->iSendMessage($message);
30
    }
31
    
32
    /**
33
     * @When I send the xml message :bodyContent
34
     */
35
    public function iSendTheXmlMessage($bodyContent)
36
    {
37
        $message = new Message(self::XML_ROUTING_KEY);
38
        $message->setAttribute('content_type', 'application/xml');
39
        $message->setText($bodyContent);
40
41
        $this->iSendMessage($message);
42
    }
43
44
    /**
45
     * @When I send the json message :bodyContent
46
     */
47
    public function iSendTheJsonMessageWithRoutingKey($bodyContent)
48
    {
49
        $message = new Message(self::JSON_ROUTING_KEY);
50
        
51
        $body = new Json();
52
        $body->changeContentWithJson($bodyContent);
53
        $message->setBody($body);
54
     
55
        $this->iSendMessage($message);
56
    }
57
    
58
    /**
59
     * @When I send the gzipped text message :bodyContent
60
     */
61
    public function iSendTheGzippedTextMessage($bodyContent)
62
    {
63
        $message = new Message(self::TEXT_ROUTING_KEY);
64
        $message->setText($bodyContent);
65
        $message->allowCompression();
66
67
        $this->iSendMessage($message);
68
    }
69
70
    private function iSendMessage(Message $message)
71
    {
72
        $result = $this->client->publish($this->exchange, $message);
73
        
74
        \PHPUnit_Framework_Assert::assertTrue($result);
75
    }
76
    
77
    /**
78
     * @Then The queue :queue must contain :nbMessages message
79
     */
80
    public function theQueueMustContainMessage($queue, $nbMessages)
81
    {
82
        $this->assertMessagesInQueue($queue, (int) $nbMessages);
83
    }
84
    
85
    /**
86
     * @Then The message in queue :queueName contains :content and is a text message
87
     */
88
    public function theMessageInQueueContainsAndIsATextMessage($content, $queueName)
89
    {
90
        $this->theMessageInQueueContains(self::TEXT_ROUTING_KEY, $content, $queueName, "text/plain");
91
    }
92
    
93
    /**
94
     * @Then The message in queue :queueName contains :content and is a xml message
95
     */
96
    public function theMessageInQueueContainsAndIsAXmlMessage($content, $queueName)
97
    {
98
        $this->theMessageInQueueContains(self::XML_ROUTING_KEY, $content, $queueName, "application/xml");
99
    }
100
    
101
    /**
102
     * @Then The message in queue :queueName contains :content and is a json message
103
     */
104
    public function theMessageInQueueContainsAndIsAJsonMessage($content, $queueName)
105
    {
106
        $this->theMessageInQueueContains(self::JSON_ROUTING_KEY, $content, $queueName, "application/json");
107
    }
108
    
109
    /**
110
     * @Then The message in queue :queueName contains a gzipped message
111
     */
112
    public function theMessageInQueueContainsAGzippedMessage($queueName)
113
    {
114
        $message = $this->theMessageInQueueContains(self::TEXT_ROUTING_KEY, false, $queueName, ContentType::BINARY);
115
116
        \PHPUnit_Framework_Assert::assertArrayHasKey('headers', $message->properties);
117
        $headers = $message->properties['headers'];
118
119
        \PHPUnit_Framework_Assert::assertTrue(is_array($headers));
120
        \PHPUnit_Framework_Assert::assertArrayHasKey(GZip::HEADER_COMPRESSION, $headers);
121
        \PHPUnit_Framework_Assert::assertArrayHasKey(GZip::HEADER_COMPRESSION_CONTENT_TYPE, $headers);
122
        \PHPUnit_Framework_Assert::assertSame(Gzip::COMPRESSION_ALGORITHM, $headers[Gzip::HEADER_COMPRESSION]);
123
        \PHPUnit_Framework_Assert::assertSame(ContentType::TEXT, $headers[Gzip::HEADER_COMPRESSION_CONTENT_TYPE]);
124
    }
125
    
126
    private function theMessageInQueueContains($routingKey, $content, $queueName, $contentType)
127
    {
128
        $messages = $this->api->getMessagesFromQueue($this->vhost(), $queueName);
129
        $message = $messages->first();
130
        
131
        \PHPUnit_Framework_Assert::assertSame($routingKey, $message->routing_key);
132
        \PHPUnit_Framework_Assert::assertSame($contentType, $message->properties['content_type']);
133
134
        if($content !== false)
135
        {
136
            \PHPUnit_Framework_Assert::assertSame($content, $message->payload);
137
        }
138
139
        return $message;
140
    }
141
    
142
    private function assertMessagesInQueue($queue, $expectedNbMessages, $waitingSeconds = 11)
143
    {
144
        $nbMessages = $this->nbMessagesInQueue($queue);
145
        $nbTries = 0;
146
        
147
        while($nbMessages !== $expectedNbMessages && $nbTries < $waitingSeconds)
148
        {
149
            sleep(1);
150
            $nbTries++;
151
            
152
            $nbMessages = $this->nbMessagesInQueue($queue);
153
        }
154
        
155
        \PHPUnit_Framework_Assert::assertSame($expectedNbMessages, $nbMessages);
156
    }
157
    
158
    private function nbMessagesInQueue($queueName)
159
    {
160
        $queue = $this->api->getQueue($this->vhost(), $queueName);
161
        
162
        return (int) $queue->messages;
163
    }
164
}
165