Path: blob/1.0-develop/tests/Integration/Jobs/Schedule/RunTaskJobTest.php
10277 views
<?php12namespace Pterodactyl\Tests\Integration\Jobs\Schedule;34use Carbon\Carbon;5use Carbon\CarbonImmutable;6use GuzzleHttp\Psr7\Request;7use Pterodactyl\Models\Task;8use GuzzleHttp\Psr7\Response;9use Pterodactyl\Models\Server;10use Pterodactyl\Models\Schedule;11use Illuminate\Support\Facades\Bus;12use Pterodactyl\Jobs\Schedule\RunTaskJob;13use GuzzleHttp\Exception\BadResponseException;14use Pterodactyl\Tests\Integration\IntegrationTestCase;15use Pterodactyl\Repositories\Wings\DaemonPowerRepository;16use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException;1718class RunTaskJobTest extends IntegrationTestCase19{20/**21* An inactive job should not be run by the system.22*/23public function testInactiveJobIsNotRun()24{25$server = $this->createServerModel();2627/** @var Schedule $schedule */28$schedule = Schedule::factory()->create([29'server_id' => $server->id,30'is_processing' => true,31'last_run_at' => null,32'is_active' => false,33]);34/** @var Task $task */35$task = Task::factory()->create(['schedule_id' => $schedule->id, 'is_queued' => true]);3637$job = new RunTaskJob($task);3839Bus::dispatchSync($job);4041$task->refresh();42$schedule->refresh();4344$this->assertFalse($task->is_queued);45$this->assertFalse($schedule->is_processing);46$this->assertFalse($schedule->is_active);47$this->assertTrue(CarbonImmutable::now()->isSameAs(\DateTimeInterface::ATOM, $schedule->last_run_at));48}4950public function testJobWithInvalidActionThrowsException()51{52$server = $this->createServerModel();5354/** @var Schedule $schedule */55$schedule = Schedule::factory()->create(['server_id' => $server->id]);56/** @var Task $task */57$task = Task::factory()->create(['schedule_id' => $schedule->id, 'action' => 'foobar']);5859$job = new RunTaskJob($task);6061$this->expectException(\InvalidArgumentException::class);62$this->expectExceptionMessage('Invalid task action provided: foobar');63Bus::dispatchSync($job);64}6566#[\PHPUnit\Framework\Attributes\DataProvider('isManualRunDataProvider')]67public function testJobIsExecuted(bool $isManualRun)68{69$server = $this->createServerModel();7071/** @var Schedule $schedule */72$schedule = Schedule::factory()->create([73'server_id' => $server->id,74'is_active' => !$isManualRun,75'is_processing' => true,76'last_run_at' => null,77]);78/** @var Task $task */79$task = Task::factory()->create([80'schedule_id' => $schedule->id,81'action' => Task::ACTION_POWER,82'payload' => 'start',83'is_queued' => true,84'continue_on_failure' => false,85]);8687$mock = \Mockery::mock(DaemonPowerRepository::class);88$this->instance(DaemonPowerRepository::class, $mock);8990$mock->expects('setServer')->with(\Mockery::on(function ($value) use ($server) {91return $value instanceof Server && $value->id === $server->id;92}))->andReturnSelf();93$mock->expects('send')->with('start')->andReturn(new Response());9495Bus::dispatchSync(new RunTaskJob($task, $isManualRun));9697$task->refresh();98$schedule->refresh();99100$this->assertFalse($task->is_queued);101$this->assertFalse($schedule->is_processing);102$this->assertTrue(CarbonImmutable::now()->isSameAs(\DateTimeInterface::ATOM, $schedule->last_run_at));103}104105#[\PHPUnit\Framework\Attributes\DataProvider('isManualRunDataProvider')]106public function testExceptionDuringRunIsHandledCorrectly(bool $continueOnFailure)107{108$server = $this->createServerModel();109110/** @var Schedule $schedule */111$schedule = Schedule::factory()->create(['server_id' => $server->id]);112/** @var Task $task */113$task = Task::factory()->create([114'schedule_id' => $schedule->id,115'action' => Task::ACTION_POWER,116'payload' => 'start',117'continue_on_failure' => $continueOnFailure,118]);119120$mock = \Mockery::mock(DaemonPowerRepository::class);121$this->instance(DaemonPowerRepository::class, $mock);122123$mock->expects('setServer->send')->andThrow(124new DaemonConnectionException(new BadResponseException('Bad request', new Request('GET', '/test'), new Response()))125);126127if (!$continueOnFailure) {128$this->expectException(DaemonConnectionException::class);129}130131Bus::dispatchSync(new RunTaskJob($task));132133if ($continueOnFailure) {134$task->refresh();135$schedule->refresh();136137$this->assertFalse($task->is_queued);138$this->assertFalse($schedule->is_processing);139$this->assertTrue(CarbonImmutable::now()->isSameAs(\DateTimeInterface::ATOM, $schedule->last_run_at));140}141}142143/**144* Test that a schedule is not executed if the server is suspended.145*146* @see https://github.com/pterodactyl/panel/issues/4008147*/148public function testTaskIsNotRunIfServerIsSuspended()149{150$server = $this->createServerModel([151'status' => Server::STATUS_SUSPENDED,152]);153154$schedule = Schedule::factory()->for($server)->create([155'last_run_at' => Carbon::now()->subHour(),156]);157158$task = Task::factory()->for($schedule)->create([159'action' => Task::ACTION_POWER,160'payload' => 'start',161]);162163Bus::dispatchSync(new RunTaskJob($task));164165$task->refresh();166$schedule->refresh();167168$this->assertFalse($task->is_queued);169$this->assertFalse($schedule->is_processing);170$this->assertTrue(Carbon::now()->isSameAs(\DateTimeInterface::ATOM, $schedule->last_run_at));171}172173public static function isManualRunDataProvider(): array174{175return [[true], [false]];176}177}178179180