Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/database-mysql/module.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -29,5 +31,6 @@
},
SqlGeneratorInterface::class => MySqlGenerator::class,
QueryBuilderInterface::class => MySqlQueryBuilder::class,
QueryBuilderFactoryInterface::class => MySqlQueryBuilderFactory::class,
],
];
23 changes: 23 additions & 0 deletions packages/database-mysql/src/Query/MySqlQueryBuilderFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace Marko\Database\MySql\Query;

use Marko\Database\Connection\ConnectionInterface;
use Marko\Database\Query\QueryBuilderFactoryInterface;
use Marko\Database\Query\QueryBuilderInterface;

class MySqlQueryBuilderFactory implements QueryBuilderFactoryInterface
{
public function __construct(
private readonly ConnectionInterface $connection,
) {}

public function create(): QueryBuilderInterface
{
return new MySqlQueryBuilder(
connection: $this->connection,
);
}
}
10 changes: 10 additions & 0 deletions packages/database-mysql/tests/Module/ModuleBindingsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

declare(strict_types=1);

namespace Marko\Database\MySql\Tests\Query;

use Marko\Database\Connection\ConnectionInterface;
use Marko\Database\MySql\Query\MySqlQueryBuilder;
use Marko\Database\MySql\Query\MySqlQueryBuilderFactory;
use Marko\Database\Query\QueryBuilderFactoryInterface;
use Marko\Database\Query\QueryBuilderInterface;
use ReflectionClass;

describe('MySqlQueryBuilderFactory', function (): void {
it('implements QueryBuilderFactoryInterface', function (): void {
$reflection = new ReflectionClass(MySqlQueryBuilderFactory::class);

expect($reflection->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);
});
});