|
14 | 14 | use Illuminate\Support\Facades\DB; |
15 | 15 | use Illuminate\Support\Facades\Event; |
16 | 16 | use Illuminate\Support\Facades\Route; |
| 17 | +use Laravel\Nightwatch\Compatibility; |
17 | 18 | use MongoDB\Laravel\Connection as MongoDbConnection; |
18 | 19 | use PDO; |
19 | 20 | use PHPUnit\Framework\Attributes\DataProvider; |
20 | 21 | use SingleStore\Laravel\Connect\Connection as LegacySingleStoreConnection; |
21 | 22 | use SingleStore\Laravel\Connect\SingleStoreConnection; |
22 | 23 | use Tests\TestCase; |
23 | 24 |
|
| 25 | +use function array_merge; |
24 | 26 | use function base64_encode; |
25 | 27 | use function class_exists; |
26 | 28 | use function dirname; |
| 29 | +use function fake; |
27 | 30 | use function hash; |
28 | 31 | use function hex2bin; |
29 | 32 | use function in_array; |
@@ -93,6 +96,7 @@ public function test_it_can_ingest_queries(): void |
93 | 96 | 'line' => $line, |
94 | 97 | 'duration' => 4321, |
95 | 98 | 'connection' => $connection, |
| 99 | + 'connection_type' => Compatibility::$queryConnectionTypeCapturable ? 'write' : '', |
96 | 100 | ], |
97 | 101 | ]); |
98 | 102 | } |
@@ -352,4 +356,182 @@ public function test_it_can_capture_null_connection_name() |
352 | 356 | $ingest->assertWrittenTimes(1); |
353 | 357 | $ingest->assertLatestWrite('query:0.connection', ''); |
354 | 358 | } |
| 359 | + |
| 360 | + public function test_it_captures_connection_type_as_write_when_read_and_write_connections_are_not_configured() |
| 361 | + { |
| 362 | + $ingest = $this->fakeIngest(); |
| 363 | + |
| 364 | + Route::get('/users', function () { |
| 365 | + return DB::table('users')->get(); |
| 366 | + }); |
| 367 | + |
| 368 | + $response = $this->get('/users'); |
| 369 | + |
| 370 | + $response->assertOk(); |
| 371 | + $ingest->assertWrittenTimes(1); |
| 372 | + $ingest->assertLatestWrite('query:0.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'write' : ''); |
| 373 | + } |
| 374 | + |
| 375 | + public function test_it_captures_connection_type_as_read_for_select_query() |
| 376 | + { |
| 377 | + $this->configureReadWriteConnection(); |
| 378 | + |
| 379 | + $ingest = $this->fakeIngest(); |
| 380 | + |
| 381 | + Route::get('/users', function () { |
| 382 | + return DB::table('users')->get(); |
| 383 | + }); |
| 384 | + |
| 385 | + $response = $this->get('/users'); |
| 386 | + |
| 387 | + $response->assertOk(); |
| 388 | + $ingest->assertWrittenTimes(1); |
| 389 | + $ingest->assertLatestWrite('query:0.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'read' : ''); |
| 390 | + } |
| 391 | + |
| 392 | + public function test_it_captures_connection_type_as_write_for_write_query() |
| 393 | + { |
| 394 | + $this->configureReadWriteConnection(); |
| 395 | + |
| 396 | + $ingest = $this->fakeIngest(); |
| 397 | + |
| 398 | + Route::get('/users', function () { |
| 399 | + return DB::table('users')->insert([ |
| 400 | + 'name' => fake()->name(), |
| 401 | + 'email' => fake()->email(), |
| 402 | + 'password' => fake()->password(), |
| 403 | + ]); |
| 404 | + }); |
| 405 | + |
| 406 | + $response = $this->get('/users'); |
| 407 | + |
| 408 | + $response->assertOk(); |
| 409 | + $ingest->assertWrittenTimes(1); |
| 410 | + $ingest->assertLatestWrite('query:0.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'write' : ''); |
| 411 | + } |
| 412 | + |
| 413 | + public function test_it_captures_connection_type_as_write_when_records_have_been_modified_and_sticky_connection_is_enabled() |
| 414 | + { |
| 415 | + $this->configureReadWriteConnection(['sticky' => true]); |
| 416 | + |
| 417 | + $ingest = $this->fakeIngest(); |
| 418 | + |
| 419 | + Route::get('/users', function () { |
| 420 | + DB::table('users')->insert([ |
| 421 | + 'name' => fake()->name(), |
| 422 | + 'email' => fake()->email(), |
| 423 | + 'password' => fake()->password(), |
| 424 | + ]); |
| 425 | + |
| 426 | + return DB::table('users')->get(); |
| 427 | + }); |
| 428 | + |
| 429 | + $response = $this->get('/users'); |
| 430 | + |
| 431 | + $response->assertOk(); |
| 432 | + $ingest->assertWrittenTimes(1); |
| 433 | + $ingest->assertLatestWrite('query:0.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'write' : ''); // insert |
| 434 | + $ingest->assertLatestWrite('query:1.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'write' : ''); // select |
| 435 | + } |
| 436 | + |
| 437 | + public function test_it_captures_connection_type_as_write_for_insert_and_read_for_select_when_sticky_connection_is_disabled() |
| 438 | + { |
| 439 | + $this->configureReadWriteConnection(['sticky' => false]); |
| 440 | + |
| 441 | + $ingest = $this->fakeIngest(); |
| 442 | + |
| 443 | + Route::get('/users', function () { |
| 444 | + DB::table('users')->insert([ |
| 445 | + 'name' => fake()->name(), |
| 446 | + 'email' => fake()->email(), |
| 447 | + 'password' => fake()->password(), |
| 448 | + ]); |
| 449 | + |
| 450 | + return DB::table('users')->get(); |
| 451 | + }); |
| 452 | + |
| 453 | + $response = $this->get('/users'); |
| 454 | + |
| 455 | + $response->assertOk(); |
| 456 | + $ingest->assertWrittenTimes(1); |
| 457 | + $ingest->assertLatestWrite('query:0.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'write' : ''); // insert |
| 458 | + $ingest->assertLatestWrite('query:1.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'read' : ''); // select |
| 459 | + } |
| 460 | + |
| 461 | + public function test_it_captures_connection_type_as_write_when_it_should_use_write_connection_when_reading() |
| 462 | + { |
| 463 | + $this->configureReadWriteConnection(); |
| 464 | + |
| 465 | + $ingest = $this->fakeIngest(); |
| 466 | + |
| 467 | + Route::get('/users', function () { |
| 468 | + return DB::useWriteConnectionWhenReading()->table('users')->get(); |
| 469 | + }); |
| 470 | + |
| 471 | + $response = $this->get('/users'); |
| 472 | + |
| 473 | + $response->assertOk(); |
| 474 | + $ingest->assertWrittenTimes(1); |
| 475 | + $ingest->assertLatestWrite('query:0.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'write' : ''); |
| 476 | + } |
| 477 | + |
| 478 | + public function test_it_captures_connection_type_as_write_when_in_a_transaction() |
| 479 | + { |
| 480 | + $this->configureReadWriteConnection(); |
| 481 | + |
| 482 | + $ingest = $this->fakeIngest(); |
| 483 | + |
| 484 | + Route::get('/users', function () { |
| 485 | + DB::beginTransaction(); |
| 486 | + |
| 487 | + $users = DB::table('users')->get(); |
| 488 | + |
| 489 | + DB::rollBack(); |
| 490 | + |
| 491 | + return $users; |
| 492 | + }); |
| 493 | + |
| 494 | + $response = $this->get('/users'); |
| 495 | + |
| 496 | + $response->assertOk(); |
| 497 | + $ingest->assertWrittenTimes(1); |
| 498 | + $ingest->assertLatestWrite('query:0.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'write' : ''); |
| 499 | + } |
| 500 | + |
| 501 | + public function test_it_captures_connection_type_when_forgetting_modified_records_state() |
| 502 | + { |
| 503 | + $this->configureReadWriteConnection(['sticky' => true]); |
| 504 | + |
| 505 | + $ingest = $this->fakeIngest(); |
| 506 | + |
| 507 | + Route::get('/users', function () { |
| 508 | + DB::statement('select 1'); |
| 509 | + DB::forgetRecordModificationState(); |
| 510 | + DB::select('select 1'); |
| 511 | + }); |
| 512 | + |
| 513 | + $response = $this->get('/users'); |
| 514 | + |
| 515 | + $response->assertOk(); |
| 516 | + $ingest->assertWrittenTimes(1); |
| 517 | + $ingest->assertLatestWrite('query:0.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'write' : ''); |
| 518 | + $ingest->assertLatestWrite('query:1.connection_type', Compatibility::$queryConnectionTypeCapturable ? 'read' : ''); |
| 519 | + } |
| 520 | + |
| 521 | + private function configureReadWriteConnection(array $options = []): void |
| 522 | + { |
| 523 | + $connection = Config::get('database.default'); |
| 524 | + $config = Config::get("database.connections.{$connection}"); |
| 525 | + |
| 526 | + Config::set("database.connections.{$connection}", array_merge($config, [ |
| 527 | + 'read' => [ |
| 528 | + 'database' => $config['database'], |
| 529 | + ], |
| 530 | + 'write' => [ |
| 531 | + 'database' => $config['database'], |
| 532 | + ], |
| 533 | + ], $options)); |
| 534 | + |
| 535 | + DB::purge($connection); |
| 536 | + } |
355 | 537 | } |
0 commit comments