DatabaseSchemaBuilderIntegrationTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace Illuminate\Tests\Database;
  3. use Illuminate\Container\Container;
  4. use Illuminate\Database\Capsule\Manager as DB;
  5. use Illuminate\Database\Schema\Blueprint;
  6. use Illuminate\Support\Facades\Facade;
  7. use PHPUnit\Framework\TestCase;
  8. class DatabaseSchemaBuilderIntegrationTest extends TestCase
  9. {
  10. protected $db;
  11. /**
  12. * Bootstrap database.
  13. *
  14. * @return void
  15. */
  16. protected function setUp(): void
  17. {
  18. $this->db = $db = new DB;
  19. $db->addConnection([
  20. 'driver' => 'sqlite',
  21. 'database' => ':memory:',
  22. ]);
  23. $db->setAsGlobal();
  24. $container = new Container;
  25. $container->instance('db', $db->getDatabaseManager());
  26. Facade::setFacadeApplication($container);
  27. }
  28. protected function tearDown(): void
  29. {
  30. Facade::clearResolvedInstances();
  31. Facade::setFacadeApplication(null);
  32. }
  33. public function testDropAllTablesWorksWithForeignKeys()
  34. {
  35. $this->db->connection()->getSchemaBuilder()->create('table1', function (Blueprint $table) {
  36. $table->integer('id');
  37. $table->string('name');
  38. });
  39. $this->db->connection()->getSchemaBuilder()->create('table2', function (Blueprint $table) {
  40. $table->integer('id');
  41. $table->string('user_id');
  42. $table->foreign('user_id')->references('id')->on('table1');
  43. });
  44. $this->assertTrue($this->db->connection()->getSchemaBuilder()->hasTable('table1'));
  45. $this->assertTrue($this->db->connection()->getSchemaBuilder()->hasTable('table2'));
  46. $this->db->connection()->getSchemaBuilder()->dropAllTables();
  47. $this->assertFalse($this->db->connection()->getSchemaBuilder()->hasTable('table1'));
  48. $this->assertFalse($this->db->connection()->getSchemaBuilder()->hasTable('table2'));
  49. }
  50. public function testHasColumnWithTablePrefix()
  51. {
  52. $this->db->connection()->setTablePrefix('test_');
  53. $this->db->connection()->getSchemaBuilder()->create('table1', function (Blueprint $table) {
  54. $table->integer('id');
  55. $table->string('name');
  56. });
  57. $this->assertTrue($this->db->connection()->getSchemaBuilder()->hasColumn('table1', 'name'));
  58. }
  59. public function testHasColumnAndIndexWithPrefixIndexDisabled()
  60. {
  61. $this->db->addConnection([
  62. 'driver' => 'sqlite',
  63. 'database' => ':memory:',
  64. 'prefix' => 'example_',
  65. 'prefix_indexes' => false,
  66. ]);
  67. $this->db->connection()->getSchemaBuilder()->create('table1', function (Blueprint $table) {
  68. $table->integer('id');
  69. $table->string('name')->index();
  70. });
  71. $this->assertArrayHasKey('table1_name_index', $this->db->connection()->getDoctrineSchemaManager()->listTableIndexes('example_table1'));
  72. }
  73. public function testHasColumnAndIndexWithPrefixIndexEnabled()
  74. {
  75. $this->db->addConnection([
  76. 'driver' => 'sqlite',
  77. 'database' => ':memory:',
  78. 'prefix' => 'example_',
  79. 'prefix_indexes' => true,
  80. ]);
  81. $this->db->connection()->getSchemaBuilder()->create('table1', function (Blueprint $table) {
  82. $table->integer('id');
  83. $table->string('name')->index();
  84. });
  85. $this->assertArrayHasKey('example_table1_name_index', $this->db->connection()->getDoctrineSchemaManager()->listTableIndexes('example_table1'));
  86. }
  87. public function testDropColumnWithTablePrefix()
  88. {
  89. $this->db->connection()->setTablePrefix('test_');
  90. $this->schemaBuilder()->create('pandemic_table', function (Blueprint $table) {
  91. $table->integer('id');
  92. $table->string('stay_home');
  93. $table->string('covid19');
  94. $table->string('wear_mask');
  95. });
  96. // drop single columns
  97. $this->assertTrue($this->schemaBuilder()->hasColumn('pandemic_table', 'stay_home'));
  98. $this->schemaBuilder()->dropColumns('pandemic_table', 'stay_home');
  99. $this->assertFalse($this->schemaBuilder()->hasColumn('pandemic_table', 'stay_home'));
  100. // drop multiple columns
  101. $this->assertTrue($this->schemaBuilder()->hasColumn('pandemic_table', 'covid19'));
  102. $this->schemaBuilder()->dropColumns('pandemic_table', ['covid19', 'wear_mask']);
  103. $this->assertFalse($this->schemaBuilder()->hasColumn('pandemic_table', 'wear_mask'));
  104. $this->assertFalse($this->schemaBuilder()->hasColumn('pandemic_table', 'covid19'));
  105. }
  106. private function schemaBuilder()
  107. {
  108. return $this->db->connection()->getSchemaBuilder();
  109. }
  110. }