diff --git a/src/Illuminate/Testing/Concerns/TestDatabases.php b/src/Illuminate/Testing/Concerns/TestDatabases.php index 6dfe56105f1b..7f81c604bcdc 100644 --- a/src/Illuminate/Testing/Concerns/TestDatabases.php +++ b/src/Illuminate/Testing/Concerns/TestDatabases.php @@ -47,13 +47,17 @@ protected function bootTestDatabase() if (Arr::hasAny($uses, $databaseTraits)) { $this->whenNotUsingInMemoryDatabase(function ($database) use ($uses) { - $testDatabase = $this->ensureTestDatabaseExists($database); + [$testDatabase, $created] = $this->ensureTestDatabaseExists($database); $this->switchToDatabase($testDatabase); if (isset($uses[Testing\DatabaseTransactions::class])) { $this->ensureSchemaIsUpToDate(); } + + if ($created) { + ParallelTesting::callSetUpTestDatabaseCallbacks($testDatabase); + } }); } }); @@ -64,22 +68,26 @@ protected function bootTestDatabase() * * @param string $database * - * @return string + * @return array */ protected function ensureTestDatabaseExists($database) { - return tap($this->testDatabase($database), function ($testDatabase) use ($database) { - try { - $this->usingDatabase($testDatabase, function () { - Schema::hasTable('dummy'); - }); - } catch (QueryException $e) { - $this->usingDatabase($database, function () use ($testDatabase) { - Schema::dropDatabaseIfExists($testDatabase); - Schema::createDatabase($testDatabase); - }); - } - }); + $testDatabase = $this->testDatabase($database); + + try { + $this->usingDatabase($testDatabase, function () { + Schema::hasTable('dummy'); + }); + } catch (QueryException $e) { + $this->usingDatabase($database, function () use ($testDatabase) { + Schema::dropDatabaseIfExists($testDatabase); + Schema::createDatabase($testDatabase); + }); + + return [$testDatabase, true]; + } + + return [$testDatabase, false]; } /** diff --git a/src/Illuminate/Testing/ParallelTesting.php b/src/Illuminate/Testing/ParallelTesting.php index 842b809f822f..11ebcfa89ed6 100644 --- a/src/Illuminate/Testing/ParallelTesting.php +++ b/src/Illuminate/Testing/ParallelTesting.php @@ -42,6 +42,13 @@ class ParallelTesting */ protected $setUpTestCaseCallbacks = []; + /** + * All of the registered "setUp" test database callbacks. + * + * @var array + */ + protected $setUpTestDatabaseCallbacks = []; + /** * All of the registered "tearDown" process callbacks. * @@ -111,6 +118,17 @@ public function setUpTestCase($callback) $this->setUpTestCaseCallbacks[] = $callback; } + /** + * Register a "setUp" test database callback. + * + * @param callable $callback + * @return void + */ + public function setUpTestDatabase($callback) + { + $this->setUpTestDatabaseCallbacks[] = $callback; + } + /** * Register a "tearDown" process callback. * @@ -167,6 +185,24 @@ public function callSetUpTestCaseCallbacks($testCase) }); } + /** + * Call all of the "setUp" test database callbacks. + * + * @param string $database + * @return void + */ + public function callSetUpTestDatabaseCallbacks($database) + { + $this->whenRunningInParallel(function () use ($database) { + foreach ($this->setUpTestDatabaseCallbacks as $callback) { + $this->container->call($callback, [ + 'database' => $database, + 'token' => $this->token(), + ]); + } + }); + } + /** * Call all of the "tearDown" process callbacks. * diff --git a/tests/Testing/ParallelTestingTest.php b/tests/Testing/ParallelTestingTest.php index 802eddfbc0ae..d7a0406019ed 100644 --- a/tests/Testing/ParallelTestingTest.php +++ b/tests/Testing/ParallelTestingTest.php @@ -83,6 +83,7 @@ public function callbacks() return [ ['setUpProcess'], ['setUpTestCase'], + ['setUpTestDatabase'], ['tearDownTestCase'], ['tearDownProcess'], ];