Skip to content

Commit

Permalink
Merge pull request #1099 from cultuurnet/feature/III-4873-refactor-Jo…
Browse files Browse the repository at this point in the history
…bsReadRestController

III-4873 Refactor jobs read rest controller to use PSR-7
  • Loading branch information
LucWollants authored Aug 22, 2022
2 parents 75eace8 + 0e898be commit e8b32ca
Show file tree
Hide file tree
Showing 8 changed files with 133 additions and 125 deletions.
15 changes: 5 additions & 10 deletions app/Jobs/JobsControllerProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,23 @@

namespace CultuurNet\UDB3\Silex\Jobs;

use CultuurNet\UDB3\Http\Jobs\ReadRestController;
use CultuurNet\UDB3\Http\Jobs\GetJobStatusRequestHandler;
use CultuurNet\UDB3\Http\Jobs\ResqueJobStatusFactory;
use Silex\Application;
use Silex\ControllerCollection;
use Silex\ControllerProviderInterface;

class JobsControllerProvider implements ControllerProviderInterface
{
/**
* @inheritdoc
*/
public function connect(Application $app)
public function connect(Application $app): ControllerCollection
{
$app['jobs.read_rest_controller'] = $app->share(
function (Application $app) {
return new ReadRestController(new ResqueJobStatusFactory());
}
$app[GetJobStatusRequestHandler::class] = $app->share(
fn () => new GetJobStatusRequestHandler(new ResqueJobStatusFactory())
);

/** @var ControllerCollection $controllers */
$controllers = $app['controllers_factory'];
$controllers->get('/{jobId}/', 'jobs.read_rest_controller:get');
$controllers->get('/{jobId}/', GetJobStatusRequestHandler::class);

return $controllers;
}
Expand Down
40 changes: 40 additions & 0 deletions src/Http/Jobs/GetJobStatusRequestHandler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

declare(strict_types=1);

namespace CultuurNet\UDB3\Http\Jobs;

use CultuurNet\UDB3\Http\ApiProblem\ApiProblem;
use CultuurNet\UDB3\Http\Request\RouteParameters;
use CultuurNet\UDB3\Http\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Ramsey\Uuid\Uuid;

final class GetJobStatusRequestHandler implements RequestHandlerInterface
{
private JobsStatusFactory $jobStatusFactory;

public function __construct(JobsStatusFactory $jobStatusFactory)
{
$this->jobStatusFactory = $jobStatusFactory;
}

public function handle(ServerRequestInterface $request): ResponseInterface
{
$jobId = (new RouteParameters($request))->get('jobId');

if ($jobId === Uuid::NIL) {
$jobStatus = JobStatus::complete();
} else {
$jobStatus = $this->jobStatusFactory->createFromJobId($jobId);
}

if (!$jobStatus) {
throw ApiProblem::urlNotFound('No status for job with id: ' . $jobId);
}

return new JsonResponse($jobStatus->toString());
}
}
10 changes: 10 additions & 0 deletions src/Http/Jobs/JobsStatusFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace CultuurNet\UDB3\Http\Jobs;

interface JobsStatusFactory
{
public function createFromJobId(string $jobId): ?JobStatus;
}
12 changes: 0 additions & 12 deletions src/Http/Jobs/JobsStatusFactoryInterface.php

This file was deleted.

37 changes: 0 additions & 37 deletions src/Http/Jobs/ReadRestController.php

This file was deleted.

7 changes: 3 additions & 4 deletions src/Http/Jobs/ResqueJobStatusFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@
namespace CultuurNet\UDB3\Http\Jobs;

use Resque_Job_Status;
use CultuurNet\UDB3\StringLiteral;

class ResqueJobStatusFactory implements JobsStatusFactoryInterface
class ResqueJobStatusFactory implements JobsStatusFactory
{
public function createFromJobId(StringLiteral $jobId): ?JobStatus
public function createFromJobId(string $jobId): ?JobStatus
{
$resqueJobStatus = new Resque_Job_Status($jobId->toNative());
$resqueJobStatus = new Resque_Job_Status($jobId);
$code = $resqueJobStatus->get();

if ($code) {
Expand Down
75 changes: 75 additions & 0 deletions tests/Http/Jobs/GetJobStatusRequestHandlerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

declare(strict_types=1);

namespace CultuurNet\UDB3\Http\Jobs;

use CultuurNet\UDB3\Http\ApiProblem\ApiProblem;
use CultuurNet\UDB3\Http\ApiProblem\AssertApiProblemTrait;
use CultuurNet\UDB3\Http\Request\Psr7RequestBuilder;
use CultuurNet\UDB3\Http\Response\AssertJsonResponseTrait;
use CultuurNet\UDB3\Http\Response\JsonResponse;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

final class GetJobStatusRequestHandlerTest extends TestCase
{
use AssertJsonResponseTrait;
use AssertApiProblemTrait;

/**
* @var JobsStatusFactory|MockObject
*/
private $jobsStatusFactory;

private GetJobStatusRequestHandler $getJobStatusRequestHandler;

protected function setUp(): void
{
$this->jobsStatusFactory = $this->createMock(JobsStatusFactory::class);

$this->getJobStatusRequestHandler = new GetJobStatusRequestHandler($this->jobsStatusFactory);
}

/**
* @test
*/
public function it_returns_a_json_response_for_existing_job(): void
{
$jobStatus = JobStatus::running();
$this->mockCreateFromJobId($jobStatus);

$request = (new Psr7RequestBuilder())
->withRouteParameter('jobId', '123')
->build('GET');

$response = $this->getJobStatusRequestHandler->handle($request);

$expectedResponse = new JsonResponse($jobStatus->toString());

$this->assertJsonResponse($expectedResponse, $response);
}

/**
* @test
*/
public function it_throws_an_api_problem_exception_for_missing_job(): void
{
$this->mockCreateFromJobId();

$request = (new Psr7RequestBuilder())
->withRouteParameter('jobId', '123')
->build('GET');

$this->assertCallableThrowsApiProblem(
ApiProblem::urlNotFound('No status for job with id: 123'),
fn () => $this->getJobStatusRequestHandler->handle($request)
);
}

private function mockCreateFromJobId(JobStatus $jobStatus = null): void
{
$this->jobsStatusFactory->method('createFromJobId')
->willReturn($jobStatus);
}
}
62 changes: 0 additions & 62 deletions tests/Http/Jobs/ReadRestControllerTest.php

This file was deleted.

0 comments on commit e8b32ca

Please sign in to comment.