123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- <?php
- namespace Illuminate\Tests\Integration\Database;
- use Illuminate\Container\Container;
- use Illuminate\Contracts\Events\Dispatcher;
- use Illuminate\Database\Eloquent\MassPrunable;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Database\Eloquent\SoftDeletes;
- use Illuminate\Database\Events\ModelsPruned;
- use Illuminate\Database\Schema\Blueprint;
- use Illuminate\Support\Facades\Schema;
- use LogicException;
- use Mockery as m;
- /** @group SkipMSSQL */
- class EloquentMassPrunableTest extends DatabaseTestCase
- {
- protected function setUp(): void
- {
- parent::setUp();
- Container::setInstance($container = new Container);
- $container->singleton(Dispatcher::class, function () {
- return m::mock(Dispatcher::class);
- });
- $container->alias(Dispatcher::class, 'events');
- }
- protected function defineDatabaseMigrationsAfterDatabaseRefreshed()
- {
- collect([
- 'mass_prunable_test_models',
- 'mass_prunable_soft_delete_test_models',
- 'mass_prunable_test_model_missing_prunable_methods',
- ])->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',
- );
- MassPrunableTestModelMissingPrunableMethod::create()->pruneAll();
- }
- public function testPrunesRecords()
- {
- app('events')
- ->shouldReceive('dispatch')
- ->times(2)
- ->with(m::type(ModelsPruned::class));
- collect(range(1, 5000))->map(function ($id) {
- return ['id' => $id];
- })->chunk(200)->each(function ($chunk) {
- MassPrunableTestModel::insert($chunk->all());
- });
- $count = (new MassPrunableTestModel)->pruneAll();
- $this->assertEquals(1500, $count);
- $this->assertEquals(3500, MassPrunableTestModel::count());
- }
- public function testPrunesSoftDeletedRecords()
- {
- app('events')
- ->shouldReceive('dispatch')
- ->times(3)
- ->with(m::type(ModelsPruned::class));
- collect(range(1, 5000))->map(function ($id) {
- return ['id' => $id, 'deleted_at' => now()];
- })->chunk(200)->each(function ($chunk) {
- MassPrunableSoftDeleteTestModel::insert($chunk->all());
- });
- $count = (new MassPrunableSoftDeleteTestModel)->pruneAll();
- $this->assertEquals(3000, $count);
- $this->assertEquals(0, MassPrunableSoftDeleteTestModel::count());
- $this->assertEquals(2000, MassPrunableSoftDeleteTestModel::withTrashed()->count());
- }
- public function tearDown(): void
- {
- parent::tearDown();
- Container::setInstance(null);
- m::close();
- }
- }
- class MassPrunableTestModel extends Model
- {
- use MassPrunable;
- public function prunable()
- {
- return $this->where('id', '<=', 1500);
- }
- }
- class MassPrunableSoftDeleteTestModel extends Model
- {
- use MassPrunable, SoftDeletes;
- public function prunable()
- {
- return $this->where('id', '<=', 3000);
- }
- }
- class MassPrunableTestModelMissingPrunableMethod extends Model
- {
- use MassPrunable;
- }
|