Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/Handlers/DatabaseHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public function push(string $queue, string $job, array $data, ?PayloadMetadata $
return QueuePushResult::failure($e->getMessage());
}

if ($jobId === 0) {
if ($jobId === false || $jobId === 0 || ! is_numeric($jobId)) {
$err = new RuntimeException('Failed to insert job into the database.');
QueueEventManager::jobPushFailed(
handler: $this->name(),
Expand All @@ -107,7 +107,7 @@ public function push(string $queue, string $job, array $data, ?PayloadMetadata $
}

// Set the job ID for the successful push event
$queueJob->id = $jobId;
$queueJob->id = (int) $jobId;

// Emit job pushed event
QueueEventManager::jobPushed(
Expand All @@ -116,7 +116,7 @@ public function push(string $queue, string $job, array $data, ?PayloadMetadata $
job: $queueJob,
);

return QueuePushResult::success($jobId);
return QueuePushResult::success((int) $jobId);
}

/**
Expand Down
75 changes: 75 additions & 0 deletions tests/DatabaseHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,18 @@

namespace Tests;

use CodeIgniter\Events\Events;
use CodeIgniter\I18n\Time;
use CodeIgniter\Queue\Entities\QueueJob;
use CodeIgniter\Queue\Enums\Status;
use CodeIgniter\Queue\Events\QueueEventManager;
use CodeIgniter\Queue\Exceptions\QueueException;
use CodeIgniter\Queue\Handlers\DatabaseHandler;
use CodeIgniter\Queue\Models\QueueJobFailedModel;
use CodeIgniter\Queue\Models\QueueJobModel;
use CodeIgniter\Test\ReflectionHelper;
use Exception;
use ReflectionClass;
use ReflectionException;
use Tests\Support\Config\Queue as QueueConfig;
use Tests\Support\Database\Seeds\TestDatabaseQueueSeeder;
Expand All @@ -43,6 +47,13 @@ protected function setUp(): void
$this->config = config(QueueConfig::class);
}

protected function tearDown(): void
{
parent::tearDown();

Events::removeAllListeners();
}

public function testDatabaseHandler(): void
{
$handler = new DatabaseHandler($this->config);
Expand Down Expand Up @@ -93,6 +104,60 @@ public function testPush(): void
]);
}

public function testPushWhenModelReturnsFalse(): void
{
$pushedTriggered = false;
$pushFailedTriggered = false;

Events::on(QueueEventManager::JOB_PUSHED, static function () use (&$pushedTriggered): void {
$pushedTriggered = true;
});
Events::on(QueueEventManager::JOB_PUSH_FAILED, static function () use (&$pushFailedTriggered): void {
$pushFailedTriggered = true;
});

$mockModel = $this->createMock(QueueJobModel::class);
$mockModel->expects($this->once())
->method('insert')
->willReturn(false);

$handler = $this->createHandlerWithMockModel($mockModel);
$result = $handler->push('queue', 'success', ['key' => 'value']);

$this->assertFalse($result->getStatus());
$this->assertNull($result->getJobId());
$this->assertSame('Failed to insert job into the database.', $result->getError());
$this->assertFalse($pushedTriggered);
$this->assertTrue($pushFailedTriggered);
}

public function testPushWhenModelReturnsZero(): void
{
$pushedTriggered = false;
$pushFailedTriggered = false;

Events::on(QueueEventManager::JOB_PUSHED, static function () use (&$pushedTriggered): void {
$pushedTriggered = true;
});
Events::on(QueueEventManager::JOB_PUSH_FAILED, static function () use (&$pushFailedTriggered): void {
$pushFailedTriggered = true;
});

$mockModel = $this->createMock(QueueJobModel::class);
$mockModel->expects($this->once())
->method('insert')
->willReturn(0);

$handler = $this->createHandlerWithMockModel($mockModel);
$result = $handler->push('queue', 'success', ['key' => 'value']);

$this->assertFalse($result->getStatus());
$this->assertNull($result->getJobId());
$this->assertSame('Failed to insert job into the database.', $result->getError());
$this->assertFalse($pushedTriggered);
$this->assertTrue($pushFailedTriggered);
}

/**
* @throws ReflectionException
*/
Expand Down Expand Up @@ -513,4 +578,14 @@ public function testListFailed(): void
$list = $handler->listFailed('queue1');
$this->assertCount(1, $list);
}

private function createHandlerWithMockModel(QueueJobModel $mockModel): DatabaseHandler
{
$ref = new ReflectionClass(DatabaseHandler::class);
$handler = $ref->newInstanceWithoutConstructor();
$this->setPrivateProperty($handler, 'config', $this->config);
$this->setPrivateProperty($handler, 'jobModel', $mockModel);

return $handler;
}
}
Loading