123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- <?php
- namespace Illuminate\Tests\Integration\Database;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Database\Eloquent\Prunable;
- use Illuminate\Database\Eloquent\SoftDeletes;
- use Illuminate\Database\Events\ModelsPruned;
- use Illuminate\Database\Schema\Blueprint;
- use Illuminate\Support\Facades\Event;
- use Illuminate\Support\Facades\Schema;
- use LogicException;
- /** @group SkipMSSQL */
- class EloquentPrunableTest extends DatabaseTestCase
- {
- protected function defineDatabaseMigrationsAfterDatabaseRefreshed()
- {
- collect([
- 'prunable_test_models',
- 'prunable_soft_delete_test_models',
- 'prunable_test_model_missing_prunable_methods',
- 'prunable_with_custom_prune_method_test_models',
- ])->each(function ($table) {
- Schema::create($table, function (Blueprint $table) {
- $table->increments('id');
- $table->softDeletes();
- $table->boolean('pruned')->default(false);
- $table->timestamps();
- });
- });
- }
- public function testPrunableMethodMustBeImplemented()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage(
- 'Please implement',
- );
- PrunableTestModelMissingPrunableMethod::create()->pruneAll();
- }
- public function testPrunesRecords()
- {
- Event::fake();
- collect(range(1, 5000))->map(function ($id) {
- return ['id' => $id];
- })->chunk(200)->each(function ($chunk) {
- PrunableTestModel::insert($chunk->all());
- });
- $count = (new PrunableTestModel)->pruneAll();
- $this->assertEquals(1500, $count);
- $this->assertEquals(3500, PrunableTestModel::count());
- Event::assertDispatched(ModelsPruned::class, 2);
- }
- public function testPrunesSoftDeletedRecords()
- {
- Event::fake();
- collect(range(1, 5000))->map(function ($id) {
- return ['id' => $id, 'deleted_at' => now()];
- })->chunk(200)->each(function ($chunk) {
- PrunableSoftDeleteTestModel::insert($chunk->all());
- });
- $count = (new PrunableSoftDeleteTestModel)->pruneAll();
- $this->assertEquals(3000, $count);
- $this->assertEquals(0, PrunableSoftDeleteTestModel::count());
- $this->assertEquals(2000, PrunableSoftDeleteTestModel::withTrashed()->count());
- Event::assertDispatched(ModelsPruned::class, 3);
- }
- public function testPruneWithCustomPruneMethod()
- {
- Event::fake();
- collect(range(1, 5000))->map(function ($id) {
- return ['id' => $id];
- })->chunk(200)->each(function ($chunk) {
- PrunableWithCustomPruneMethodTestModel::insert($chunk->all());
- });
- $count = (new PrunableWithCustomPruneMethodTestModel)->pruneAll();
- $this->assertEquals(1000, $count);
- $this->assertTrue((bool) PrunableWithCustomPruneMethodTestModel::first()->pruned);
- $this->assertFalse((bool) PrunableWithCustomPruneMethodTestModel::orderBy('id', 'desc')->first()->pruned);
- $this->assertEquals(5000, PrunableWithCustomPruneMethodTestModel::count());
- Event::assertDispatched(ModelsPruned::class, 1);
- }
- }
- class PrunableTestModel extends Model
- {
- use Prunable;
- public function prunable()
- {
- return $this->where('id', '<=', 1500);
- }
- }
- class PrunableSoftDeleteTestModel extends Model
- {
- use Prunable, SoftDeletes;
- public function prunable()
- {
- return $this->where('id', '<=', 3000);
- }
- }
- class PrunableWithCustomPruneMethodTestModel extends Model
- {
- use Prunable;
- public function prunable()
- {
- return $this->where('id', '<=', 1000);
- }
- public function prune()
- {
- $this->forceFill([
- 'pruned' => true,
- ])->save();
- }
- }
- class PrunableTestModelMissingPrunableMethod extends Model
- {
- use Prunable;
- }
|