Skip to content

Commit 413a22a

Browse files
committed
Changes to job running to clean up code
1 parent a794355 commit 413a22a

File tree

6 files changed

+84
-191
lines changed

6 files changed

+84
-191
lines changed

app/Jobs/Schedule/RunTaskJob.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace Pterodactyl\Jobs\Schedule;
44

55
use Exception;
6-
use Carbon\Carbon;
6+
use Cake\Chronos\Chronos;
77
use Pterodactyl\Jobs\Job;
88
use InvalidArgumentException;
99
use Illuminate\Queue\SerializesModels;
@@ -158,7 +158,7 @@ private function markScheduleComplete()
158158
$repository = app()->make(ScheduleRepositoryInterface::class);
159159
$repository->withoutFreshModel()->update($this->schedule, [
160160
'is_processing' => false,
161-
'last_run_at' => Carbon::now()->toDateTimeString(),
161+
'last_run_at' => Chronos::now()->toDateTimeString(),
162162
]);
163163
}
164164

app/Services/Schedules/ProcessScheduleService.php

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,48 @@
77
use Cake\Chronos\Chronos;
88
use Pterodactyl\Models\Schedule;
99
use Cake\Chronos\ChronosInterface;
10-
use Pterodactyl\Services\Schedules\Tasks\RunTaskService;
10+
use Illuminate\Contracts\Bus\Dispatcher;
11+
use Pterodactyl\Jobs\Schedule\RunTaskJob;
12+
use Pterodactyl\Contracts\Repository\TaskRepositoryInterface;
1113
use Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface;
1214

1315
class ProcessScheduleService
1416
{
1517
/**
16-
* @var \Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface
18+
* @var \Illuminate\Contracts\Bus\Dispatcher
1719
*/
18-
private $repository;
20+
private $dispatcher;
1921

2022
/**
21-
* @var \Pterodactyl\Services\Schedules\Tasks\RunTaskService
23+
* @var \DateTimeInterface|null
2224
*/
23-
private $runnerService;
25+
private $runTimeOverride;
2426

2527
/**
26-
* @var \DateTimeInterface|null
28+
* @var \Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface
2729
*/
28-
private $runTimeOverride;
30+
private $scheduleRepository;
31+
32+
/**
33+
* @var \Pterodactyl\Contracts\Repository\TaskRepositoryInterface
34+
*/
35+
private $taskRepository;
2936

3037
/**
3138
* ProcessScheduleService constructor.
3239
*
33-
* @param \Pterodactyl\Services\Schedules\Tasks\RunTaskService $runnerService
34-
* @param \Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface $repository
40+
* @param \Illuminate\Contracts\Bus\Dispatcher $dispatcher
41+
* @param \Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface $scheduleRepository
42+
* @param \Pterodactyl\Contracts\Repository\TaskRepositoryInterface $taskRepository
3543
*/
36-
public function __construct(RunTaskService $runnerService, ScheduleRepositoryInterface $repository)
37-
{
38-
$this->repository = $repository;
39-
$this->runnerService = $runnerService;
44+
public function __construct(
45+
Dispatcher $dispatcher,
46+
ScheduleRepositoryInterface $scheduleRepository,
47+
TaskRepositoryInterface $taskRepository
48+
) {
49+
$this->dispatcher = $dispatcher;
50+
$this->scheduleRepository = $scheduleRepository;
51+
$this->taskRepository = $taskRepository;
4052
}
4153

4254
/**
@@ -63,7 +75,10 @@ public function setRunTimeOverride(DateTimeInterface $time)
6375
*/
6476
public function handle(Schedule $schedule)
6577
{
66-
$this->repository->loadTasks($schedule);
78+
$this->scheduleRepository->loadTasks($schedule);
79+
80+
/** @var \Pterodactyl\Models\Task $task */
81+
$task = $schedule->getRelation('tasks')->where('sequence_id', 1)->first();
6782

6883
$formattedCron = sprintf('%s %s %s * %s',
6984
$schedule->cron_minute,
@@ -72,13 +87,16 @@ public function handle(Schedule $schedule)
7287
$schedule->cron_day_of_week
7388
);
7489

75-
$this->repository->update($schedule->id, [
90+
$this->scheduleRepository->update($schedule->id, [
7691
'is_processing' => true,
7792
'next_run_at' => $this->getRunAtTime($formattedCron),
7893
]);
7994

80-
$task = $schedule->getRelation('tasks')->where('sequence_id', 1)->first();
81-
$this->runnerService->handle($task);
95+
$this->taskRepository->update($task->id, ['is_queued' => true]);
96+
97+
$this->dispatcher->dispatch(
98+
(new RunTaskJob($task->id, $schedule->id))->delay($task->time_offset)
99+
);
82100
}
83101

84102
/**

app/Services/Schedules/Tasks/RunTaskService.php

Lines changed: 0 additions & 53 deletions
This file was deleted.

tests/Unit/Jobs/Schedule/RunTaskJobTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
namespace Tests\Unit\Jobs\Schedule;
44

55
use Mockery as m;
6-
use Carbon\Carbon;
76
use Tests\TestCase;
7+
use Cake\Chronos\Chronos;
88
use Pterodactyl\Models\Task;
99
use Pterodactyl\Models\User;
1010
use GuzzleHttp\Psr7\Response;
@@ -58,7 +58,7 @@ public function setUp()
5858
{
5959
parent::setUp();
6060
Bus::fake();
61-
Carbon::setTestNow(Carbon::now());
61+
Chronos::setTestNow(Chronos::now());
6262

6363
$this->commandRepository = m::mock(CommandRepositoryInterface::class);
6464
$this->config = m::mock(Repository::class);
@@ -94,7 +94,7 @@ public function testPowerAction()
9494

9595
$this->scheduleRepository->shouldReceive('withoutFreshModel->update')->with($schedule->id, [
9696
'is_processing' => false,
97-
'last_run_at' => Carbon::now()->toDateTimeString(),
97+
'last_run_at' => Chronos::now()->toDateTimeString(),
9898
])->once()->andReturnNull();
9999

100100
$this->getJobInstance($task->id, $schedule->id);
@@ -124,7 +124,7 @@ public function testCommandAction()
124124

125125
$this->scheduleRepository->shouldReceive('withoutFreshModel->update')->with($schedule->id, [
126126
'is_processing' => false,
127-
'last_run_at' => Carbon::now()->toDateTimeString(),
127+
'last_run_at' => Chronos::now()->toDateTimeString(),
128128
])->once()->andReturnNull();
129129

130130
$this->getJobInstance($task->id, $schedule->id);
@@ -202,7 +202,7 @@ public function testScheduleMarkedAsDisabledDoesNotProcess()
202202

203203
$this->scheduleRepository->shouldReceive('withoutFreshModel->update')->with($schedule->id, [
204204
'is_processing' => false,
205-
'last_run_at' => Carbon::now()->toDateTimeString(),
205+
'last_run_at' => Chronos::now()->toDateTimeString(),
206206
])->once()->andReturn(1);
207207

208208
$this->taskRepository->shouldReceive('update')->with($task->id, ['is_queued' => false])->once()->andReturn(1);

tests/Unit/Services/Schedules/ProcessScheduleServiceTest.php

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,28 @@
88
use Cake\Chronos\Chronos;
99
use Pterodactyl\Models\Task;
1010
use Pterodactyl\Models\Schedule;
11-
use Pterodactyl\Services\Schedules\Tasks\RunTaskService;
11+
use Illuminate\Contracts\Bus\Dispatcher;
12+
use Pterodactyl\Jobs\Schedule\RunTaskJob;
1213
use Pterodactyl\Services\Schedules\ProcessScheduleService;
14+
use Pterodactyl\Contracts\Repository\TaskRepositoryInterface;
1315
use Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface;
1416

1517
class ProcessScheduleServiceTest extends TestCase
1618
{
1719
/**
18-
* @var \Cron\CronExpression|\Mockery\Mock
20+
* @var \Illuminate\Contracts\Bus\Dispatcher|\Mockery\Mock
1921
*/
20-
protected $cron;
22+
private $dispatcher;
2123

2224
/**
2325
* @var \Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface|\Mockery\Mock
2426
*/
25-
protected $repository;
27+
private $scheduleRepository;
2628

2729
/**
28-
* @var \Pterodactyl\Services\Schedules\Tasks\RunTaskService|\Mockery\Mock
30+
* @var \Pterodactyl\Contracts\Repository\TaskRepositoryInterface|\Mockery\Mock
2931
*/
30-
protected $runnerService;
31-
32-
/**
33-
* @var \Pterodactyl\Services\Schedules\ProcessScheduleService
34-
*/
35-
protected $service;
32+
private $taskRepository;
3633

3734
/**
3835
* Setup tests.
@@ -42,11 +39,9 @@ public function setUp()
4239
parent::setUp();
4340

4441
Chronos::setTestNow(Chronos::now());
45-
46-
$this->repository = m::mock(ScheduleRepositoryInterface::class);
47-
$this->runnerService = m::mock(RunTaskService::class);
48-
49-
$this->service = new ProcessScheduleService($this->runnerService, $this->repository);
42+
$this->dispatcher = m::mock(Dispatcher::class);
43+
$this->scheduleRepository = m::mock(ScheduleRepositoryInterface::class);
44+
$this->taskRepository = m::mock(TaskRepositoryInterface::class);
5045
}
5146

5247
/**
@@ -59,17 +54,26 @@ public function testScheduleIsUpdatedAndRun()
5954
'sequence_id' => 1,
6055
])]));
6156

62-
$this->repository->shouldReceive('loadTasks')->with($model)->once()->andReturn($model);
57+
$this->scheduleRepository->shouldReceive('loadTasks')->with($model)->once()->andReturn($model);
6358

6459
$formatted = sprintf('%s %s %s * %s', $model->cron_minute, $model->cron_hour, $model->cron_day_of_month, $model->cron_day_of_week);
65-
$this->repository->shouldReceive('update')->with($model->id, [
60+
$this->scheduleRepository->shouldReceive('update')->with($model->id, [
6661
'is_processing' => true,
6762
'next_run_at' => Chronos::parse(CronExpression::factory($formatted)->getNextRunDate()->format(Chronos::ATOM)),
6863
]);
6964

70-
$this->runnerService->shouldReceive('handle')->with($task)->once()->andReturnNull();
65+
$this->taskRepository->shouldReceive('update')->with($task->id, ['is_queued' => true])->once();
66+
67+
$this->dispatcher->shouldReceive('dispatch')->with(m::on(function ($class) use ($model, $task) {
68+
$this->assertInstanceOf(RunTaskJob::class, $class);
69+
$this->assertSame($task->time_offset, $class->delay);
70+
$this->assertSame($task->id, $class->task);
71+
$this->assertSame($model->id, $class->schedule);
7172

72-
$this->service->handle($model);
73+
return true;
74+
}))->once();
75+
76+
$this->getService()->handle($model);
7377
$this->assertTrue(true);
7478
}
7579

@@ -80,16 +84,30 @@ public function testScheduleRunTimeCanBeOverridden()
8084
'sequence_id' => 1,
8185
])]));
8286

83-
$this->repository->shouldReceive('loadTasks')->with($model)->once()->andReturn($model);
87+
$this->scheduleRepository->shouldReceive('loadTasks')->with($model)->once()->andReturn($model);
8488

85-
$this->repository->shouldReceive('update')->with($model->id, [
89+
$this->scheduleRepository->shouldReceive('update')->with($model->id, [
8690
'is_processing' => true,
8791
'next_run_at' => Chronos::now()->addSeconds(15),
8892
]);
8993

90-
$this->runnerService->shouldReceive('handle')->with($task)->once()->andReturnNull();
94+
$this->taskRepository->shouldReceive('update')->with($task->id, ['is_queued' => true])->once();
95+
96+
$this->dispatcher->shouldReceive('dispatch')->with(m::on(function ($class) use ($model, $task) {
97+
$this->assertInstanceOf(RunTaskJob::class, $class);
98+
$this->assertSame($task->time_offset, $class->delay);
99+
$this->assertSame($task->id, $class->task);
100+
$this->assertSame($model->id, $class->schedule);
101+
102+
return true;
103+
}))->once();
91104

92-
$this->service->setRunTimeOverride(Chronos::now()->addSeconds(15))->handle($model);
105+
$this->getService()->setRunTimeOverride(Chronos::now()->addSeconds(15))->handle($model);
93106
$this->assertTrue(true);
94107
}
108+
109+
private function getService(): ProcessScheduleService
110+
{
111+
return new ProcessScheduleService($this->dispatcher, $this->scheduleRepository, $this->taskRepository);
112+
}
95113
}

0 commit comments

Comments
 (0)