forked from laminas/laminas-di
/
InjectorGeneratorTest.php
129 lines (104 loc) · 4.19 KB
/
InjectorGeneratorTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
declare(strict_types=1);
namespace LaminasTest\Di\CodeGenerator;
use Laminas\Di\CodeGenerator\InjectorGenerator;
use Laminas\Di\Config;
use Laminas\Di\Definition\RuntimeDefinition;
use Laminas\Di\Resolver\DependencyResolver;
use LaminasTest\Di\TestAsset;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use function uniqid;
/**
* FactoryGenerator test case.
*/
class InjectorGeneratorTest extends TestCase
{
use GeneratorTestTrait;
private const DEFAULT_NAMESPACE = 'LaminasTest\Di\Generated';
public function testGenerateCreatesFiles(): void
{
$config = new Config();
$resolver = new DependencyResolver(new RuntimeDefinition(), $config);
$generator = new InjectorGenerator($config, $resolver, self::DEFAULT_NAMESPACE);
$generator->setOutputDirectory($this->dir);
$generator->generate([
TestAsset\RequiresA::class,
]);
$this->assertFileExists($this->dir . '/Factory/LaminasTest/Di/TestAsset/RequiresAFactory.php');
$this->assertFileExists($this->dir . '/GeneratedInjector.php');
$this->assertFileExists($this->dir . '/factories.php');
$this->assertFileExists($this->dir . '/autoload.php');
}
public function testGeneratedInjectorClassCode(): void
{
// The namespace must be unique, Since we will attempt to load the
// generated class
$namespace = self::DEFAULT_NAMESPACE;
$config = new Config();
$resolver = new DependencyResolver(new RuntimeDefinition(), $config);
$generator = new InjectorGenerator($config, $resolver, $namespace);
$generator->setOutputDirectory($this->dir);
$generator->generate([]);
self::assertFileEquals(
__DIR__ . '/../_files/expected-codegen-results/injector-class.php',
$this->dir . '/GeneratedInjector.php'
);
}
public function testGeneratedFactoryListCode(): void
{
// The namespace must be unique, Since we will attempt to load the
// generated class
$namespace = self::DEFAULT_NAMESPACE;
$config = new Config();
$resolver = new DependencyResolver(new RuntimeDefinition(), $config);
$generator = new InjectorGenerator($config, $resolver, $namespace);
$generator->setOutputDirectory($this->dir);
$generator->generate([
TestAsset\A::class,
TestAsset\B::class,
]);
self::assertFileEquals(
__DIR__ . '/../_files/expected-codegen-results/factories-file.php',
$this->dir . '/factories.php'
);
}
public function testSetCustomNamespace(): void
{
$expected = self::DEFAULT_NAMESPACE . uniqid();
$config = new Config();
$resolver = new DependencyResolver(new RuntimeDefinition(), $config);
$generator = new InjectorGenerator($config, $resolver, $expected);
$this->assertEquals($expected, $generator->getNamespace());
}
public function testGeneratorLogsDebugForEachClass(): void
{
$config = new Config();
$resolver = new DependencyResolver(new RuntimeDefinition(), $config);
$logger = $this->createMock(LoggerInterface::class);
$generator = new InjectorGenerator($config, $resolver, null, $logger);
$generator->setOutputDirectory($this->dir);
$logger
->expects(self::atLeastOnce())
->method('debug')
->with(self::stringContains(TestAsset\B::class));
$generator->generate([
TestAsset\B::class,
]);
}
public function testGeneratorLogsErrorWhenFactoryGenerationFailed(): void
{
$config = new Config();
$resolver = new DependencyResolver(new RuntimeDefinition(), $config);
$logger = $this->createMock(LoggerInterface::class);
$generator = new InjectorGenerator($config, $resolver, null, $logger);
$generator->setOutputDirectory($this->dir);
$logger
->expects(self::atLeastOnce())
->method('error')
->with(self::stringContains('Bad.And.Undefined.ClassName'));
$generator->generate([
'Bad.And.Undefined.ClassName',
]);
}
}