Skip to content

Commit 355ff05

Browse files
authored
Implement Silenced interface (#1236)
1 parent 50f9fd9 commit 355ff05

File tree

3 files changed

+96
-1
lines changed

3 files changed

+96
-1
lines changed

src/Contracts/Silenced.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Laravel\Horizon\Contracts;
4+
5+
interface Silenced
6+
{
7+
}

src/Listeners/MarkJobAsComplete.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Laravel\Horizon\Listeners;
44

55
use Laravel\Horizon\Contracts\JobRepository;
6+
use Laravel\Horizon\Contracts\Silenced;
67
use Laravel\Horizon\Contracts\TagRepository;
78
use Laravel\Horizon\Events\JobDeleted;
89

@@ -43,7 +44,10 @@ public function __construct(JobRepository $jobs, TagRepository $tags)
4344
*/
4445
public function handle(JobDeleted $event)
4546
{
46-
$this->jobs->completed($event->payload, $event->job->hasFailed(), in_array($event->payload->commandName(), config('horizon.silenced', [])));
47+
$isSilenced = in_array($event->payload->commandName(), config('horizon.silenced', [])) ||
48+
is_a($event->payload->commandName(), Silenced::class, true);
49+
50+
$this->jobs->completed($event->payload, $event->job->hasFailed(), $isSilenced);
4751

4852
if (! $event->job->hasFailed() && count($this->tags->monitored($event->payload->tags())) > 0) {
4953
$this->jobs->remember($event->connectionName, $event->queue, $event->payload);
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
3+
namespace Laravel\Horizon\Tests\Feature\Listeners;
4+
5+
use Illuminate\Queue\Jobs\RedisJob;
6+
use Laravel\Horizon\Contracts\JobRepository;
7+
use Laravel\Horizon\Contracts\Silenced;
8+
use Laravel\Horizon\Contracts\TagRepository;
9+
use Laravel\Horizon\Events\JobDeleted;
10+
use Laravel\Horizon\JobPayload;
11+
use Laravel\Horizon\Listeners\MarkJobAsComplete;
12+
use Laravel\Horizon\Tests\IntegrationTest;
13+
use Mockery as m;
14+
15+
class MarkJobAsCompleteTest extends IntegrationTest
16+
{
17+
protected function tearDown(): void
18+
{
19+
parent::tearDown();
20+
21+
m::close();
22+
}
23+
24+
protected function getEnvironmentSetUp($app): void
25+
{
26+
parent::getEnvironmentSetUp($app);
27+
28+
$app['config']->set('horizon.silenced', [
29+
'App\\Jobs\\ConfigJob',
30+
]);
31+
}
32+
33+
public function test_it_can_mark_a_job_as_complete(): void
34+
{
35+
$this->runScenario('App\\Jobs\\TestJob', false);
36+
}
37+
38+
public function test_it_can_handle_silenced_jobs_from_the_config(): void
39+
{
40+
$this->runScenario('App\\Jobs\\ConfigJob', true);
41+
}
42+
43+
public function test_it_can_handle_silenced_jobs_from_an_interface(): void
44+
{
45+
$this->runScenario(SilencedJob::class, true);
46+
}
47+
48+
public function test_it_can_handle_jobs_which_are_not_silenced(): void
49+
{
50+
$this->runScenario(NonSilencedJob::class, false);
51+
}
52+
53+
public function runScenario(string $job, bool $silenced): void
54+
{
55+
$payload = m::mock(JobPayload::class);
56+
$payload->shouldReceive('commandName')->andReturn($job);
57+
$payload->shouldReceive('tags')->andReturn([]);
58+
59+
$job = m::mock(RedisJob::class);
60+
$job->shouldReceive('hasFailed')->andReturn(false);
61+
62+
$event = m::mock(JobDeleted::class);
63+
$event->payload = $payload;
64+
$event->job = $job;
65+
66+
$jobs = m::mock(JobRepository::class);
67+
$jobs->shouldReceive('completed')->once()->with($payload, false, $silenced);
68+
69+
$tags = m::mock(TagRepository::class);
70+
$tags->shouldReceive('monitored')->once()->with([])->andReturn([]);
71+
72+
$listener = new MarkJobAsComplete($jobs, $tags);
73+
74+
$listener->handle($event);
75+
}
76+
}
77+
78+
class SilencedJob implements Silenced
79+
{
80+
}
81+
82+
class NonSilencedJob
83+
{
84+
}

0 commit comments

Comments
 (0)