Completed
Push — ezp26001-permissions_lookup_re... ( 2e76c0...5b8460 )
by
unknown
25:19
created

OutputVisitorPassTest::testPriority()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 43
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 27
c 1
b 0
f 0
nc 4
nop 0
dl 0
loc 43
rs 8.8571
1
<?php
2
3
/**
4
 * File containing the OutputVisitorPassTest class.
5
 *
6
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
7
 * @license For full copyright and license information view LICENSE file distributed with this source code.
8
 *
9
 * @version //autogentag//
10
 */
11
namespace eZ\Bundle\EzPublishRestBundle\Tests\DependencyInjection\Compiler;
12
13
use eZ\Bundle\EzPublishRestBundle\DependencyInjection\Compiler\OutputVisitorPass;
14
use Symfony\Component\DependencyInjection\ContainerBuilder;
15
use Symfony\Component\DependencyInjection\Definition;
16
use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractCompilerPassTestCase;
17
use Symfony\Component\DependencyInjection\Reference;
18
19
class OutputVisitorPassTest extends AbstractCompilerPassTestCase
20
{
21
    /**
22
     * Register the compiler pass under test, just like you would do inside a bundle's load()
23
     * method:.
24
     *
25
     *   $container->addCompilerPass(new MyCompilerPass());
26
     */
27
    protected function registerCompilerPass(ContainerBuilder $container)
28
    {
29
        $container->addCompilerPass(new OutputVisitorPass());
30
    }
31
32
    public function testProcess()
33
    {
34
        $stringRegexp = '(^.*/.*$)';
35
        $stringDefinition = new Definition();
36
        $stringDefinition->addTag('ezpublish_rest.output.visitor', ['regexps' => 'ezpublish_rest.output.visitor.test.regexps']);
37
        $this->setParameter('ezpublish_rest.output.visitor.test.regexps', [$stringRegexp]);
38
        $this->setDefinition('ezpublish_rest.output.visitor.test_string', $stringDefinition);
39
40
        $arrayRegexp = '(^application/json$)';
41
        $arrayDefinition = new Definition();
42
        $arrayDefinition->addTag('ezpublish_rest.output.visitor', ['regexps' => [$arrayRegexp]]);
43
        $this->setDefinition('ezpublish_rest.output.visitor.test_array', $arrayDefinition);
44
45
        $this->setDefinition('ezpublish_rest.output.visitor.dispatcher', new Definition());
46
47
        $this->compile();
48
49
        $visitorsInOrder = $this->getVisitorsInRegistrationOrder();
50
51
        self::assertEquals('ezpublish_rest.output.visitor.test_string', $visitorsInOrder[0]);
52
        self::assertEquals('ezpublish_rest.output.visitor.test_array', $visitorsInOrder[1]);
53
        $this->assertContainerBuilderHasService('ezpublish_rest.output.visitor.test_string');
54
        $this->assertContainerBuilderHasService('ezpublish_rest.output.visitor.test_array');
55
        $this->assertContainerBuilderHasServiceDefinitionWithMethodCall('ezpublish_rest.output.visitor.dispatcher', 'addVisitor', [
56
            $stringRegexp,
57
            new Reference('ezpublish_rest.output.visitor.test_string'),
58
        ]);
59
        $this->assertContainerBuilderHasServiceDefinitionWithMethodCall('ezpublish_rest.output.visitor.dispatcher', 'addVisitor', [
60
            $arrayRegexp,
61
            new Reference('ezpublish_rest.output.visitor.test_array'),
62
        ]);
63
    }
64
65
    public function testPriority()
66
    {
67
        $definitions = [
68
            'high' => [
69
                'regexps' => ['(^.*/.*$)'],
70
                'priority' => 10,
71
            ],
72
            'low' => [
73
                'regexps' => ['(^application/.*$)'],
74
                'priority' => -10,
75
            ],
76
            'normal_defined' => [
77
                'regexps' => ['(^application/json$)'],
78
                'priority' => 0,
79
            ],
80
            'normal' => [
81
                'regexps' => ['(^application/xml$)'],
82
            ],
83
        ];
84
85
        $expectedPriority = [
86
            'high',
87
            'normal_defined',
88
            'normal',
89
            'low',
90
        ];
91
92
        $this->setDefinition('ezpublish_rest.output.visitor.dispatcher', new Definition());
93
94
        foreach ($definitions as $name => $data) {
95
            $definition = new Definition();
96
            $definition->addTag('ezpublish_rest.output.visitor', $data);
97
            $this->setDefinition('ezpublish_rest.output.visitor.test_' . $name, $definition);
98
        }
99
100
        $this->compile();
101
102
        $visitorsInOrder = $this->getVisitorsInRegistrationOrder();
103
104
        foreach ($expectedPriority as $index => $priority) {
105
            self::assertEquals('ezpublish_rest.output.visitor.test_' . $priority, $visitorsInOrder[$index]);
106
        }
107
    }
108
109
    protected function getVisitorsInRegistrationOrder()
110
    {
111
        $calls = $this->container->getDefinition('ezpublish_rest.output.visitor.dispatcher')->getMethodCalls();
112
113
        return array_map(function ($call) {
114
            return (string) $call[1][1];
115
        }, $calls);
116
    }
117
}
118