Skip to content

Commit ecb1086

Browse files
committed
wip
1 parent e4a97bd commit ecb1086

File tree

6 files changed

+79
-42
lines changed

6 files changed

+79
-42
lines changed

packages/container/src/GenericContainer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public function __construct(
3030
private ArrayIterator $singletons = new ArrayIterator(),
3131

3232
/** @var ArrayIterator<array-key, class-string> $initializers */
33-
private ArrayIterator $initializers = new ArrayIterator(),
33+
public ArrayIterator $initializers = new ArrayIterator(),
3434

3535
/** @var ArrayIterator<array-key, class-string> $dynamicInitializers */
3636
private ArrayIterator $dynamicInitializers = new ArrayIterator(),

packages/database/src/Connection/CachedConnectionInitializer.php

Lines changed: 0 additions & 35 deletions
This file was deleted.

packages/database/src/Connection/PDOConnection.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use PDOStatement;
99
use Tempest\Database\Config\DatabaseConfig;
1010
use Tempest\Database\Exceptions\ConnectionClosed;
11+
use Throwable;
1112

1213
final class PDOConnection implements Connection
1314
{
@@ -68,6 +69,24 @@ public function prepare(string $sql): PDOStatement
6869
return $statement;
6970
}
7071

72+
public function ping(): bool
73+
{
74+
try {
75+
$statement = $this->prepare('SELECT 1');
76+
$statement->execute();
77+
78+
return true;
79+
} catch (Throwable) {
80+
return false;
81+
}
82+
}
83+
84+
public function reconnect(): void
85+
{
86+
$this->close();
87+
$this->connect();
88+
}
89+
7190
public function close(): void
7291
{
7392
$this->pdo = null;

src/Tempest/Framework/Testing/IntegrationTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Tempest\Clock\MockClock;
1010
use Tempest\Console\Testing\ConsoleTester;
1111
use Tempest\Container\Container;
12+
use Tempest\Container\GenericContainer;
1213
use Tempest\Core\AppConfig;
1314
use Tempest\Core\FrameworkKernel;
1415
use Tempest\Core\Kernel;
@@ -35,7 +36,7 @@ abstract class IntegrationTest extends TestCase
3536

3637
protected Kernel $kernel;
3738

38-
protected Container $container;
39+
protected Container|GenericContainer $container;
3940

4041
protected ConsoleTester $console;
4142

tests/Integration/FrameworkIntegrationTestCase.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@
1111
use Tempest\Console\Output\StdoutOutputBuffer;
1212
use Tempest\Console\OutputBuffer;
1313
use Tempest\Console\Testing\ConsoleTester;
14-
use Tempest\Core\AppConfig;
1514
use Tempest\Core\Application;
1615
use Tempest\Core\ShellExecutor;
1716
use Tempest\Core\ShellExecutors\NullShellExecutor;
18-
use Tempest\Database\Connection\CachedConnectionInitializer;
19-
use Tempest\Database\Connection\Connection;
17+
use Tempest\Database\Connection\ConnectionInitializer;
18+
use Tempest\Database\DatabaseInitializer;
2019
use Tempest\Database\Migrations\MigrationManager;
2120
use Tempest\Discovery\DiscoveryLocation;
2221
use Tempest\Framework\Testing\IntegrationTest;
@@ -57,7 +56,10 @@ protected function setUp(): void
5756
$this->console = new ConsoleTester($this->container);
5857

5958
// Database
60-
$this->container->addInitializer(CachedConnectionInitializer::class);
59+
$this->container
60+
->removeInitializer(DatabaseInitializer::class)
61+
->addInitializer(TestingDatabaseInitializer::class);
62+
6163
$databaseConfigPath = __DIR__ . '/../Fixtures/Config/database.config.php';
6264

6365
if (! file_exists($databaseConfigPath)) {
@@ -71,7 +73,7 @@ protected function setUp(): void
7173

7274
protected function tearDown(): void
7375
{
74-
$this->container->get(Connection::class)->close();
76+
// $this->container->get(Connection::class)->close();
7577
}
7678

7779
protected function actAsConsoleApplication(string $command = ''): Application
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Tempest\Integration;
6+
7+
use Tempest\Container\Container;
8+
use Tempest\Container\DynamicInitializer;
9+
use Tempest\Container\Singleton;
10+
use Tempest\Database\Config\DatabaseConfig;
11+
use Tempest\Database\Config\DatabaseDialect;
12+
use Tempest\Database\Connection\Connection;
13+
use Tempest\Database\Connection\PDOConnection;
14+
use Tempest\Database\Database;
15+
use Tempest\Database\GenericDatabase;
16+
use Tempest\Database\Transactions\GenericTransactionManager;
17+
use Tempest\Reflection\ClassReflector;
18+
19+
final class TestingDatabaseInitializer implements DynamicInitializer
20+
{
21+
private static ?PDOConnection $connection = null;
22+
23+
public function canInitialize(ClassReflector $class, ?string $tag): bool
24+
{
25+
return $class->getType()->matches(Database::class);
26+
}
27+
28+
#[Singleton]
29+
public function initialize(ClassReflector $class, ?string $tag, Container $container): Database
30+
{
31+
if (self::$connection === null) {
32+
$config = $container->get(DatabaseConfig::class, $tag);
33+
$connection = new PDOConnection($config);
34+
$connection->connect();
35+
36+
self::$connection = $connection;
37+
}
38+
39+
if (self::$connection->ping() === false)
40+
{
41+
self::$connection->reconnect();
42+
}
43+
44+
return new GenericDatabase(
45+
self::$connection,
46+
new GenericTransactionManager(self::$connection),
47+
$container->get(DatabaseDialect::class),
48+
);
49+
}
50+
}

0 commit comments

Comments
 (0)