Completed
Push — 1.1 ( 12efad )
by David
02:09
created

ClientTest::testExceptionOnExchangeEmptyName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 6
rs 9.4285
cc 1
eloc 4
nc 1
nop 0
1
<?php
2
3
namespace Mouf\AmqpClient\Objects;
4
5
use Mouf\AmqpClient\Client;
6
use Mouf\AmqpClient\Consumer;
7
use Mouf\AmqpClient\ConsumerService;
8
use PhpAmqpLib\Message\AMQPMessage;
9
10
class ClientTest extends \PHPUnit_Framework_TestCase
11
{
12
    /**
13
     * @var Client
14
     */
15
    private $client;
16
    private $exchange;
17
    /**
18
     * @var Queue
19
     */
20
    private $queue;
21
    /**
22
     * @var Exchange
23
     */
24
    private $deadLetterExchange;
25
    /**
26
     * @var Queue
27
     */
28
    private $deadLetterQueue;
29
    private $msgReceived;
30
    private $deadLetterMsgReceived;
31
    private $triggerException = false;
32
33
    private function makeClient()
34
    {
35
        global $rabbitmq_host;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
36
        global $rabbitmq_port;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
37
        global $rabbitmq_user;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
38
        global $rabbitmq_password;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
39
40
        $client = new Client($rabbitmq_host, $rabbitmq_port, $rabbitmq_user, $rabbitmq_password);
41
        $client->setPrefetchCount(1);
42
        return $client;
43
    }
44
45
    protected function init()
46
    {
47
        $this->client = $this->makeClient();
48
        $this->exchange = new Exchange($this->client, 'test_exchange', 'fanout');
49
        $this->queue = new Queue($this->client, 'test_queue', [
50
            new Consumer(function(AMQPMessage $msg) {
51
                $this->msgReceived = $msg;
52
                if ($this->triggerException) {
53
                    throw new \Exception('boom!');
54
                }
55
            })
56
        ]);
57
        $this->queue->setDurable(true);
58
59
        $binding = new Binding($this->exchange, $this->queue);
60
        $this->client->register($binding);
61
62
63
        $this->deadLetterExchange = new Exchange($this->client, 'test_dead_letter_exchange', 'fanout');
64
65
        $this->deadLetterQueue = new Queue($this->client, 'test_dead_letter_queue', [
66
            new Consumer(function(AMQPMessage $msg) {
67
                $this->deadLetterMsgReceived = $msg;
68
            })
69
        ]);
70
        $this->deadLetterQueue->setDurable(true);
71
72
        $this->queue->setDeadLetterExchange($this->deadLetterExchange);
73
74
        $binding = new Binding($this->deadLetterExchange, $this->deadLetterQueue);
75
        $this->client->register($binding);
76
    }
77
78
    public function testExchange()
79
    {
80
        $this->init();
81
        $this->exchange->publish(new Message('my message'), 'key');
82
    }
83
84
    /**
85
     * @depends testExchange
86
     */
87
    public function testQueue()
88
    {
89
        $this->init();
90
91
        $consumerService = new ConsumerService($this->client, [
92
            $this->queue
93
        ]);
94
95
        $consumerService->run(true);
96
97
        $this->assertEquals('my message', $this->msgReceived->getBody());
98
    }
99
100
    /**
101
     * @depends testExchange
102
     */
103
    public function testDeadLetterQueue()
104
    {
105
        $this->init();
106
107
        $this->exchange->publish(new Message('my other message'), 'key');
108
109
        $this->triggerException = true;
110
111
        $consumerService = new ConsumerService($this->client, [
112
            $this->queue,
113
            $this->deadLetterQueue
114
        ]);
115
116
        $consumerService->run(true);
117
        $consumerService->run(true);
118
119
        $this->assertEquals('my other message', $this->msgReceived->getBody());
120
        $this->assertEquals('my other message', $this->deadLetterMsgReceived->getBody());
121
    }
122
123
    public function testExceptionOnExchangeEmptyName()
124
    {
125
        $client = $this->makeClient();
126
        $this->expectException(\InvalidArgumentException::class);
127
        new Exchange($client, '', 'direct');
128
    }
129
130 View Code Duplication
    public function testDefaultExchange()
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...
131
    {
132
        $client = $this->makeClient();
133
        // Let's send a message on RabbitMQ default exchange (named "")
134
        $exchange = new DefaultExchange($client);
135
        $queue = new Queue($client, 'test_direct_queue', [
136
            new Consumer(function(AMQPMessage $msg) {
137
                $this->msgReceived = $msg;
138
            })
139
        ]);
140
141
        // The key is the name of the queue.
142
        $exchange->publish(new Message('hello'), 'test_direct_queue');
143
144
        $consumerService = new ConsumerService($client, [
145
            $queue
146
        ]);
147
148
        $consumerService->run(true);
149
150
        $this->assertEquals('hello', $this->msgReceived->getBody());
151
    }
152
153 View Code Duplication
    public function testPublishToQueue()
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...
154
    {
155
        $client = $this->makeClient();
156
        $queue = new Queue($client, 'test_direct_queue', [
157
            new Consumer(function(AMQPMessage $msg) {
158
                $this->msgReceived = $msg;
159
            })
160
        ]);
161
162
        // The key is the name of the queue.
163
        $queue->publish(new Message('hello'));
164
165
        $consumerService = new ConsumerService($client, [
166
            $queue
167
        ]);
168
169
        $consumerService->run(true);
170
171
        $this->assertEquals('hello', $this->msgReceived->getBody());
172
    }
173
}
174