Completed
Push — master ( dba66b...b8eb92 )
by Fabien
03:50
created

ServiceRepositoryTest   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 95
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 8
dl 0
loc 95
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A setUp() 0 8 2
B testRepositoryServiceWiring() 0 83 5
1
<?php
2
3
/*
4
 * This file is part of the Doctrine Bundle
5
 *
6
 * The code was originally distributed inside the Symfony framework.
7
 *
8
 * (c) Fabien Potencier <[email protected]>
9
 * (c) Doctrine Project, Benjamin Eberlei <[email protected]>
10
 *
11
 * For the full copyright and license information, please view the LICENSE
12
 * file that was distributed with this source code.
13
 */
14
15
namespace Doctrine\Bundle\DoctrineBundle\Tests;
16
17
use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\ServiceRepositoryCompilerPass;
18
use Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
19
use Doctrine\Common\Annotations\AnnotationReader;
20
use Doctrine\Common\Annotations\AnnotationRegistry;
21
use Doctrine\ORM\EntityRepository;
22
use Doctrine\ORM\QueryBuilder;
23
use Fixtures\Bundles\RepositoryServiceBundle\Entity\TestCustomClassRepoEntity;
24
use Fixtures\Bundles\RepositoryServiceBundle\Entity\TestCustomServiceRepoEntity;
25
use Fixtures\Bundles\RepositoryServiceBundle\Entity\TestDefaultRepoEntity;
26
use Fixtures\Bundles\RepositoryServiceBundle\Repository\TestCustomClassRepoRepository;
27
use Fixtures\Bundles\RepositoryServiceBundle\RepositoryServiceBundle;
28
use Fixtures\Bundles\RepositoryServiceBundle\Repository\TestCustomServiceRepoRepository;
29
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
30
use Symfony\Component\DependencyInjection\ContainerBuilder;
31
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
32
33
class ServiceRepositoryTest extends TestCase
34
{
35
    protected function setUp()
36
    {
37
        parent::setUp();
38
39
        if (!class_exists('Doctrine\\ORM\\Version')) {
40
            $this->markTestSkipped('Doctrine ORM is not available.');
41
        }
42
    }
43
44
    public function testRepositoryServiceWiring()
45
    {
46
        // needed for older versions of Doctrine
47
        AnnotationRegistry::registerFile(__DIR__.'/../vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\Common\Annotati...egistry::registerFile() has been deprecated with message: this method is deprecated and will be removed in doctrine/annotations 2.0 autoloading should be deferred to the globally registered autoloader by then. For now, use @example AnnotationRegistry::registerLoader('class_exists')

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
48
49
        $container = new ContainerBuilder(new ParameterBag([
50
            'kernel.name' => 'app',
51
            'kernel.debug' => false,
52
            'kernel.bundles' => ['RepositoryServiceBundle' => RepositoryServiceBundle::class],
53
            'kernel.cache_dir' => sys_get_temp_dir(),
54
            'kernel.environment' => 'test',
55
            'kernel.root_dir' => __DIR__.'/../../../../', // src dir
56
        ]));
57
        $container->set('annotation_reader', new AnnotationReader());
58
        $extension = new DoctrineExtension();
59
        $container->registerExtension($extension);
60
        $extension->load([[
61
            'dbal' => [
62
                'driver' => 'pdo_mysql',
63
                'charset' => 'UTF8',
64
            ],
65
            'orm' => [
66
                'mappings' => ['RepositoryServiceBundle' => [
67
                    'type' => 'annotation',
68
                    'dir' => __DIR__.'/DependencyInjection/Fixtures/Bundles/RepositoryServiceBundle/Entity',
69
                    'prefix' => 'Fixtures\Bundles\RepositoryServiceBundle\Entity',
70
                ]],
71
            ],
72
        ]], $container);
73
74
        $def = $container->register(TestCustomServiceRepoRepository::class, TestCustomServiceRepoRepository::class)
75
            ->setPublic(false);
76
77
        // Symfony 2.7 compat - can be moved above later
78
        if (method_exists($def, 'setAutowired')) {
79
            $def->setAutowired(true);
80
        }
81
82
        // Symfony 3.3 and higher: autowire definition so it receives the tags
83
        if (class_exists(ServiceLocatorTagPass::class)) {
84
            $def->setAutoconfigured(true);
85
        }
86
87
        $container->addCompilerPass(new ServiceRepositoryCompilerPass());
88
        $container->compile();
89
90
        $em = $container->get('doctrine.orm.default_entity_manager');
91
92
        // traditional custom class repository
93
        $customClassRepo = $em->getRepository(TestCustomClassRepoEntity::class);
94
        $this->assertInstanceOf(TestCustomClassRepoRepository::class, $customClassRepo);
95
        // a smoke test, trying some methods
96
        $this->assertSame(TestCustomClassRepoEntity::class, $customClassRepo->getClassName());
97
        $this->assertInstanceOf(QueryBuilder::class, $customClassRepo->createQueryBuilder('tc'));
98
99
        // generic EntityRepository
100
        $genericRepository = $em->getRepository(TestDefaultRepoEntity::class);
101
        $this->assertInstanceOf(EntityRepository::class, $genericRepository);
102
        $this->assertSame($genericRepository, $genericRepository = $em->getRepository(TestDefaultRepoEntity::class));
103
        // a smoke test, trying one of the methods
104
        $this->assertSame(TestDefaultRepoEntity::class, $genericRepository->getClassName());
105
106
        // Symfony 3.2 and lower should work normally in traditional cases (tested above)
107
        // the code below should *not* work (by design)
108
        if (!class_exists(ServiceLocatorTagPass::class)) {
109
            $message = '/Support for loading entities from the service container only works for Symfony 3\.3/';
110
            if (method_exists($this, 'expectException')) {
111
                $this->expectException(\RuntimeException::class);
112
                $this->expectExceptionMessageRegExp($message);
113
            } else {
114
                // PHPUnit 4 compat
115
                $this->setExpectedException(\RuntimeException::class);
0 ignored issues
show
Bug introduced by
The method setExpectedException() does not exist on Doctrine\Bundle\Doctrine...s\ServiceRepositoryTest. Did you maybe mean setExpectedExceptionFromAnnotation()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
116
                $this->setExpectedExceptionMessage($message);
0 ignored issues
show
Bug introduced by
The method setExpectedExceptionMessage() does not seem to exist on object<Doctrine\Bundle\D...\ServiceRepositoryTest>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
117
            }
118
        }
119
120
        // custom service repository
121
        $customServiceRepo = $em->getRepository(TestCustomServiceRepoEntity::class);
122
        $this->assertSame($customServiceRepo, $container->get(TestCustomServiceRepoRepository::class));
123
        // a smoke test, trying some methods
124
        $this->assertSame(TestCustomServiceRepoEntity::class, $customServiceRepo->getClassName());
125
        $this->assertInstanceOf(QueryBuilder::class, $customServiceRepo->createQueryBuilder('tc'));
126
    }
127
}
128