Skip to content

Commit 934382d

Browse files
committed
Small fixes
1 parent 4d23e94 commit 934382d

5 files changed

Lines changed: 66 additions & 12 deletions

File tree

packages/database/src/Connection/ConnectionInitializer.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ final class ConnectionInitializer implements Initializer
1616
#[Singleton]
1717
public function initialize(Container $container): Connection
1818
{
19-
$databaseConfig = $container->get(DatabaseConfig::class);
19+
$config = $container->get(DatabaseConfig::class);
2020

21-
$connection = self::$connection;
21+
$connection = $config->usePersistentConnection
22+
? self::$connection
23+
: null;
2224

23-
if (! $connection instanceof Connection) {
24-
$connection = new PDOConnection($databaseConfig);
25+
if (!$connection instanceof Connection) {
26+
$connection = new PDOConnection($config);
2527
$connection->connect();
2628
self::$connection = $connection;
27-
}
28-
29-
if ($connection instanceof PDOConnection && $connection->ping() === false) {
29+
} elseif ($connection instanceof PDOConnection && $connection->ping() === false) {
3030
$connection->reconnect();
3131
}
3232

packages/database/src/Connection/ConnectionReset.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public function __construct(
1313

1414
public function reset(): void
1515
{
16-
$this->container->unregister(Connection::class);
16+
$this->container->unregister(Connection::class, tagged: true);
1717
}
1818
}

packages/database/src/DatabaseInitializer.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@ public function initialize(ClassReflector $class, null|string|UnitEnum $tag, Con
4040
$connection = new PDOConnection($config);
4141
$connection->connect();
4242
self::$connections[$connectionKey] = $connection;
43-
}
44-
45-
if ($connection instanceof PDOConnection && $connection->ping() === false) {
43+
} elseif ($connection instanceof PDOConnection && $connection->ping() === false) {
4644
$connection->reconnect();
4745
}
4846

@@ -66,6 +64,7 @@ private function getConnectionKey(DatabaseConfig $config): string
6664
$config->dsn,
6765
$config->username,
6866
$config->options,
67+
$config->password,
6968
]));
7069
}
7170
}

packages/database/src/DatabaseReset.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public function __construct(
1313

1414
public function reset(): void
1515
{
16-
$this->container->unregister(Database::class);
16+
$this->container->unregister(Database::class, tagged: true);
1717
}
1818
}

tests/Integration/Database/DatabaseInitializerTest.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
namespace Tests\Tempest\Integration\Database;
44

55
use PHPUnit\Framework\Attributes\Test;
6+
use ReflectionMethod;
7+
use Tempest\Database\Config\MysqlConfig;
68
use Tempest\Database\Config\SQLiteConfig;
79
use Tempest\Database\Connection\Connection;
10+
use Tempest\Database\Connection\PDOConnection;
811
use Tempest\Database\Database;
912
use Tempest\Database\DatabaseInitializer;
1013
use Tempest\Database\GenericDatabase;
@@ -111,6 +114,58 @@ public function test_it_does_not_reuse_a_persistent_connection_for_the_same_tag_
111114
$this->assertSame($second->connection, $this->container->get(Connection::class, 'main'));
112115
}
113116

117+
#[Test]
118+
public function test_it_does_not_reuse_a_persistent_connection_when_only_the_password_differs(): void
119+
{
120+
$initializer = new DatabaseInitializer();
121+
$method = new ReflectionMethod($initializer, 'getConnectionKey');
122+
123+
$first = new MysqlConfig(
124+
host: 'localhost',
125+
username: 'tempest',
126+
password: 'first-password', // @mago-expect lint:no-literal-password
127+
database: 'tempest',
128+
persistent: true,
129+
tag: 'main',
130+
);
131+
132+
$second = new MysqlConfig(
133+
host: 'localhost',
134+
username: 'tempest',
135+
password: 'second-password', // @mago-expect lint:no-literal-password
136+
database: 'tempest',
137+
persistent: true,
138+
tag: 'main',
139+
);
140+
141+
$this->assertNotSame(
142+
$method->invoke($initializer, $first),
143+
$method->invoke($initializer, $second),
144+
);
145+
}
146+
147+
#[Test]
148+
public function test_it_reconnects_a_stale_persistent_connection_when_reusing_it(): void
149+
{
150+
$this->configureSqliteDatabase('main', 'stale-persistent-main.sqlite');
151+
152+
$first = $this->container->get(Database::class, 'main');
153+
154+
$this->assertInstanceOf(GenericDatabase::class, $first);
155+
$this->assertInstanceOf(PDOConnection::class, $first->connection);
156+
157+
$first->connection->close();
158+
159+
$this->container->unregister(Database::class, tagged: true);
160+
$this->container->unregister(Connection::class, tagged: true);
161+
162+
$second = $this->container->get(Database::class, 'main');
163+
164+
$this->assertInstanceOf(GenericDatabase::class, $second);
165+
$this->assertSame($first->connection, $second->connection);
166+
$this->assertTrue($second->connection->ping());
167+
}
168+
114169
private function configureSqliteDatabase(string $tag, string $filename, bool $persistent = true): void
115170
{
116171
$path = $this->databasePath($filename);

0 commit comments

Comments
 (0)