EloquentPrunableTest.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace Illuminate\Tests\Integration\Database;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Database\Eloquent\Prunable;
  5. use Illuminate\Database\Eloquent\SoftDeletes;
  6. use Illuminate\Database\Events\ModelsPruned;
  7. use Illuminate\Database\Schema\Blueprint;
  8. use Illuminate\Support\Facades\Event;
  9. use Illuminate\Support\Facades\Schema;
  10. use LogicException;
  11. /** @group SkipMSSQL */
  12. class EloquentPrunableTest extends DatabaseTestCase
  13. {
  14. protected function defineDatabaseMigrationsAfterDatabaseRefreshed()
  15. {
  16. collect([
  17. 'prunable_test_models',
  18. 'prunable_soft_delete_test_models',
  19. 'prunable_test_model_missing_prunable_methods',
  20. 'prunable_with_custom_prune_method_test_models',
  21. ])->each(function ($table) {
  22. Schema::create($table, function (Blueprint $table) {
  23. $table->increments('id');
  24. $table->softDeletes();
  25. $table->boolean('pruned')->default(false);
  26. $table->timestamps();
  27. });
  28. });
  29. }
  30. public function testPrunableMethodMustBeImplemented()
  31. {
  32. $this->expectException(LogicException::class);
  33. $this->expectExceptionMessage(
  34. 'Please implement',
  35. );
  36. PrunableTestModelMissingPrunableMethod::create()->pruneAll();
  37. }
  38. public function testPrunesRecords()
  39. {
  40. Event::fake();
  41. collect(range(1, 5000))->map(function ($id) {
  42. return ['id' => $id];
  43. })->chunk(200)->each(function ($chunk) {
  44. PrunableTestModel::insert($chunk->all());
  45. });
  46. $count = (new PrunableTestModel)->pruneAll();
  47. $this->assertEquals(1500, $count);
  48. $this->assertEquals(3500, PrunableTestModel::count());
  49. Event::assertDispatched(ModelsPruned::class, 2);
  50. }
  51. public function testPrunesSoftDeletedRecords()
  52. {
  53. Event::fake();
  54. collect(range(1, 5000))->map(function ($id) {
  55. return ['id' => $id, 'deleted_at' => now()];
  56. })->chunk(200)->each(function ($chunk) {
  57. PrunableSoftDeleteTestModel::insert($chunk->all());
  58. });
  59. $count = (new PrunableSoftDeleteTestModel)->pruneAll();
  60. $this->assertEquals(3000, $count);
  61. $this->assertEquals(0, PrunableSoftDeleteTestModel::count());
  62. $this->assertEquals(2000, PrunableSoftDeleteTestModel::withTrashed()->count());
  63. Event::assertDispatched(ModelsPruned::class, 3);
  64. }
  65. public function testPruneWithCustomPruneMethod()
  66. {
  67. Event::fake();
  68. collect(range(1, 5000))->map(function ($id) {
  69. return ['id' => $id];
  70. })->chunk(200)->each(function ($chunk) {
  71. PrunableWithCustomPruneMethodTestModel::insert($chunk->all());
  72. });
  73. $count = (new PrunableWithCustomPruneMethodTestModel)->pruneAll();
  74. $this->assertEquals(1000, $count);
  75. $this->assertTrue((bool) PrunableWithCustomPruneMethodTestModel::first()->pruned);
  76. $this->assertFalse((bool) PrunableWithCustomPruneMethodTestModel::orderBy('id', 'desc')->first()->pruned);
  77. $this->assertEquals(5000, PrunableWithCustomPruneMethodTestModel::count());
  78. Event::assertDispatched(ModelsPruned::class, 1);
  79. }
  80. }
  81. class PrunableTestModel extends Model
  82. {
  83. use Prunable;
  84. public function prunable()
  85. {
  86. return $this->where('id', '<=', 1500);
  87. }
  88. }
  89. class PrunableSoftDeleteTestModel extends Model
  90. {
  91. use Prunable, SoftDeletes;
  92. public function prunable()
  93. {
  94. return $this->where('id', '<=', 3000);
  95. }
  96. }
  97. class PrunableWithCustomPruneMethodTestModel extends Model
  98. {
  99. use Prunable;
  100. public function prunable()
  101. {
  102. return $this->where('id', '<=', 1000);
  103. }
  104. public function prune()
  105. {
  106. $this->forceFill([
  107. 'pruned' => true,
  108. ])->save();
  109. }
  110. }
  111. class PrunableTestModelMissingPrunableMethod extends Model
  112. {
  113. use Prunable;
  114. }