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