diff --git a/packages/database-mysql/module.php b/packages/database-mysql/module.php index c32f98d5..6b2e9ea1 100644 --- a/packages/database-mysql/module.php +++ b/packages/database-mysql/module.php @@ -10,7 +10,9 @@ use Marko\Database\MySql\Connection\MySqlConnection; use Marko\Database\MySql\Introspection\MySqlIntrospector; use Marko\Database\MySql\Query\MySqlQueryBuilder; +use Marko\Database\MySql\Query\MySqlQueryBuilderFactory; use Marko\Database\MySql\Sql\MySqlGenerator; +use Marko\Database\Query\QueryBuilderFactoryInterface; use Marko\Database\Query\QueryBuilderInterface; // Marko-specific configuration for this module. @@ -29,5 +31,6 @@ }, SqlGeneratorInterface::class => MySqlGenerator::class, QueryBuilderInterface::class => MySqlQueryBuilder::class, + QueryBuilderFactoryInterface::class => MySqlQueryBuilderFactory::class, ], ]; diff --git a/packages/database-mysql/src/Query/MySqlQueryBuilderFactory.php b/packages/database-mysql/src/Query/MySqlQueryBuilderFactory.php new file mode 100644 index 00000000..c0853253 --- /dev/null +++ b/packages/database-mysql/src/Query/MySqlQueryBuilderFactory.php @@ -0,0 +1,23 @@ +connection, + ); + } +} diff --git a/packages/database-mysql/tests/Module/ModuleBindingsTest.php b/packages/database-mysql/tests/Module/ModuleBindingsTest.php index 84c09bda..0191e34a 100644 --- a/packages/database-mysql/tests/Module/ModuleBindingsTest.php +++ b/packages/database-mysql/tests/Module/ModuleBindingsTest.php @@ -12,7 +12,9 @@ use Marko\Database\Exceptions\ConfigurationException; use Marko\Database\Introspection\IntrospectorInterface; use Marko\Database\MySql\Connection\MySqlConnection; +use Marko\Database\MySql\Query\MySqlQueryBuilderFactory; use Marko\Database\MySql\Sql\MySqlGenerator; +use Marko\Database\Query\QueryBuilderFactoryInterface; describe('MySQL module.php bindings', function (): void { it('binds ConnectionInterface to MySqlConnection class', function (): void { @@ -42,6 +44,14 @@ ->and($moduleConfig['bindings'][IntrospectorInterface::class])->toBeInstanceOf(Closure::class); }); + it('binds QueryBuilderFactoryInterface to MySqlQueryBuilderFactory class', function (): void { + $modulePath = dirname(__DIR__, 2); + $moduleConfig = require $modulePath . '/module.php'; + + expect($moduleConfig['bindings'])->toHaveKey(QueryBuilderFactoryInterface::class) + ->and($moduleConfig['bindings'][QueryBuilderFactoryInterface::class])->toBe(MySqlQueryBuilderFactory::class); + }); + it('throws ConfigurationException when config file missing', function (): void { // Create temp directory WITHOUT config $tempDir = sys_get_temp_dir() . '/marko_mysql_noconfig_' . uniqid(); diff --git a/packages/database-mysql/tests/Query/MySqlQueryBuilderFactoryTest.php b/packages/database-mysql/tests/Query/MySqlQueryBuilderFactoryTest.php new file mode 100644 index 00000000..498ec94b --- /dev/null +++ b/packages/database-mysql/tests/Query/MySqlQueryBuilderFactoryTest.php @@ -0,0 +1,50 @@ +implementsInterface(QueryBuilderFactoryInterface::class))->toBeTrue(); + }); + + it('accepts ConnectionInterface via constructor', function (): void { + $reflection = new ReflectionClass(MySqlQueryBuilderFactory::class); + $constructor = $reflection->getConstructor(); + $params = $constructor->getParameters(); + + expect($params)->toHaveCount(1) + ->and($params[0]->getName())->toBe('connection') + ->and($params[0]->getType()->getName())->toBe(ConnectionInterface::class); + }); + + it('creates MySqlQueryBuilder instances', function (): void { + $connection = $this->createMock(ConnectionInterface::class); + $factory = new MySqlQueryBuilderFactory($connection); + + $builder = $factory->create(); + + expect($builder)->toBeInstanceOf(QueryBuilderInterface::class) + ->and($builder)->toBeInstanceOf(MySqlQueryBuilder::class); + }); + + it('creates a new instance on each call', function (): void { + $connection = $this->createMock(ConnectionInterface::class); + $factory = new MySqlQueryBuilderFactory($connection); + + $builder1 = $factory->create(); + $builder2 = $factory->create(); + + expect($builder1)->not->toBe($builder2); + }); +});