Skip to content

Commit 7cee134

Browse files
committed
Merge remote-tracking branch 'origin/11.x' into 11.x
2 parents 6d53774 + 4cd413b commit 7cee134

6 files changed

+105
-13
lines changed

src/Illuminate/Foundation/Testing/DatabaseTransactions.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ public function beginDatabaseTransaction()
1313
{
1414
$database = $this->app->make('db');
1515

16-
$this->app->instance('db.transactions', $transactionsManager = new DatabaseTransactionsManager);
16+
$connections = $this->connectionsToTransact();
1717

18-
foreach ($this->connectionsToTransact() as $name) {
18+
$this->app->instance('db.transactions', $transactionsManager = new DatabaseTransactionsManager($connections));
19+
20+
foreach ($connections as $name) {
1921
$connection = $database->connection($name);
2022
$connection->setTransactionManager($transactionsManager);
2123
$dispatcher = $connection->getEventDispatcher();

src/Illuminate/Foundation/Testing/DatabaseTransactionsManager.php

+19-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,24 @@
66

77
class DatabaseTransactionsManager extends BaseManager
88
{
9+
/**
10+
* The names of the connections transacting during tests.
11+
*/
12+
protected array $connectionsTransacting;
13+
14+
/**
15+
* Create a new database transaction manager instance.
16+
*
17+
* @param array $connectionsTransacting
18+
* @return void
19+
*/
20+
public function __construct(array $connectionsTransacting)
21+
{
22+
parent::__construct();
23+
24+
$this->connectionsTransacting = $connectionsTransacting;
25+
}
26+
927
/**
1028
* Register a transaction callback.
1129
*
@@ -31,7 +49,7 @@ public function addCallback($callback)
3149
*/
3250
public function callbackApplicableTransactions()
3351
{
34-
return $this->pendingTransactions->skip(1)->values();
52+
return $this->pendingTransactions->skip(count($this->connectionsTransacting))->values();
3553
}
3654

3755
/**

src/Illuminate/Foundation/Testing/RefreshDatabase.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,11 @@ public function beginDatabaseTransaction()
8282
{
8383
$database = $this->app->make('db');
8484

85-
$this->app->instance('db.transactions', $transactionsManager = new DatabaseTransactionsManager);
85+
$connections = $this->connectionsToTransact();
8686

87-
foreach ($this->connectionsToTransact() as $name) {
87+
$this->app->instance('db.transactions', $transactionsManager = new DatabaseTransactionsManager($connections));
88+
89+
foreach ($connections as $name) {
8890
$connection = $database->connection($name);
8991

9092
$connection->setTransactionManager($transactionsManager);

tests/Foundation/Testing/DatabaseTransactionsManagerTest.php

+18-7
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ class DatabaseTransactionsManagerTest extends TestCase
99
{
1010
public function testItExecutesCallbacksImmediatelyIfThereIsOnlyOneTransaction()
1111
{
12-
$testObject = new TestingDatabaseTransactionsManagerTestObject();
13-
$manager = new DatabaseTransactionsManager;
12+
$testObject = new TestingDatabaseTransactionsManagerTestObject;
13+
$manager = new DatabaseTransactionsManager([null]);
1414

1515
$manager->begin('foo', 1);
1616

@@ -22,7 +22,7 @@ public function testItExecutesCallbacksImmediatelyIfThereIsOnlyOneTransaction()
2222

2323
public function testItIgnoresTheBaseTransactionForCallbackApplicableTransactions()
2424
{
25-
$manager = new DatabaseTransactionsManager;
25+
$manager = new DatabaseTransactionsManager([null]);
2626

2727
$manager->begin('foo', 1);
2828
$manager->begin('foo', 2);
@@ -33,7 +33,7 @@ public function testItIgnoresTheBaseTransactionForCallbackApplicableTransactions
3333

3434
public function testCommittingDoesNotRemoveTheBasePendingTransaction()
3535
{
36-
$manager = new DatabaseTransactionsManager;
36+
$manager = new DatabaseTransactionsManager([null]);
3737

3838
$manager->begin('foo', 1);
3939

@@ -50,8 +50,8 @@ public function testCommittingDoesNotRemoveTheBasePendingTransaction()
5050

5151
public function testItExecutesCallbacksForTheSecondTransaction()
5252
{
53-
$testObject = new TestingDatabaseTransactionsManagerTestObject();
54-
$manager = new DatabaseTransactionsManager;
53+
$testObject = new TestingDatabaseTransactionsManagerTestObject;
54+
$manager = new DatabaseTransactionsManager([null]);
5555
$manager->begin('foo', 1);
5656
$manager->begin('foo', 2);
5757

@@ -67,17 +67,28 @@ public function testItExecutesCallbacksForTheSecondTransaction()
6767

6868
public function testItExecutesTransactionCallbacksAtLevelOne()
6969
{
70-
$manager = new DatabaseTransactionsManager;
70+
$manager = new DatabaseTransactionsManager([null]);
7171

7272
$this->assertFalse($manager->afterCommitCallbacksShouldBeExecuted(0));
7373
$this->assertTrue($manager->afterCommitCallbacksShouldBeExecuted(1));
7474
$this->assertFalse($manager->afterCommitCallbacksShouldBeExecuted(2));
7575
}
76+
77+
public function testSkipsTheNumberOfConnectionsTransacting()
78+
{
79+
$manager = new DatabaseTransactionsManager([null]);
80+
81+
$manager->begin('foo', 1);
82+
$manager->begin('foo', 2);
83+
84+
$this->assertCount(1, $manager->callbackApplicableTransactions());
85+
}
7686
}
7787

7888
class TestingDatabaseTransactionsManagerTestObject
7989
{
8090
public $ran = false;
91+
8192
public $runs = 0;
8293

8394
public function handle()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace Illuminate\Tests\Integration\Database;
4+
5+
use Illuminate\Support\Facades\DB;
6+
use Orchestra\Testbench\Attributes\WithConfig;
7+
8+
use function Orchestra\Testbench\artisan;
9+
10+
#[WithConfig('database.connections.second', ['driver' => 'sqlite', 'database' => ':memory:', 'foreign_key_constraints' => false])]
11+
class EloquentTransactionWithAfterCommitUsingRefreshDatabaseOnMultipleConnectionsTest extends EloquentTransactionWithAfterCommitUsingRefreshDatabaseTest
12+
{
13+
/** {@inheritDoc} */
14+
protected function connectionsToTransact()
15+
{
16+
return [null, 'second'];
17+
}
18+
19+
/** {@inheritDoc} */
20+
protected function afterRefreshingDatabase()
21+
{
22+
artisan($this, 'migrate', ['--database' => 'second']);
23+
}
24+
25+
public function testAfterCommitCallbacksAreCalledCorrectlyWhenNoAppTransaction()
26+
{
27+
$called = false;
28+
29+
DB::afterCommit(function () use (&$called) {
30+
$called = true;
31+
});
32+
33+
$this->assertTrue($called);
34+
}
35+
36+
public function testAfterCommitCallbacksAreCalledWithWrappingTransactionsCorrectly()
37+
{
38+
$calls = [];
39+
40+
DB::transaction(function () use (&$calls) {
41+
DB::afterCommit(function () use (&$calls) {
42+
$calls[] = 'first transaction callback';
43+
});
44+
45+
DB::connection('second')->transaction(function () use (&$calls) {
46+
DB::connection('second')->afterCommit(function () use (&$calls) {
47+
$calls[] = 'second transaction callback';
48+
});
49+
});
50+
});
51+
52+
$this->assertEquals([
53+
'second transaction callback',
54+
'first transaction callback',
55+
], $calls);
56+
}
57+
}

tests/Integration/Database/EloquentTransactionWithAfterCommitUsingRefreshDatabaseTest.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class EloquentTransactionWithAfterCommitUsingRefreshDatabaseTest extends TestCas
1717
*/
1818
protected $driver;
1919

20+
/** {@inheritDoc} */
2021
protected function setUp(): void
2122
{
2223
$this->beforeApplicationDestroyed(function () {
@@ -28,7 +29,8 @@ protected function setUp(): void
2829
parent::setUp();
2930
}
3031

31-
protected function getEnvironmentSetUp($app)
32+
/** {@inheritDoc} */
33+
protected function defineEnvironment($app)
3234
{
3335
$connection = $app['config']->get('database.default');
3436

0 commit comments

Comments
 (0)