Passed
Pull Request — master (#649)
by
unknown
06:44
created

testDefaultAnonConsumerDefinition()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 34
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 25
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 34
rs 9.52
1
<?php
2
3
namespace OldSound\RabbitMqBundle\Tests\DependencyInjection;
4
5
use Symfony\Component\DependencyInjection\ContainerBuilder;
6
use Symfony\Component\DependencyInjection\ContainerInterface;
7
use Symfony\Component\DependencyInjection\Definition;
8
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
9
use Symfony\Component\Config\FileLocator;
10
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
11
use OldSound\RabbitMqBundle\DependencyInjection\OldSoundRabbitMqExtension;
12
use Symfony\Component\DependencyInjection\Reference;
13
use PHPUnit\Framework\TestCase;
14
15
class OldSoundRabbitMqExtensionTest extends TestCase
16
{
17
    public function testFooConnectionDefinition()
18
    {
19
        $container = $this->getContainer('test.yml');
20
21
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection.foo_connection'));
22
        $definition = $container->getDefinition('old_sound_rabbit_mq.connection.foo_connection');
23
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.foo_connection'));
24
        $factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.foo_connection');
25
        $this->assertEquals(array('old_sound_rabbit_mq.connection_factory.foo_connection', 'createConnection'), $definition->getFactory());
26
        $this->assertEquals(array(
27
            'host' => 'foo_host',
28
            'port' => 123,
29
            'user' => 'foo_user',
30
            'password' => 'foo_password',
31
            'vhost' => '/foo',
32
            'lazy' => false,
33
            'connection_timeout' => 3,
34
            'read_write_timeout' => 3,
35
            'ssl_context' => array(),
36
            'keepalive' => false,
37
            'heartbeat' => 0,
38
            'use_socket' => false,
39
            'url' => '',
40
            'hosts' => [],
41
        ), $factory->getArgument(1));
42
        $this->assertEquals('%old_sound_rabbit_mq.connection.class%', $definition->getClass());
43
    }
44
45
    public function testSslConnectionDefinition()
46
    {
47
        $container = $this->getContainer('test.yml');
48
49
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection.ssl_connection'));
50
        $definition = $container->getDefinition('old_sound_rabbit_mq.connection.ssl_connection');
51
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.ssl_connection'));
52
        $factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.ssl_connection');
53
        $this->assertEquals(array('old_sound_rabbit_mq.connection_factory.ssl_connection', 'createConnection'), $definition->getFactory());
54
        $this->assertEquals(array(
55
            'host' => 'ssl_host',
56
            'port' => 123,
57
            'user' => 'ssl_user',
58
            'password' => 'ssl_password',
59
            'vhost' => '/ssl',
60
            'lazy' => false,
61
            'connection_timeout' => 3,
62
            'read_write_timeout' => 3,
63
            'ssl_context' => array(
64
                'verify_peer' => false,
65
            ),
66
            'keepalive' => false,
67
            'heartbeat' => 0,
68
            'use_socket' => false,
69
            'url' => '',
70
            'hosts' => [],
71
        ), $factory->getArgument(1));
72
        $this->assertEquals('%old_sound_rabbit_mq.connection.class%', $definition->getClass());
73
    }
74
75
    public function testLazyConnectionDefinition()
76
    {
77
        $container = $this->getContainer('test.yml');
78
79
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection.lazy_connection'));
80
        $definition = $container->getDefinition('old_sound_rabbit_mq.connection.lazy_connection');
81
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.lazy_connection'));
82
        $factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.lazy_connection');
83
        $this->assertEquals(array('old_sound_rabbit_mq.connection_factory.lazy_connection', 'createConnection'), $definition->getFactory());
84
        $this->assertEquals(array(
85
            'host' => 'lazy_host',
86
            'port' => 456,
87
            'user' => 'lazy_user',
88
            'password' => 'lazy_password',
89
            'vhost' => '/lazy',
90
            'lazy' => true,
91
            'connection_timeout' => 3,
92
            'read_write_timeout' => 3,
93
            'ssl_context' => array(),
94
            'keepalive' => false,
95
            'heartbeat' => 0,
96
            'use_socket' => false,
97
            'url' => '',
98
            'hosts' => [],
99
        ), $factory->getArgument(1));
100
        $this->assertEquals('%old_sound_rabbit_mq.lazy.connection.class%', $definition->getClass());
101
    }
102
103
    public function testDefaultConnectionDefinition()
104
    {
105
        $container = $this->getContainer('test.yml');
106
107
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection.default'));
108
        $definition = $container->getDefinition('old_sound_rabbit_mq.connection.default');
109
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.default'));
110
        $factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.default');
111
        $this->assertEquals(array('old_sound_rabbit_mq.connection_factory.default', 'createConnection'), $definition->getFactory());
112
        $this->assertEquals(array(
113
            'host' => 'localhost',
114
            'port' => 5672,
115
            'user' => 'guest',
116
            'password' => 'guest',
117
            'vhost' => '/',
118
            'lazy' => false,
119
            'connection_timeout' => 3,
120
            'read_write_timeout' => 3,
121
            'ssl_context' => array(),
122
            'keepalive' => false,
123
            'heartbeat' => 0,
124
            'use_socket' => false,
125
            'url' => '',
126
            'hosts' => [],
127
        ), $factory->getArgument(1));
128
        $this->assertEquals('%old_sound_rabbit_mq.connection.class%', $definition->getClass());
129
    }
130
131
    public function testSocketConnectionDefinition()
132
    {
133
        $container = $this->getContainer('test.yml');
134
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection.socket_connection'));
135
        $definiton = $container->getDefinition('old_sound_rabbit_mq.connection.socket_connection');
136
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.socket_connection'));
137
        $this->assertEquals('%old_sound_rabbit_mq.socket_connection.class%', $definiton->getClass());
138
    }
139
140
    public function testLazySocketConnectionDefinition()
141
    {
142
        $container = $this->getContainer('test.yml');
143
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection.lazy_socket'));
144
        $definiton = $container->getDefinition('old_sound_rabbit_mq.connection.lazy_socket');
145
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.lazy_socket'));
146
        $this->assertEquals('%old_sound_rabbit_mq.lazy.socket_connection.class%', $definiton->getClass());
147
    }
148
149
    public function testClusterConnectionDefinition()
150
    {
151
        $container = $this->getContainer('test.yml');
152
153
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection.cluster_connection'));
154
        $definition = $container->getDefinition('old_sound_rabbit_mq.connection.cluster_connection');
155
        $this->assertTrue($container->has('old_sound_rabbit_mq.connection_factory.cluster_connection'));
156
        $factory = $container->getDefinition('old_sound_rabbit_mq.connection_factory.cluster_connection');
157
        $this->assertEquals(['old_sound_rabbit_mq.connection_factory.cluster_connection', 'createConnection'], $definition->getFactory());
158
        $this->assertEquals([
159
            'hosts' => [
160
                [
161
                    'host' => 'cluster_host',
162
                    'port' => 111,
163
                    'user' => 'cluster_user',
164
                    'password' => 'cluster_password',
165
                    'vhost' => '/cluster',
166
                    'url' => ''
167
                ],
168
                [
169
                    'host' => 'localhost',
170
                    'port' => 5672,
171
                    'user' => 'guest',
172
                    'password' => 'guest',
173
                    'vhost' => '/',
174
                    'url' => 'amqp://cluster_url_host:cluster_url_pass@host:10000/cluster_url_vhost'
175
                ]
176
            ],
177
            'host' => 'localhost',
178
            'port' => 5672,
179
            'user' => 'guest',
180
            'password' => 'guest',
181
            'vhost' => '/',
182
            'lazy' => false,
183
            'connection_timeout' => 3,
184
            'read_write_timeout' => 3,
185
            'ssl_context' => array(),
186
            'keepalive' => false,
187
            'heartbeat' => 0,
188
            'use_socket' => false,
189
            'url' => '',
190
        ], $factory->getArgument(1));
191
        $this->assertEquals('%old_sound_rabbit_mq.connection.class%', $definition->getClass());
192
    }
193
194
    public function testFooBinding()
195
    {
196
        $container = $this->getContainer('test.yml');
197
        $binding = array(
198
            'arguments'                 => null,
199
            'class'                     => '%old_sound_rabbit_mq.binding.class%',
200
            'connection'                => 'default',
201
            'exchange'                  => 'foo',
202
            'destination'               => 'bar',
203
            'destination_is_exchange'   => false,
204
            'nowait'                    => false,
205
            'routing_key'               => 'baz',
206
        );
207
        ksort($binding);
208
        $key = md5(json_encode($binding));
209
        $name = sprintf('old_sound_rabbit_mq.binding.%s', $key);
210
        $this->assertTrue($container->has($name));
211
        $definition = $container->getDefinition($name);
212
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
213
        $this->assertBindingMethodCalls($definition, $binding);
214
    }
215
216
    public function testMooBinding()
217
    {
218
        $container = $this->getContainer('test.yml');
219
        $binding = array(
220
            'arguments'                 => array('moo' => 'cow'),
221
            'class'                     => '%old_sound_rabbit_mq.binding.class%',
222
            'connection'                => 'default2',
223
            'exchange'                  => 'moo',
224
            'destination'               => 'cow',
225
            'destination_is_exchange'   => true,
226
            'nowait'                    => true,
227
            'routing_key'               => null,
228
        );
229
        ksort($binding);
230
        $key = md5(json_encode($binding));
231
        $name = sprintf('old_sound_rabbit_mq.binding.%s', $key);
232
        $this->assertTrue($container->has($name));
233
        $definition = $container->getDefinition($name);
234
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default2');
235
        $this->assertBindingMethodCalls($definition, $binding);
236
    }
237
238
    protected function assertBindingMethodCalls(Definition $definition, $binding)
239
    {
240
        $this->assertEquals(array(
241
            array(
242
                'setArguments',
243
                array(
244
                    $binding['arguments']
245
                )
246
            ),
247
            array(
248
                'setDestination',
249
                array(
250
                    $binding['destination']
251
                )
252
            ),
253
            array(
254
                'setDestinationIsExchange',
255
                array(
256
                    $binding['destination_is_exchange']
257
                )
258
            ),
259
            array(
260
                'setExchange',
261
                array(
262
                    $binding['exchange']
263
                )
264
            ),
265
            array(
266
                'isNowait',
267
                array(
268
                    $binding['nowait']
269
                )
270
            ),
271
            array(
272
                'setRoutingKey',
273
                array(
274
                    $binding['routing_key']
275
                )
276
            ),
277
        ),
278
            $definition->getMethodCalls()
279
        );
280
    }
281
    public function testFooProducerDefinition()
282
    {
283
        $container = $this->getContainer('test.yml');
284
285
        $this->assertTrue($container->has('old_sound_rabbit_mq.foo_producer_producer'));
286
        $definition = $container->getDefinition('old_sound_rabbit_mq.foo_producer_producer');
287
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.foo_connection');
288
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.foo_producer');
289
        $this->assertEquals(array(
290
                array(
291
                    'setExchangeOptions',
292
                    array(
293
                        array(
294
                            'name'        => 'foo_exchange',
295
                            'type'        => 'direct',
296
                            'passive'     => true,
297
                            'durable'     => false,
298
                            'auto_delete' => true,
299
                            'internal'    => true,
300
                            'nowait'      => true,
301
                            'arguments'   => null,
302
                            'ticket'      => null,
303
                            'declare'     => true,
304
                        )
305
                    )
306
                ),
307
                array(
308
                    'setQueueOptions',
309
                    array(
310
                        array(
311
                            'name'        => '',
312
                            'declare'     => false,
313
                        )
314
                    )
315
                )
316
            ),
317
            $definition->getMethodCalls()
318
        );
319
        $this->assertEquals('My\Foo\Producer', $definition->getClass());
320
    }
321
322
    public function testProducerArgumentAliases()
323
    {
324
        /** @var ContainerInterface $container */
325
        $container = $this->getContainer('test.yml');
326
327
        if (!method_exists($container, 'registerAliasForArgument')) {
328
            // don't test if autowiring arguments functionality is not available
329
            return;
330
        }
331
332
        // test expected aliases
333
        $producerInterface = 'OldSound\RabbitMqBundle\RabbitMq\ProducerInterface';
334
        $expectedAliases = array(
335
            $producerInterface . ' $fooProducer' => 'old_sound_rabbit_mq.foo_producer_producer',
336
            'My\Foo\Producer $fooProducer' => 'old_sound_rabbit_mq.foo_producer_producer',
337
            $producerInterface . ' $fooProducerAliasedProducer' => 'old_sound_rabbit_mq.foo_producer_aliased_producer',
338
            'My\Foo\Producer $fooProducerAliasedProducer' => 'old_sound_rabbit_mq.foo_producer_aliased_producer',
339
            $producerInterface . ' $defaultProducer' => 'old_sound_rabbit_mq.default_producer_producer',
340
            '%old_sound_rabbit_mq.producer.class% $defaultProducer' => 'old_sound_rabbit_mq.default_producer_producer',
341
        );
342
343
        foreach($expectedAliases as $id => $target) {
344
            $this->assertTrue($container->hasAlias($id), sprintf('Container should have %s alias for autowiring support.', $id));
345
346
            $alias = $container->getAlias($id);
347
            $this->assertEquals($target, (string)$alias, sprintf('Autowiring for %s should use %s.', $id, $target));
348
            $this->assertFalse($alias->isPublic(), sprintf('Autowiring alias for %s should be private', $id));
349
        }
350
    }
351
352
    /**
353
     * @group alias
354
     */
355
    public function testAliasedFooProducerDefinition()
356
    {
357
        $container = $this->getContainer('test.yml');
358
359
        $this->assertTrue($container->has('old_sound_rabbit_mq.foo_producer_producer'));
360
        $this->assertTrue($container->has('foo_producer_alias'));
361
    }
362
363
    public function testDefaultProducerDefinition()
364
    {
365
        $container = $this->getContainer('test.yml');
366
367
        $this->assertTrue($container->has('old_sound_rabbit_mq.default_producer_producer'));
368
        $definition = $container->getDefinition('old_sound_rabbit_mq.default_producer_producer');
369
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
370
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.default_producer');
371
        $this->assertEquals(array(
372
                array(
373
                    'setExchangeOptions',
374
                    array(
375
                        array(
376
                            'name'        => 'default_exchange',
377
                            'type'        => 'direct',
378
                            'passive'     => false,
379
                            'durable'     => true,
380
                            'auto_delete' => false,
381
                            'internal'    => false,
382
                            'nowait'      => false,
383
                            'arguments'   => null,
384
                            'ticket'      => null,
385
                            'declare'     => true,
386
                        )
387
                    )
388
                ),
389
                array(
390
                    'setQueueOptions',
391
                    array(
392
                        array(
393
                            'name'        => '',
394
                            'declare'     => false,
395
                        )
396
                    )
397
                )
398
            ),
399
            $definition->getMethodCalls()
400
        );
401
        $this->assertEquals('%old_sound_rabbit_mq.producer.class%', $definition->getClass());
402
    }
403
404
    public function testFooConsumerDefinition()
405
    {
406
        $container = $this->getContainer('test.yml');
407
408
        $this->assertTrue($container->has('old_sound_rabbit_mq.foo_consumer_consumer'));
409
        $definition = $container->getDefinition('old_sound_rabbit_mq.foo_consumer_consumer');
410
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.foo_connection');
411
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.foo_consumer');
412
        $this->assertEquals(array(
413
                array(
414
                    'setExchangeOptions',
415
                    array(
416
                        array(
417
                            'name'        => 'foo_exchange',
418
                            'type'        => 'direct',
419
                            'passive'     => true,
420
                            'durable'     => false,
421
                            'auto_delete' => true,
422
                            'internal'    => true,
423
                            'nowait'      => true,
424
                            'arguments'   => null,
425
                            'ticket'      => null,
426
                            'declare'     => true,
427
                        )
428
                    )
429
                ),
430
                array(
431
                    'setQueueOptions',
432
                    array(
433
                        array(
434
                            'name'         => 'foo_queue',
435
                            'passive'      => true,
436
                            'durable'      => false,
437
                            'exclusive'    => true,
438
                            'auto_delete'  => true,
439
                            'nowait'       => true,
440
                            'arguments'    => null,
441
                            'ticket'       => null,
442
                            'routing_keys' => array('android.#.upload', 'iphone.upload'),
443
                            'declare'      => true,
444
                        )
445
                    )
446
                ),
447
                array(
448
                    'setCallback',
449
                    array(array(new Reference('foo.callback'), 'execute'))
450
                ),
451
                array(
452
                    'setTimeoutWait',
453
                    array(3)
454
                )
455
            ),
456
            $definition->getMethodCalls()
457
        );
458
        $this->assertEquals('%old_sound_rabbit_mq.consumer.class%', $definition->getClass());
459
    }
460
461
    public function testConsumerArgumentAliases()
462
    {
463
        $container = $this->getContainer('test.yml');
464
465
        if (!method_exists($container, 'registerAliasForArgument')) {
466
            // don't test if autowiring arguments functionality is not available
467
            return;
468
        }
469
470
        $consumerInterface = 'OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface';
471
        $expectedAliases = array(
472
            $consumerInterface . ' $fooConsumer' => 'old_sound_rabbit_mq.foo_consumer_consumer',
473
            '%old_sound_rabbit_mq.consumer.class% $fooConsumer' => 'old_sound_rabbit_mq.foo_consumer_consumer',
474
            $consumerInterface . ' $defaultConsumer' => 'old_sound_rabbit_mq.default_consumer_consumer',
475
            '%old_sound_rabbit_mq.consumer.class% $defaultConsumer' => 'old_sound_rabbit_mq.default_consumer_consumer',
476
            $consumerInterface . ' $qosTestConsumer' => 'old_sound_rabbit_mq.qos_test_consumer_consumer',
477
            '%old_sound_rabbit_mq.consumer.class% $qosTestConsumer' => 'old_sound_rabbit_mq.qos_test_consumer_consumer'
478
        );
479
        foreach($expectedAliases as $id => $target) {
480
            $this->assertTrue($container->hasAlias($id), sprintf('Container should have %s alias for autowiring support.', $id));
481
482
            $alias = $container->getAlias($id);
483
            $this->assertEquals($target, (string)$alias, sprintf('Autowiring for %s should use %s.', $id, $target));
484
            $this->assertFalse($alias->isPublic(), sprintf('Autowiring alias for %s should be private', $id));
485
        }
486
    }
487
488
    public function testDefaultConsumerDefinition()
489
    {
490
        $container = $this->getContainer('test.yml');
491
492
        $this->assertTrue($container->has('old_sound_rabbit_mq.default_consumer_consumer'));
493
        $definition = $container->getDefinition('old_sound_rabbit_mq.default_consumer_consumer');
494
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
495
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.default_consumer');
496
        $this->assertEquals(array(
497
                array(
498
                    'setExchangeOptions',
499
                    array(
500
                        array(
501
                            'name'        => 'default_exchange',
502
                            'type'        => 'direct',
503
                            'passive'     => false,
504
                            'durable'     => true,
505
                            'auto_delete' => false,
506
                            'internal'    => false,
507
                            'nowait'      => false,
508
                            'arguments'   => null,
509
                            'ticket'      => null,
510
                            'declare'     => true,
511
                        )
512
                    )
513
                ),
514
                array(
515
                    'setQueueOptions',
516
                    array(
517
                        array(
518
                            'name'        => 'default_queue',
519
                            'passive'     => false,
520
                            'durable'     => true,
521
                            'exclusive'   => false,
522
                            'auto_delete' => false,
523
                            'nowait'      => false,
524
                            'arguments'   => null,
525
                            'ticket'      => null,
526
                            'routing_keys' => array(),
527
                            'declare'     => true,
528
                        )
529
                    )
530
                ),
531
                array(
532
                    'setCallback',
533
                    array(array(new Reference('default.callback'), 'execute'))
534
                )
535
            ),
536
            $definition->getMethodCalls()
537
        );
538
        $this->assertEquals('%old_sound_rabbit_mq.consumer.class%', $definition->getClass());
539
    }
540
541
    public function testConsumerWithQosOptions()
542
    {
543
        $container = $this->getContainer('test.yml');
544
545
        $this->assertTrue($container->has('old_sound_rabbit_mq.qos_test_consumer_consumer'));
546
        $definition = $container->getDefinition('old_sound_rabbit_mq.qos_test_consumer_consumer');
547
        $methodCalls = $definition->getMethodCalls();
548
549
        $setQosParameters = null;
550
        foreach ($methodCalls as $methodCall) {
551
            if ($methodCall[0] === 'setQosOptions') {
552
                $setQosParameters = $methodCall[1];
553
            }
554
        }
555
556
        $this->assertIsArray($setQosParameters);
557
        $this->assertEquals(
558
            array(
559
                1024,
560
                1,
561
                true
562
            ),
563
            $setQosParameters
564
        );
565
    }
566
567
    public function testMultipleConsumerDefinition()
568
    {
569
        $container = $this->getContainer('test.yml');
570
571
        $this->assertTrue($container->has('old_sound_rabbit_mq.multi_test_consumer_multiple'));
572
        $definition = $container->getDefinition('old_sound_rabbit_mq.multi_test_consumer_multiple');
573
        $this->assertEquals(array(
574
                array(
575
                    'setExchangeOptions',
576
                    array(
577
                        array(
578
                            'name'        => 'foo_multiple_exchange',
579
                            'type'        => 'direct',
580
                            'passive'     => false,
581
                            'durable'     => true,
582
                            'auto_delete' => false,
583
                            'internal'    => false,
584
                            'nowait'      => false,
585
                            'arguments'   => null,
586
                            'ticket'      => null,
587
                            'declare'     => true,
588
                        )
589
                    )
590
                ),
591
                array(
592
                    'setQueues',
593
                    array(
594
                        array(
595
                            'multi_test_1' => array(
596
                                'name'         => 'multi_test_1',
597
                                'passive'      => false,
598
                                'durable'      => true,
599
                                'exclusive'    => false,
600
                                'auto_delete'  => false,
601
                                'nowait'       => false,
602
                                'arguments'    => null,
603
                                'ticket'       => null,
604
                                'routing_keys' => array(),
605
                                'callback'     => array(new Reference('foo.multiple_test1.callback'), 'execute'),
606
                                'declare'      => true,
607
                            ),
608
                            'foo_bar_2' => array(
609
                                'name'         => 'foo_bar_2',
610
                                'passive'      => true,
611
                                'durable'      => false,
612
                                'exclusive'    => true,
613
                                'auto_delete'  => true,
614
                                'nowait'       => true,
615
                                'arguments'    => null,
616
                                'ticket'       => null,
617
                                'routing_keys' => array(
618
                                    'android.upload',
619
                                    'iphone.upload'
620
                                ),
621
                                'callback'     => array(new Reference('foo.multiple_test2.callback'), 'execute'),
622
                                'declare'      => true,
623
                            )
624
                        )
625
                    )
626
                ),
627
                array(
628
                    'setQueuesProvider',
629
                    array(
630
                        new Reference('foo.queues_provider')
631
                    )
632
                ),
633
                array(
634
                    'setTimeoutWait',
635
                    array(3)
636
                )
637
            ),
638
            $definition->getMethodCalls()
639
        );
640
    }
641
642
    public function testDynamicConsumerDefinition()
643
    {
644
        $container = $this->getContainer('test.yml');
645
646
        $this->assertTrue($container->has('old_sound_rabbit_mq.foo_dyn_consumer_dynamic'));
647
        $this->assertTrue($container->has('old_sound_rabbit_mq.bar_dyn_consumer_dynamic'));
648
649
        $definition = $container->getDefinition('old_sound_rabbit_mq.foo_dyn_consumer_dynamic');
650
        $this->assertEquals(array(
651
                array(
652
                    'setExchangeOptions',
653
                        array(
654
                            array(
655
                                'name' => 'foo_dynamic_exchange',
656
                                'type' => 'direct',
657
                                'passive' => false,
658
                                'durable' => true,
659
                                'auto_delete' => false,
660
                                'internal' => false,
661
                                'nowait' => false,
662
                                'declare' => true,
663
                                'arguments' => NULL,
664
                                'ticket' => NULL,
665
                            )
666
                        )
667
                ),
668
                array(
669
                    'setCallback',
670
                        array(
671
                            array(new Reference('foo.dynamic.callback'), 'execute')
672
                        )
673
                ),
674
                array(
675
                    'setQueueOptionsProvider',
676
                        array(
677
                            new Reference('foo.dynamic.provider')
678
                        )
679
                )
680
            ),
681
            $definition->getMethodCalls()
682
        );
683
    }
684
685
    public function testFooAnonConsumerDefinition()
686
    {
687
        $container = $this->getContainer('test.yml');
688
689
        $this->assertTrue($container->has('old_sound_rabbit_mq.foo_anon_consumer_anon'));
690
        $definition = $container->getDefinition('old_sound_rabbit_mq.foo_anon_consumer_anon');
691
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.foo_connection');
692
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.foo_anon_consumer');
693
        $this->assertEquals(array(
694
                array(
695
                    'setExchangeOptions',
696
                    array(
697
                        array(
698
                            'name'        => 'foo_anon_exchange',
699
                            'type'        => 'direct',
700
                            'passive'     => true,
701
                            'durable'     => false,
702
                            'auto_delete' => true,
703
                            'internal'    => true,
704
                            'nowait'      => true,
705
                            'arguments'   => null,
706
                            'ticket'      => null,
707
                            'declare'     => true,
708
                        )
709
                    )
710
                ),
711
                array(
712
                    'setCallback',
713
                    array(array(new Reference('foo_anon.callback'), 'execute'))
714
                )
715
            ),
716
            $definition->getMethodCalls()
717
        );
718
        $this->assertEquals('%old_sound_rabbit_mq.anon_consumer.class%', $definition->getClass());
719
    }
720
721
    public function testDefaultAnonConsumerDefinition()
722
    {
723
        $container = $this->getContainer('test.yml');
724
725
        $this->assertTrue($container->has('old_sound_rabbit_mq.default_anon_consumer_anon'));
726
        $definition = $container->getDefinition('old_sound_rabbit_mq.default_anon_consumer_anon');
727
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
728
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.default_anon_consumer');
729
        $this->assertEquals(array(
730
                array(
731
                    'setExchangeOptions',
732
                    array(
733
                        array(
734
                            'name'        => 'default_anon_exchange',
735
                            'type'        => 'direct',
736
                            'passive'     => false,
737
                            'durable'     => true,
738
                            'auto_delete' => false,
739
                            'internal'    => false,
740
                            'nowait'      => false,
741
                            'arguments'   => null,
742
                            'ticket'      => null,
743
                            'declare'     => true,
744
                        )
745
                    )
746
                ),
747
                array(
748
                    'setCallback',
749
                    array(array(new Reference('default_anon.callback'), 'execute'))
750
                )
751
            ),
752
            $definition->getMethodCalls()
753
        );
754
        $this->assertEquals('%old_sound_rabbit_mq.anon_consumer.class%', $definition->getClass());
755
    }
756
757
    public function testFooRpcClientDefinition()
758
    {
759
        $container = $this->getContainer('rpc-clients.yml');
760
761
        $this->assertTrue($container->has('old_sound_rabbit_mq.foo_client_rpc'));
762
        $definition = $container->getDefinition('old_sound_rabbit_mq.foo_client_rpc');
763
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.foo_connection');
764
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.foo_client');
765
        $this->assertEquals(
766
            array(
767
                array('initClient', array(true)),
768
                array('setUnserializer', array('json_decode')),
769
                array('setDirectReplyTo', array(true)),
770
            ),
771
            $definition->getMethodCalls()
772
        );
773
        $this->assertEquals('%old_sound_rabbit_mq.rpc_client.class%', $definition->getClass());
774
    }
775
776
    public function testDefaultRpcClientDefinition()
777
    {
778
        $container = $this->getContainer('rpc-clients.yml');
779
780
        $this->assertTrue($container->has('old_sound_rabbit_mq.default_client_rpc'));
781
        $definition = $container->getDefinition('old_sound_rabbit_mq.default_client_rpc');
782
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
783
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.default_client');
784
        $this->assertEquals(
785
            array(
786
                array('initClient', array(true)),
787
                array('setUnserializer', array('unserialize')),
788
                array('setDirectReplyTo', array(false)),
789
            ),
790
            $definition->getMethodCalls()
791
        );
792
        $this->assertFalse($definition->isLazy());
793
        $this->assertEquals('%old_sound_rabbit_mq.rpc_client.class%', $definition->getClass());
794
    }
795
796
    public function testLazyRpcClientDefinition()
797
    {
798
        $container = $this->getContainer('rpc-clients.yml');
799
800
        $this->assertTrue($container->has('old_sound_rabbit_mq.lazy_client_rpc'));
801
        $definition = $container->getDefinition('old_sound_rabbit_mq.lazy_client_rpc');
802
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
803
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.lazy_client');
804
        $this->assertEquals(
805
            array(
806
                array('initClient', array(true)),
807
                array('setUnserializer', array('unserialize')),
808
                array('setDirectReplyTo', array(false)),
809
            ),
810
            $definition->getMethodCalls()
811
        );
812
        $this->assertTrue($definition->isLazy());
813
        $this->assertEquals('%old_sound_rabbit_mq.rpc_client.class%', $definition->getClass());
814
    }
815
816
    public function testFooRpcServerDefinition()
817
    {
818
        $container = $this->getContainer('test.yml');
819
820
        $this->assertTrue($container->has('old_sound_rabbit_mq.foo_server_server'));
821
        $definition = $container->getDefinition('old_sound_rabbit_mq.foo_server_server');
822
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.foo_connection');
823
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.foo_server');
824
        $this->assertEquals(array(
825
                array('initServer', array('foo_server')),
826
                array('setCallback', array(array(new Reference('foo_server.callback'), 'execute'))),
827
                array('setSerializer', array('json_encode')),
828
            ),
829
            $definition->getMethodCalls()
830
        );
831
        $this->assertEquals('%old_sound_rabbit_mq.rpc_server.class%', $definition->getClass());
832
    }
833
834
    public function testDefaultRpcServerDefinition()
835
    {
836
        $container = $this->getContainer('test.yml');
837
838
        $this->assertTrue($container->has('old_sound_rabbit_mq.default_server_server'));
839
        $definition = $container->getDefinition('old_sound_rabbit_mq.default_server_server');
840
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
841
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.default_server');
842
        $this->assertEquals(array(
843
                array('initServer', array('default_server')),
844
                array('setCallback', array(array(new Reference('default_server.callback'), 'execute'))),
845
                array('setSerializer', array('serialize')),
846
            ),
847
            $definition->getMethodCalls()
848
        );
849
        $this->assertEquals('%old_sound_rabbit_mq.rpc_server.class%', $definition->getClass());
850
    }
851
852
    public function testRpcServerWithQueueOptionsDefinition()
853
    {
854
        $container = $this->getContainer('test.yml');
855
856
        $this->assertTrue($container->has('old_sound_rabbit_mq.server_with_queue_options_server'));
857
        $definition = $container->getDefinition('old_sound_rabbit_mq.server_with_queue_options_server');
858
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
859
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.server_with_queue_options');
860
        $this->assertEquals(array(
861
                array('initServer', array('server_with_queue_options')),
862
                array('setCallback', array(array(new Reference('server_with_queue_options.callback'), 'execute'))),
863
                array('setQueueOptions', array(array(
864
                    'name'         => 'server_with_queue_options-queue',
865
                    'passive'      => false,
866
                    'durable'      => true,
867
                    'exclusive'    => false,
868
                    'auto_delete'  => false,
869
                    'nowait'       => false,
870
                    'arguments'    => null,
871
                    'ticket'       => null,
872
                    'routing_keys' => array(),
873
                    'declare'      => true,
874
                ))),
875
                array('setSerializer', array('serialize')),
876
            ),
877
            $definition->getMethodCalls()
878
        );
879
        $this->assertEquals('%old_sound_rabbit_mq.rpc_server.class%', $definition->getClass());
880
    }
881
882
    public function testRpcServerWithExchangeOptionsDefinition()
883
    {
884
        $container = $this->getContainer('test.yml');
885
886
        $this->assertTrue($container->has('old_sound_rabbit_mq.server_with_exchange_options_server'));
887
        $definition = $container->getDefinition('old_sound_rabbit_mq.server_with_exchange_options_server');
888
        $this->assertEquals((string) $definition->getArgument(0), 'old_sound_rabbit_mq.connection.default');
889
        $this->assertEquals((string) $definition->getArgument(1), 'old_sound_rabbit_mq.channel.server_with_exchange_options');
890
        $this->assertEquals(array(
891
            array('initServer', array('server_with_exchange_options')),
892
            array('setCallback', array(array(new Reference('server_with_exchange_options.callback'), 'execute'))),
893
            array('setExchangeOptions', array(array(
894
                'name'         => 'exchange',
895
                'type'         => 'topic',
896
                'passive'      => false,
897
                'durable'      => true,
898
                'auto_delete'  => false,
899
                'internal'     => null,
900
                'nowait'       => false,
901
                'declare'      => true,
902
                'arguments'    => null,
903
                'ticket'       => null,
904
            ))),
905
            array('setSerializer', array('serialize')),
906
        ),
907
            $definition->getMethodCalls()
908
        );
909
        $this->assertEquals('%old_sound_rabbit_mq.rpc_server.class%', $definition->getClass());
910
    }
911
912
    public function testHasCollectorWhenChannelsExist()
913
    {
914
        $container = $this->getContainer('collector.yml');
915
916
        $this->assertTrue($container->has('old_sound_rabbit_mq.data_collector'));
917
        $definition = $container->getDefinition('old_sound_rabbit_mq.data_collector');
918
919
        $this->assertEquals(array(
920
                new Reference('old_sound_rabbit_mq.channel.default_producer'),
921
                new Reference('old_sound_rabbit_mq.channel.default_consumer'),
922
            ),
923
            $definition->getArgument(0)
924
        );
925
    }
926
927
    public function testHasNoCollectorWhenNoChannelsExist()
928
    {
929
        $container = $this->getContainer('no_collector.yml');
930
        $this->assertFalse($container->has('old_sound_rabbit_mq.data_collector'));
931
    }
932
933
    public function testCollectorCanBeDisabled()
934
    {
935
        $container = $this->getContainer('collector_disabled.yml');
936
        $this->assertFalse($container->has('old_sound_rabbit_mq.data_collector'));
937
    }
938
939
    public function testExchangeArgumentsAreArray()
940
    {
941
        $container = $this->getContainer('exchange_arguments.yml');
942
943
        $definition = $container->getDefinition('old_sound_rabbit_mq.producer_producer');
944
        $calls = $definition->getMethodCalls();
945
        $this->assertEquals('setExchangeOptions', $calls[0][0]);
946
        $options = $calls[0][1];
947
        $this->assertEquals(array('name' => 'bar'), $options[0]['arguments']);
948
949
        $definition = $container->getDefinition('old_sound_rabbit_mq.consumer_consumer');
950
        $calls = $definition->getMethodCalls();
951
        $this->assertEquals('setExchangeOptions', $calls[0][0]);
952
        $options = $calls[0][1];
953
        $this->assertEquals(array('name' => 'bar'), $options[0]['arguments']);
954
    }
955
956
    public function testProducerWithoutExplicitExchangeOptionsConnectsToAMQPDefault()
957
    {
958
        $container = $this->getContainer('no_exchange_options.yml');
959
960
        $definition = $container->getDefinition('old_sound_rabbit_mq.producer_producer');
961
        $calls = $definition->getMethodCalls();
962
        $this->assertEquals('setExchangeOptions', $calls[0][0]);
963
        $options = $calls[0][1];
964
965
        $this->assertEquals('', $options[0]['name']);
966
        $this->assertEquals('direct', $options[0]['type']);
967
        $this->assertEquals(false, $options[0]['declare']);
968
        $this->assertEquals(true, $options[0]['passive']);
969
    }
970
971
    public function testProducersWithLogger()
972
    {
973
        $container = $this->getContainer('config_with_enable_logger.yml');
974
        $definition = $container->getDefinition('old_sound_rabbit_mq.default_consumer_consumer');
975
        $this->assertTrue(
976
            $definition->hasTag('monolog.logger'), 'service should be marked for logger'
977
        );
978
    }
979
980
    private function getContainer($file, $debug = false)
981
    {
982
        $container = new ContainerBuilder(new ParameterBag(array('kernel.debug' => $debug)));
983
        $container->registerExtension(new OldSoundRabbitMqExtension());
984
985
        $locator = new FileLocator(__DIR__.'/Fixtures');
986
        $loader = new YamlFileLoader($container, $locator);
987
        $loader->load($file);
988
989
        $container->getCompilerPassConfig()->setOptimizationPasses(array());
990
        $container->getCompilerPassConfig()->setRemovingPasses(array());
991
        $container->compile();
992
993
        return $container;
994
    }
995
}
996