Skip to content

Commit 95c5645

Browse files
Added the lastTimeSomethingHasHappenedWithIt() method to the JobExecution model/interface
1 parent 1e33080 commit 95c5645

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed

src/Contracts/JobExecution.php

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public function logInfo(string $message, array $context = []): JobExecutionLog;
4949

5050
public function logDebug(string $message, array $context = []): JobExecutionLog;
5151

52+
public function lastTimeSomethingHasHappenedWithIt(): \DateTimeInterface;
53+
5254
/** @return Collection|JobExecutionLog[] */
5355
public function getLogs(): Collection;
5456

src/Models/JobExecution.php

+14
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,20 @@ public function getUser(): ?Authenticatable
193193
return $this->user;
194194
}
195195

196+
public function lastTimeSomethingHasHappenedWithIt(): \DateTimeInterface
197+
{
198+
$lastLogEventDate = $this->logs()->max('happened_at');
199+
$dates = [
200+
$lastLogEventDate ? Carbon::parse($lastLogEventDate) : null,
201+
$this->queued_at,
202+
$this->started_at,
203+
$this->completed_at,
204+
$this->failed_at,
205+
];
206+
207+
return max(...$dates);
208+
}
209+
196210
protected function scopeOfJobClass(Builder $query, string $jobClass): Builder
197211
{
198212
return $query->where('job_class', $jobClass);

tests/JobExecutionTest.php

+89
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
namespace Konekt\History\Tests;
66

7+
use Illuminate\Support\Carbon;
78
use Illuminate\Support\Facades\Bus;
9+
use Illuminate\Support\Str;
810
use Konekt\History\JobTracker;
911
use Konekt\History\Models\JobExecution;
1012
use Konekt\History\Models\JobStatus;
@@ -82,4 +84,91 @@ public function it_can_return_the_entries_of_a_given_job_class_and_limit_the_rec
8284
$entries = JobExecution::byJobClass(SampleTrackableJob::class, false, 5);
8385
$this->assertCount(5, $entries);
8486
}
87+
88+
/** @test */
89+
public function it_returns_the_queued_at_date_as_last_time_something_has_happened_to_it_when_there_are_no_logs_and_no_other_event_dates_recorded()
90+
{
91+
JobExecution::ofJobClass(SampleTrackableJob::class)->delete();
92+
93+
/** @var JobExecution $job */
94+
$job = JobExecution::create([
95+
'job_class' => SampleTrackableJob::class,
96+
'tracking_id' => Str::ulid()->toBase58(),
97+
'queued_at' => Carbon::parse('2024-11-27 11:35:27'),
98+
]);
99+
100+
$this->assertEquals('2024-11-27 11:35:27', $job->lastTimeSomethingHasHappenedWithIt()->format('Y-m-d H:i:s'));
101+
}
102+
103+
/** @test */
104+
public function it_returns_the_started_at_date_as_last_time_something_has_happened_to_it_when_there_is_an_earlier_queued_at_date_but_there_are_no_logs_and_no_other_event_dates_recorded()
105+
{
106+
JobExecution::ofJobClass(SampleTrackableJob::class)->delete();
107+
108+
/** @var JobExecution $job */
109+
$job = JobExecution::create([
110+
'job_class' => SampleTrackableJob::class,
111+
'tracking_id' => Str::ulid()->toBase58(),
112+
'queued_at' => Carbon::parse('2024-11-27 11:35:27'),
113+
'started_at' => Carbon::parse('2024-11-27 11:35:35'),
114+
]);
115+
116+
$this->assertEquals('2024-11-27 11:35:35', $job->lastTimeSomethingHasHappenedWithIt()->format('Y-m-d H:i:s'));
117+
}
118+
119+
/** @test */
120+
public function it_returns_the_completed_at_date_as_last_time_something_has_happened_to_it_when_there_are_earlier_queued_at_and_started_at_dates_and_there_are_no_logs()
121+
{
122+
JobExecution::ofJobClass(SampleTrackableJob::class)->delete();
123+
124+
/** @var JobExecution $job */
125+
$job = JobExecution::create([
126+
'job_class' => SampleTrackableJob::class,
127+
'tracking_id' => Str::ulid()->toBase58(),
128+
'queued_at' => Carbon::parse('2024-11-27 11:35:27'),
129+
'started_at' => Carbon::parse('2024-11-27 11:35:35'),
130+
'completed_at' => Carbon::parse('2024-11-27 11:37:02'),
131+
]);
132+
133+
$this->assertEquals('2024-11-27 11:37:02', $job->lastTimeSomethingHasHappenedWithIt()->format('Y-m-d H:i:s'));
134+
}
135+
136+
/** @test */
137+
public function it_returns_the_failed_at_date_as_last_time_something_has_happened_to_it_when_there_are_earlier_queued_at_and_started_at_dates_and_there_are_no_logs()
138+
{
139+
JobExecution::ofJobClass(SampleTrackableJob::class)->delete();
140+
141+
/** @var JobExecution $job */
142+
$job = JobExecution::create([
143+
'job_class' => SampleTrackableJob::class,
144+
'tracking_id' => Str::ulid()->toBase58(),
145+
'queued_at' => Carbon::parse('2024-11-27 11:35:27'),
146+
'started_at' => Carbon::parse('2024-11-27 11:35:35'),
147+
'failed_at' => Carbon::parse('2024-11-27 11:38:18'),
148+
]);
149+
150+
$this->assertCount(0, $job->getLogs());
151+
$this->assertEquals('2024-11-27 11:38:18', $job->lastTimeSomethingHasHappenedWithIt()->format('Y-m-d H:i:s'));
152+
}
153+
154+
/** @test */
155+
public function it_returns_the_latest_log_date_when_any_of_the_log_entries_are_later_then_the_status_timestamp_fields()
156+
{
157+
JobExecution::ofJobClass(SampleTrackableJob::class)->delete();
158+
159+
Carbon::setTestNow('2024-11-27 14:00:19');
160+
/** @var JobExecution $job */
161+
$job = JobExecution::create([
162+
'job_class' => SampleTrackableJob::class,
163+
'tracking_id' => Str::ulid()->toBase58(),
164+
'queued_at' => Carbon::parse('2024-11-27 14:00:01'),
165+
'started_at' => Carbon::parse('2024-11-27 14:00:05'),
166+
'failed_at' => Carbon::parse('2024-11-27 14:00:18'),
167+
]);
168+
$job->logInfo('Some Happy Message');
169+
Carbon::setTestNow('2024-11-27 14:00:20');
170+
$job->logError('Another Error Message');
171+
172+
$this->assertEquals('2024-11-27 14:00:20', $job->lastTimeSomethingHasHappenedWithIt()->format('Y-m-d H:i:s'));
173+
}
85174
}

0 commit comments

Comments
 (0)