EloquentMassPrunableTest.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace Illuminate\Tests\Integration\Database;
  3. use Illuminate\Container\Container;
  4. use Illuminate\Contracts\Events\Dispatcher;
  5. use Illuminate\Database\Eloquent\MassPrunable;
  6. use Illuminate\Database\Eloquent\Model;
  7. use Illuminate\Database\Eloquent\SoftDeletes;
  8. use Illuminate\Database\Events\ModelsPruned;
  9. use Illuminate\Database\Schema\Blueprint;
  10. use Illuminate\Support\Facades\Schema;
  11. use LogicException;
  12. use Mockery as m;
  13. /** @group SkipMSSQL */
  14. class EloquentMassPrunableTest extends DatabaseTestCase
  15. {
  16. protected function setUp(): void
  17. {
  18. parent::setUp();
  19. Container::setInstance($container = new Container);
  20. $container->singleton(Dispatcher::class, function () {
  21. return m::mock(Dispatcher::class);
  22. });
  23. $container->alias(Dispatcher::class, 'events');
  24. }
  25. protected function defineDatabaseMigrationsAfterDatabaseRefreshed()
  26. {
  27. collect([
  28. 'mass_prunable_test_models',
  29. 'mass_prunable_soft_delete_test_models',
  30. 'mass_prunable_test_model_missing_prunable_methods',
  31. ])->each(function ($table) {
  32. Schema::create($table, function (Blueprint $table) {
  33. $table->increments('id');
  34. $table->softDeletes();
  35. $table->boolean('pruned')->default(false);
  36. $table->timestamps();
  37. });
  38. });
  39. }
  40. public function testPrunableMethodMustBeImplemented()
  41. {
  42. $this->expectException(LogicException::class);
  43. $this->expectExceptionMessage(
  44. 'Please implement',
  45. );
  46. MassPrunableTestModelMissingPrunableMethod::create()->pruneAll();
  47. }
  48. public function testPrunesRecords()
  49. {
  50. app('events')
  51. ->shouldReceive('dispatch')
  52. ->times(2)
  53. ->with(m::type(ModelsPruned::class));
  54. collect(range(1, 5000))->map(function ($id) {
  55. return ['id' => $id];
  56. })->chunk(200)->each(function ($chunk) {
  57. MassPrunableTestModel::insert($chunk->all());
  58. });
  59. $count = (new MassPrunableTestModel)->pruneAll();
  60. $this->assertEquals(1500, $count);
  61. $this->assertEquals(3500, MassPrunableTestModel::count());
  62. }
  63. public function testPrunesSoftDeletedRecords()
  64. {
  65. app('events')
  66. ->shouldReceive('dispatch')
  67. ->times(3)
  68. ->with(m::type(ModelsPruned::class));
  69. collect(range(1, 5000))->map(function ($id) {
  70. return ['id' => $id, 'deleted_at' => now()];
  71. })->chunk(200)->each(function ($chunk) {
  72. MassPrunableSoftDeleteTestModel::insert($chunk->all());
  73. });
  74. $count = (new MassPrunableSoftDeleteTestModel)->pruneAll();
  75. $this->assertEquals(3000, $count);
  76. $this->assertEquals(0, MassPrunableSoftDeleteTestModel::count());
  77. $this->assertEquals(2000, MassPrunableSoftDeleteTestModel::withTrashed()->count());
  78. }
  79. public function tearDown(): void
  80. {
  81. parent::tearDown();
  82. Container::setInstance(null);
  83. m::close();
  84. }
  85. }
  86. class MassPrunableTestModel extends Model
  87. {
  88. use MassPrunable;
  89. public function prunable()
  90. {
  91. return $this->where('id', '<=', 1500);
  92. }
  93. }
  94. class MassPrunableSoftDeleteTestModel extends Model
  95. {
  96. use MassPrunable, SoftDeletes;
  97. public function prunable()
  98. {
  99. return $this->where('id', '<=', 3000);
  100. }
  101. }
  102. class MassPrunableTestModelMissingPrunableMethod extends Model
  103. {
  104. use MassPrunable;
  105. }