TestDatabasesTest.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace Illuminate\Tests\Testing\Concerns;
  3. use Illuminate\Config\Repository as Config;
  4. use Illuminate\Container\Container;
  5. use Illuminate\Support\Facades\DB;
  6. use Illuminate\Testing\Concerns\TestDatabases;
  7. use Mockery as m;
  8. use PHPUnit\Framework\TestCase;
  9. use ReflectionMethod;
  10. class TestDatabasesTest extends TestCase
  11. {
  12. protected function setUp(): void
  13. {
  14. parent::setUp();
  15. Container::setInstance($container = new Container);
  16. $container->singleton('config', function () {
  17. return m::mock(Config::class)
  18. ->shouldReceive('get')
  19. ->once()
  20. ->with('database.default', null)
  21. ->andReturn('mysql')
  22. ->getMock();
  23. });
  24. $_SERVER['LARAVEL_PARALLEL_TESTING'] = 1;
  25. }
  26. public function testSwitchToDatabaseWithoutUrl()
  27. {
  28. DB::shouldReceive('purge')->once();
  29. config()->shouldReceive('get')
  30. ->once()
  31. ->with('database.connections.mysql.url', false)
  32. ->andReturn(false);
  33. config()->shouldReceive('set')
  34. ->once()
  35. ->with('database.connections.mysql.database', 'my_database_test_1');
  36. $this->switchToDatabase('my_database_test_1');
  37. }
  38. /**
  39. * @dataProvider databaseUrls
  40. */
  41. public function testSwitchToDatabaseWithUrl($testDatabase, $url, $testUrl)
  42. {
  43. DB::shouldReceive('purge')->once();
  44. config()->shouldReceive('get')
  45. ->once()
  46. ->with('database.connections.mysql.url', false)
  47. ->andReturn($url);
  48. config()->shouldReceive('set')
  49. ->once()
  50. ->with('database.connections.mysql.url', $testUrl);
  51. $this->switchToDatabase($testDatabase);
  52. }
  53. public function switchToDatabase($database)
  54. {
  55. $instance = new class
  56. {
  57. use TestDatabases;
  58. };
  59. $method = new ReflectionMethod($instance, 'switchToDatabase');
  60. tap($method)->setAccessible(true)->invoke($instance, $database);
  61. }
  62. public function databaseUrls()
  63. {
  64. return [
  65. [
  66. 'my_database_test_1',
  67. 'mysql://root:@127.0.0.1/my_database?charset=utf8mb4',
  68. 'mysql://root:@127.0.0.1/my_database_test_1?charset=utf8mb4',
  69. ],
  70. [
  71. 'my_database_test_1',
  72. 'mysql://my-user:@localhost/my_database',
  73. 'mysql://my-user:@localhost/my_database_test_1',
  74. ],
  75. [
  76. 'my-database_test_1',
  77. 'postgresql://my_database_user:@127.0.0.1/my-database?charset=utf8',
  78. 'postgresql://my_database_user:@127.0.0.1/my-database_test_1?charset=utf8',
  79. ],
  80. ];
  81. }
  82. public function tearDown(): void
  83. {
  84. parent::tearDown();
  85. Container::setInstance(null);
  86. DB::clearResolvedInstances();
  87. DB::setFacadeApplication(null);
  88. unset($_SERVER['LARAVEL_PARALLEL_TESTING']);
  89. m::close();
  90. }
  91. }