2
0

ContainerTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. namespace Test\Michel\DependencyInjection;
  3. use Michel\DependencyInjection\Container;
  4. use Michel\DependencyInjection\Exception\NotFoundException;
  5. use Psr\Container\ContainerInterface;
  6. use Test\Michel\DependencyInjection\TestClass\Database;
  7. use Test\Michel\DependencyInjection\TestClass\LazyService;
  8. use Michel\UniTester\TestCase;
  9. /**
  10. * Class AutoWireTest
  11. * @package Test\Michel\DependencyInjection
  12. */
  13. class ContainerTest extends TestCase
  14. {
  15. protected function setUp(): void
  16. {
  17. // TODO: Implement setUp() method.
  18. }
  19. protected function tearDown(): void
  20. {
  21. // TODO: Implement tearDown() method.
  22. }
  23. protected function execute(): void
  24. {
  25. $this->testDefinition();
  26. $this->testNotFoundClass();
  27. $this->testNotFoundParameter();
  28. $this->testVariableExtractionAndReplacement();
  29. $this->testVariableReplacementWithMissingValues();
  30. $this->testNestedVariableReplacement();
  31. $this->testVariableReplacementWithSpecialCharacters();
  32. $this->testNoVariableToReplace();
  33. }
  34. public function testDefinition()
  35. {
  36. $container = new Container([
  37. 'database.host' => '127.0.0.1',
  38. 'database.port' => null,
  39. Database::class => static function (ContainerInterface $container) {
  40. return new Database();
  41. },
  42. LazyService::class => static function (ContainerInterface $container) {
  43. return new LazyService($container->get(Database::class));
  44. }
  45. ]);
  46. $database = $container->get(Database::class);
  47. /**
  48. * @var LazyService $service
  49. */
  50. $service = $container->get(LazyService::class);
  51. $this->assertEquals('127.0.0.1', $container->get('database.host'));
  52. $this->assertEquals(null, $container->get('database.port'));
  53. $this->assertInstanceOf(Database::class, $database);
  54. $this->assertInstanceOf(LazyService::class, $service);
  55. $this->assertStrictEquals($database, $service->getDatabase());
  56. $this->assertTrue($container->has(LazyService::class));
  57. $this->assertFalse($container->has('database.user'));
  58. }
  59. public function testNotFoundClass()
  60. {
  61. $container = new Container([]);
  62. $this->expectException(NotFoundException::class, function () use ($container) {
  63. $container->get(LazyService::class);
  64. });
  65. }
  66. public function testNotFoundParameter()
  67. {
  68. $container = new Container([]);
  69. $this->expectException(NotFoundException::class, function () use ($container) {
  70. $container->get('database.user');
  71. });
  72. }
  73. public function testVariableExtractionAndReplacement()
  74. {
  75. $container = new Container([
  76. 'database.host' => '127.0.0.1',
  77. 'database.port' => '3306',
  78. 'database.user' => 'root',
  79. 'database.dsn' => 'mysql://#{database.user}@#{database.host}:#{database.port}/mydb'
  80. ]);
  81. $this->assertEquals('mysql://root@127.0.0.1:3306/mydb', $container->get('database.dsn'));
  82. }
  83. public function testVariableReplacementWithMissingValues()
  84. {
  85. $container = new Container([
  86. 'database.host' => '127.0.0.1',
  87. 'database.dsn' => 'mysql://#{database.user}@#{database.host}:#{database.port}/mydb'
  88. ]);
  89. $this->expectException(NotFoundException::class, function () use ($container) {
  90. $container->get('database.dsn');
  91. });
  92. }
  93. public function testNestedVariableReplacement()
  94. {
  95. $container = new Container([
  96. 'base.url' => '127.0.0.1',
  97. 'api.url' => 'http://#{base.url}/api',
  98. 'api.endpoint' => '#{api.url}/v1/resource'
  99. ]);
  100. $this->assertEquals('http://127.0.0.1/api/v1/resource', $container->get('api.endpoint'));
  101. }
  102. public function testVariableReplacementWithSpecialCharacters()
  103. {
  104. $container = new Container([
  105. 'user.name' => 'admin@domain.com',
  106. 'database.dsn' => 'mysql://#{user.name}:pass@localhost/db'
  107. ]);
  108. $this->assertEquals('mysql://admin@domain.com:pass@localhost/db', $container->get('database.dsn'));
  109. }
  110. public function testNoVariableToReplace()
  111. {
  112. $container = new Container([
  113. 'app.name' => 'MySuperApp'
  114. ]);
  115. // Aucune substitution ne doit être faite
  116. $this->assertEquals('MySuperApp', $container->get('app.name'));
  117. }
  118. }