/
MigrationsTest.php
96 lines (84 loc) · 2.43 KB
/
MigrationsTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
namespace App\Tests\Migrations;
use App\Tests\Util\DatabaseTestCase;
use Symfony\Component\Console\Input\ArrayInput;
class MigrationsTest extends DatabaseTestCase
{
public function setUp(): void
{
static::$client = static::createClient();
if ($this->isPersistentDatabase()) {
$this->dropDatabase();
$this->createDatabase();
}
}
public function testAllMigrationsUp()
{
$this->migrateDatabase('latest');
$this->validateDatabase();
}
/**
* @param string $version
*/
private function migrateDatabase(string $version)
{
$this->runCommand(new ArrayInput([
'command' => 'doctrine:migrations:migrate',
'version' => $version,
'--no-interaction' => true
]));
}
private function validateDatabase()
{
$this->runCommand(new ArrayInput([
'command' => 'doctrine:schema:validate'
]));
}
public function testAllMigrationsDown()
{
$this->createDatabaseSchema();
$this->validateDatabase();
$this->addAllMigrationVersions();
$this->migrateDatabase('first');
$this->assertEquals(
['migration_versions'],
$this->getEntityManager()->getConnection()->getSchemaManager()->listTableNames()
);
}
private function addAllMigrationVersions()
{
$this->runCommand(new ArrayInput([
'command' => 'doctrine:migrations:version',
'--add' => true,
'--all' => true,
'--no-interaction' => true
]));
}
/**
* @param string $version
* @dataProvider provideAvailableVersions
*/
public function testMigration(string $version)
{
$this->migrateDatabase($version);
static::$client = static::createClient();
$this->migrateDatabase('prev');
static::$client = static::createClient();
$this->migrateDatabase('next');
}
/**
* @return array
*/
public function provideAvailableVersions(): array
{
$files = glob(__DIR__ . '/../../src/Migrations/Version*.php');
$this->assertIsArray($files);
$this->assertGreaterThanOrEqual(3, $files);
asort($files);
$versions = [];
foreach ($files as $file) {
$versions[] = [preg_replace('/^.*Version(\d+)\.php$/', '$1', $file)];
}
return $versions;
}
}