use(WithFaker::class); test('no results', function (): void { $this->mock(VideoSourceRepository::class, function (MockInterface $mock): void { $mock->shouldReceive('get')->once()->andReturn(Collection::make()); }); $action = new ReconcileVideoRepositoriesAction(); $source = App::make(VideoSourceRepository::class); $destination = App::make(VideoDestinationRepository::class); $result = $action->reconcileRepositories($source, $destination); expect($result->getStatus())->toBe(ActionStatus::PASSED); expect($result->hasChanges())->toBeFalse(); $this->assertDatabaseCount(Video::class, 0); }); test('created', function (): void { $createdVideoCount = fake()->numberBetween(2, 9); $videos = Video::factory()->count($createdVideoCount)->make(); $this->mock(VideoSourceRepository::class, function (MockInterface $mock) use ($videos): void { $mock->shouldReceive('get')->once()->andReturn($videos); }); $action = new ReconcileVideoRepositoriesAction(); $source = App::make(VideoSourceRepository::class); $destination = App::make(VideoDestinationRepository::class); $result = $action->reconcileRepositories($source, $destination); expect($result->getStatus())->toBe(ActionStatus::PASSED); expect($result->hasChanges())->toBeTrue(); expect($result->getCreated())->toHaveCount($createdVideoCount); $this->assertDatabaseCount(Video::class, $createdVideoCount); }); test('deleted', function (): void { $deletedVideoCount = fake()->numberBetween(2, 9); $videos = Video::factory()->count($deletedVideoCount)->create(); $this->mock(VideoSourceRepository::class, function (MockInterface $mock): void { $mock->shouldReceive('get')->once()->andReturn(Collection::make()); }); $action = new ReconcileVideoRepositoriesAction(); $source = App::make(VideoSourceRepository::class); $destination = App::make(VideoDestinationRepository::class); $result = $action->reconcileRepositories($source, $destination); expect($result->getStatus())->toBe(ActionStatus::PASSED); expect($result->hasChanges())->toBeTrue(); expect($result->getDeleted())->toHaveCount($deletedVideoCount); $this->assertDatabaseCount(Video::class, $deletedVideoCount); foreach ($videos as $video) { $this->assertSoftDeleted($video); } }); test('updated', function (): void { $updatedVideoCount = fake()->numberBetween(2, 9); $basenames = collect(fake()->words($updatedVideoCount)); Video::factory() ->count($updatedVideoCount) ->sequence(fn ($sequence): array => [Video::ATTRIBUTE_BASENAME => $basenames->get($sequence->index)]) ->create(); $sourceVideos = Video::factory() ->count($updatedVideoCount) ->sequence(fn ($sequence): array => [Video::ATTRIBUTE_BASENAME => $basenames->get($sequence->index)]) ->make(); $this->mock(VideoRepository::class, function (MockInterface $mock) use ($sourceVideos): void { $mock->shouldReceive('get')->once()->andReturn($sourceVideos); }); $action = new ReconcileVideoRepositoriesAction(); $source = App::make(VideoSourceRepository::class); $destination = App::make(VideoDestinationRepository::class); $result = $action->reconcileRepositories($source, $destination); expect($result->getStatus())->toBe(ActionStatus::PASSED); expect($result->hasChanges())->toBeTrue(); expect($result->getUpdated())->toHaveCount($updatedVideoCount); $this->assertDatabaseCount(Video::class, $updatedVideoCount); });