Skip to content

Commit 37bcfd7

Browse files
committed
tests: add test permutation with multiple migration configuration files
1 parent 50350cb commit 37bcfd7

File tree

8 files changed

+93
-31
lines changed

8 files changed

+93
-31
lines changed

.github/workflows/ci.yml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,24 @@ jobs:
115115
database: [ mysql, pgsql, sqlite, mysql|mongo ]
116116
use-dama: [ 0, 1 ]
117117
reset-database-mode: [ schema, migrate ]
118-
migration-configuration-file: ['no']
118+
migration-configuration-file: ['[]']
119119
deps: [ highest, lowest ]
120120
include:
121-
- { database: mongo, migration-configuration-file: 'no', use-dama: 0, reset-database-mode: schema }
122-
- { database: pgsql, migration-configuration-file: 'migration-configuration', use-dama: 0, reset-database-mode: migration }
123-
- { database: pgsql, migration-configuration-file: 'migration-configuration-transactional', use-dama: 0, reset-database-mode: migration }
121+
- { database: mongo, migration-configuration-file: '[]', use-dama: 0, reset-database-mode: schema }
122+
- { database: pgsql, migration-configuration-file: '["tests/Fixture/ResetDatabase/migration-configs/migration-configuration.php"]', use-dama: 0, reset-database-mode: migrate }
123+
- { database: pgsql, migration-configuration-file: '["tests/Fixture/ResetDatabase/migration-configs/migration-configuration-transactional.php"]', use-dama: 0, reset-database-mode: migrate }
124+
-
125+
database: pgsql
126+
use-dama: 0
127+
reset-database-mode: migrate
128+
migration-configuration-file: '["tests/Fixture/ResetDatabase/migration-configs/migration-configuration-transactional.php", "tests/Fixture/ResetDatabase/migration-configs/migration-dummy.php"]'
129+
deps: highest
124130
env:
125131
DATABASE_URL: ${{ contains(matrix.database, 'mysql') && 'mysql://root:root@localhost:3306/foundry?serverVersion=5.7.42' || contains(matrix.database, 'pgsql') && 'postgresql://root:root@localhost:5432/foundry?serverVersion=15' || 'sqlite:///%kernel.project_dir%/var/data.db' }}
126132
MONGO_URL: ${{ contains(matrix.database, 'mongo') && 'mongodb://127.0.0.1:27017/dbName?compressors=disabled&gssapiServiceName=mongodb' || '' }}
127133
USE_DAMA_DOCTRINE_TEST_BUNDLE: ${{ matrix.use-dama == 1 && 1 || 0 }}
128-
DATABASE_RESET_MODE: ${{ matrix.reset-database-mode == 1 && 1 || 0 }}
129-
MIGRATION_CONFIGURATION_FILE: ${{ matrix.migration-configuration-file == 'no' && '' || format('tests/Fixture/MigrationTests/configs/{0}.php', matrix.migration-configuration-file) }}
134+
DATABASE_RESET_MODE: ${{ matrix.reset-database-mode }}
135+
MIGRATION_CONFIGURATION_FILES: ${{ matrix.migration-configuration-file }}
130136
PHPUNIT_VERSION: 11
131137
services:
132138
postgres:
@@ -163,7 +169,7 @@ jobs:
163169
dependency-versions: ${{ matrix.deps }}
164170
composer-options: --prefer-dist
165171
env:
166-
SYMFONY_REQUIRE: 7.1.*
172+
SYMFONY_REQUIRE: 7.2.*
167173

168174
- name: Set up MySQL
169175
if: contains(matrix.database, 'mysql')

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ PHPUNIT_VERSION="11" # possible values: 9, 10, 11, 11.4
7777

7878
# test reset database with migrations,
7979
# only relevant for "reset-database" testsuite
80-
MIGRATION_CONFIGURATION_FILE="tests/Fixture/MigrationTests/configs/migration-configuration.php"
80+
MIGRATION_CONFIGURATION_FILES="[\"tests/Fixture/ResetDatabase/migration-configs/migration-configuration.php\"]"
8181

8282
# run test suite with postgreSQL
8383
$ vendor/bin/phpunit

tests/Fixture/FoundryTestKernel.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ public static function hasMongo(): bool
6060
return (bool) \getenv('MONGO_URL');
6161
}
6262

63-
public static function usesMigrations(): bool
64-
{
65-
return 'migrate' === \getenv('DATABASE_RESET_MODE');
66-
}
67-
6863
public static function usesDamaDoctrineTestBundle(): bool
6964
{
7065
return (bool) \getenv('USE_DAMA_DOCTRINE_TEST_BUNDLE');
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Zenstruck\Foundry\Tests\Fixture\ResetDatabase;
4+
5+
use Doctrine\DBAL\Schema\Schema;
6+
use Doctrine\Migrations\AbstractMigration;
7+
8+
final class DummyMigration extends AbstractMigration
9+
{
10+
public function getDescription(): string
11+
{
12+
return 'Dummy migration to test migration reset with multiple configuration files.';
13+
}
14+
15+
public function up(Schema $schema): void
16+
{
17+
$this->addSql('INSERT INTO address (city) VALUES (\'city\')');
18+
}
19+
}

tests/Fixture/ResetDatabase/ResetDatabaseTestKernel.php

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function registerBundles(): iterable
2828
{
2929
yield from parent::registerBundles();
3030

31-
if (FoundryTestKernel::usesMigrations()) {
31+
if (self::usesMigrations()) {
3232
yield new DoctrineMigrationsBundle();
3333
}
3434
}
@@ -43,18 +43,18 @@ protected function configureContainer(ContainerBuilder $c, LoaderInterface $load
4343
GlobalInvokableService::class,
4444
],
4545
'orm' => [
46-
'reset' => FoundryTestKernel::usesMigrations()
46+
'reset' => self::usesMigrations()
4747
? [
4848
'mode' => ResetDatabaseMode::MIGRATE,
4949
'migrations' => [
50-
'configurations' => ($configFile = \getenv('MIGRATION_CONFIGURATION_FILE')) ? [$configFile] : [],
50+
'configurations' => ($configFile = self::migrationFiles()) ? $configFile : [],
5151
],
5252
]
5353
: ['mode' => ResetDatabaseMode::SCHEMA],
5454
],
5555
]);
5656

57-
if (FoundryTestKernel::usesMigrations() && !\getenv('MIGRATION_CONFIGURATION_FILE')) {
57+
if (self::usesMigrations() && self::migrationFiles() === []) {
5858
// if no configuration file was given in Foundry's config, let's use the main one as default.
5959
$c->loadFromExtension(
6060
'doctrine_migrations',
@@ -72,4 +72,29 @@ protected function configureContainer(ContainerBuilder $c, LoaderInterface $load
7272
$c->register(MongoResetterDecorator::class)->setAutowired(true)->setAutoconfigured(true);
7373
}
7474
}
75+
76+
public static function usesMigrations(): bool
77+
{
78+
return 'migrate' === \getenv('DATABASE_RESET_MODE');
79+
}
80+
81+
/**
82+
* @return list<string>
83+
*/
84+
public static function migrationFiles(): array
85+
{
86+
$files = json_decode(\getenv('MIGRATION_CONFIGURATION_FILES')?: '[]', flags: JSON_THROW_ON_ERROR);
87+
88+
if (!\is_array($files)) {
89+
throw new \InvalidArgumentException('MIGRATION_CONFIGURATION_FILES must be a JSON array.');
90+
}
91+
92+
foreach ($files as $file) {
93+
if (!\file_exists($file)) {
94+
throw new \InvalidArgumentException(\sprintf('Migration configuration file "%s" does not exist.', $file));
95+
}
96+
}
97+
98+
return $files; // @phpstan-ignore return.type
99+
}
75100
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the zenstruck/foundry package.
5+
*
6+
* (c) Kevin Bond <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
return [
13+
'migrations_paths' => [
14+
'Zenstruck\\Foundry\\Tests\\Fixture\\ResetDatabase' => \dirname(__DIR__),
15+
],
16+
'transactional' => false,
17+
];

tests/Integration/ResetDatabase/ResetDatabaseTest.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
use Zenstruck\Foundry\Tests\Fixture\ResetDatabase\MongoResetterDecorator;
2727
use Zenstruck\Foundry\Tests\Fixture\ResetDatabase\OrmResetterDecorator;
2828

29+
use Zenstruck\Foundry\Tests\Fixture\ResetDatabase\ResetDatabaseTestKernel;
30+
2931
use function Zenstruck\Foundry\Persistence\persist;
3032
use function Zenstruck\Foundry\Persistence\repository;
3133

@@ -48,15 +50,7 @@ public function it_generates_valid_schema(): void
4850
$output = new BufferedOutput()
4951
);
5052

51-
if (FoundryTestKernel::usesMigrations()) {
52-
// The command actually fails, because of a bug in doctrine ORM 3!
53-
// https://github.com/doctrine/migrations/issues/1406
54-
self::assertSame(2, $exit, \sprintf('Schema is not valid: %s', $commandOutput = $output->fetch()));
55-
self::assertStringContainsString('1 schema diff(s) detected', $commandOutput);
56-
self::assertStringContainsString('DROP TABLE doctrine_migration_versions', $commandOutput);
57-
} else {
58-
self::assertSame(0, $exit, \sprintf('Schema is not valid: %s', $output->fetch()));
59-
}
53+
self::assertSame(0, $exit, \sprintf('Schema is not valid: %s', $output->fetch()));
6054
}
6155

6256
/**

tests/bootstrap-reset-database.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
(new Dotenv())->usePutenv()->loadEnv(__DIR__.'/../.env');
2727

28-
if (FoundryTestKernel::usesMigrations()) {
28+
if (ResetDatabaseTestKernel::usesMigrations()) {
2929
$fs->mkdir(__DIR__.'/../var/cache/Migrations');
3030

3131
$kernel = new ResetDatabaseTestKernel('test', true);
@@ -36,11 +36,17 @@
3636
runCommand($application, 'doctrine:database:drop --if-exists --force', canFail: true);
3737
runCommand($application, 'doctrine:database:create', canFail: true);
3838

39-
$configuration = '';
40-
if (\getenv('MIGRATION_CONFIGURATION_FILE')) {
41-
$configuration = '--configuration '.\getcwd().'/'.\getenv('MIGRATION_CONFIGURATION_FILE');
39+
$configurationFiles = ResetDatabaseTestKernel::migrationFiles();
40+
41+
if (!$configurationFiles) {
42+
runCommand($application, "doctrine:migrations:diff");
43+
} else {
44+
foreach ($configurationFiles as $configurationFile) {
45+
$configuration = '--configuration '.\getcwd()."/{$configurationFile}";
46+
runCommand($application, "doctrine:migrations:diff {$configuration}");
47+
}
4248
}
43-
runCommand($application, "doctrine:migrations:diff {$configuration}");
49+
4450
runCommand($application, 'doctrine:database:drop --force', canFail: true);
4551

4652
$kernel->shutdown();

0 commit comments

Comments
 (0)