Skip to content

Commit 8a4278f

Browse files
committed
Improve coverage for FailedJobsListener
1 parent a45cb20 commit 8a4278f

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

tests/TestCase/Listener/FailedJobsListenerTest.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,12 @@
1818

1919
use Cake\Event\Event;
2020
use Cake\Event\EventManager;
21+
use Cake\ORM\Entity;
22+
use Cake\ORM\Exception\PersistenceFailedException;
23+
use Cake\ORM\Locator\TableLocator;
2124
use Cake\Queue\Job\Message;
2225
use Cake\Queue\Listener\FailedJobsListener;
26+
use Cake\Queue\Model\Table\FailedJobsTable;
2327
use Cake\Queue\QueueManager;
2428
use Cake\TestSuite\TestCase;
2529
use Enqueue\Null\NullConnectionFactory;
@@ -92,4 +96,75 @@ public function testFailedJobIsAddedWhenEventIsFired()
9296
$this->assertSame('example_queue', $failedJob->queue);
9397
$this->assertStringContainsString('some message', $failedJob->exception);
9498
}
99+
100+
/**
101+
* Data provider for testStoreFailedJobException
102+
*
103+
* @return array[]
104+
*/
105+
public function storeFailedJobExceptionDataProvider()
106+
{
107+
return [
108+
[['exception' => 'some message'], '`logger` was not defined on Consumption.LimitAttemptsExtension.failed event'],
109+
[['exception' => 'some message', 'logger' => new \stdClass()], '`logger` is not an instance of `LoggerInterface` on Consumption.LimitAttemptsExtension.failed event.'],
110+
];
111+
}
112+
113+
/**
114+
* @dataProvider storeFailedJobExceptionDataProvider
115+
* @return void
116+
*/
117+
public function testStoreFailedJobException($eventData, $exceptionMessage)
118+
{
119+
$tableLocator = $this
120+
->getMockBuilder(TableLocator::class)
121+
->onlyMethods(['get'])
122+
->getMock();
123+
$failedJobsTable = $this
124+
->getMockBuilder(FailedJobsTable::class)
125+
->onlyMethods(['saveOrFail'])
126+
->getMock();
127+
$failedJobsListener = $this
128+
->getMockBuilder(FailedJobsListener::class)
129+
->onlyMethods(['getTableLocator'])
130+
->getMock();
131+
$failedJobsTable->expects($this->once())
132+
->method('saveOrFail')
133+
->willThrowException(new PersistenceFailedException(new Entity(), 'Persistence Failed'));
134+
$tableLocator->expects($this->once())
135+
->method('get')
136+
->with('Cake/Queue.FailedJobs')
137+
->willReturn($failedJobsTable);
138+
$failedJobsListener->expects($this->once())
139+
->method('getTableLocator')
140+
->willReturn($tableLocator);
141+
142+
$parsedBody = [
143+
'class' => [LogToDebugJob::class, 'execute'],
144+
'data' => ['example_key' => 'example_value'],
145+
'requeueOptions' => [
146+
'config' => 'example_config',
147+
'priority' => 'example_priority',
148+
'queue' => 'example_queue',
149+
],
150+
];
151+
$messageBody = json_encode($parsedBody);
152+
$connectionFactory = new NullConnectionFactory();
153+
154+
$context = $connectionFactory->createContext();
155+
$originalMessage = new NullMessage($messageBody);
156+
$message = new Message($originalMessage, $context);
157+
158+
$event = new Event(
159+
'Consumption.LimitAttemptsExtension.failed',
160+
$message,
161+
$eventData
162+
);
163+
164+
$this->expectException(\RuntimeException::class);
165+
$this->expectExceptionMessage($exceptionMessage);
166+
167+
EventManager::instance()->on($failedJobsListener);
168+
EventManager::instance()->dispatch($event);
169+
}
95170
}

0 commit comments

Comments
 (0)