packages/container/tests/Unit/MySqlConfigurationTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit;
6
7use Container\MySqlConfiguration;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use Testcontainers\Containers\ContainerInstance;
11use Testcontainers\Containers\GenericContainer\GenericContainer;
12use Testcontainers\Containers\Types\Mount;
13use Testcontainers\Containers\WaitStrategy\PDO\MySQLDSN;
14use Testcontainers\Containers\WaitStrategy\PDO\PDOConnectWaitStrategy;
15use Testcontainers\Containers\WaitStrategy\WaitStrategy;
16
17#[CoversClass(MySqlConfiguration::class)]
18final class MySqlConfigurationTest extends TestCase
19{
20 /**
21 * @throws \Testcontainers\Exceptions\InvalidFormatException
22 */
23 public function testApplyConfiguresTheDatabaseStartupContract(): void
24 {
25 $container = new class ('database:version') extends GenericContainer {
26 /**
27 * @return array{ports: array<int>, env: array<string, string>, mounts: array<Mount>, timeout: int|null, retries: int, remove: bool, wait: WaitStrategy|null}
28 * @throws \Testcontainers\Exceptions\InvalidFormatException
29 */
30 public function launchOptions(ContainerInstance $instance): array
31 {
32 return [
33 'ports' => $this->exposedPorts(),
34 'env' => $this->env(),
35 'mounts' => $this->mounts(),
36 'timeout' => $this->startupTimeout(),
37 'retries' => $this->startupConflictRetryAttempts(),
38 'remove' => $this->autoRemoveOnExit(),
39 'wait' => $this->waitStrategy($instance),
40 ];
41 }
42 };
43 (new MySqlConfiguration())->apply($container);
44 $options = $container->launchOptions(self::createStub(ContainerInstance::class));
45 self::assertTrue($container->reuseMode()->isReuse());
46 self::assertSame([3306], $options['ports']);
47 self::assertSame(['MYSQL_ROOT_PASSWORD' => 'root', 'MYSQL_ROOT_HOST' => '%', 'MYSQL_DATABASE' => 'test', 'MYSQL_INITDB_SKIP_TZINFO' => '1'], $options['env']);
48 self::assertEquals([Mount::fromString('type=tmpfs,destination=/var/lib/mysql')], $options['mounts']);
49 self::assertSame(300, $options['timeout']);
50 self::assertSame(10, $options['retries']);
51 self::assertTrue($options['remove']);
52 self::assertEquals((new PDOConnectWaitStrategy())->withDsn((new MySQLDSN())->withDbname('test')->withCharset('utf8mb4'))->withUsername('root')->withPassword('root')->withTimeoutSeconds(120)->withRetryInterval(250000), $options['wait']);
53 }
54}
55