Skip to content
Merged
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: 6 additions & 0 deletions src/NieuwbouwOffice.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace NieuwbouwOffice\PhpSdk;

use NieuwbouwOffice\PhpSdk\Resources\ProjectResource;
use Saloon\Http\Auth\TokenAuthenticator;
use Saloon\Http\Connector;
use Saloon\Traits\Plugins\AcceptsJson;
Expand All @@ -26,4 +27,9 @@ protected function defaultAuth(): TokenAuthenticator
{
return new TokenAuthenticator($this->token, 'apikey');
}

public function projects(): ProjectResource
{
return new ProjectResource($this);
}
}
18 changes: 18 additions & 0 deletions src/Requests/Projects/GetProjectRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace NieuwbouwOffice\PhpSdk\Requests\Projects;

use Saloon\Enums\Method;
use Saloon\Http\Request;

class GetProjectRequest extends Request
{
protected Method $method = Method::GET;

public function __construct(public string $uuid) {}

public function resolveEndpoint(): string
{
return "/projects/{$this->uuid}/";
}
}
16 changes: 16 additions & 0 deletions src/Requests/Projects/GetProjectsRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace NieuwbouwOffice\PhpSdk\Requests\Projects;

use Saloon\Enums\Method;
use Saloon\Http\Request;

class GetProjectsRequest extends Request
{
protected Method $method = Method::GET;

public function resolveEndpoint(): string
{
return '/projects/';
}
}
21 changes: 21 additions & 0 deletions src/Resources/ProjectResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace NieuwbouwOffice\PhpSdk\Resources;

use NieuwbouwOffice\PhpSdk\Requests\Projects\GetProjectRequest;
use NieuwbouwOffice\PhpSdk\Requests\Projects\GetProjectsRequest;
use Saloon\Http\BaseResource;
use Saloon\Http\Response;

class ProjectResource extends BaseResource
{
public function list(): Response
{
return $this->connector->send(new GetProjectsRequest);
}

public function get(string $uuid): Response
{
return $this->connector->send(new GetProjectRequest($uuid));
}
}
7 changes: 7 additions & 0 deletions tests/NieuwbouwOfficeTest.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use NieuwbouwOffice\PhpSdk\NieuwbouwOffice;
use NieuwbouwOffice\PhpSdk\Resources\ProjectResource;
use Saloon\Enums\Method;
use Saloon\Http\Auth\TokenAuthenticator;
use Saloon\Http\Connector;
Expand Down Expand Up @@ -71,3 +72,9 @@ public function resolveEndpoint(): string

expect($pendingRequest->headers()->get('Accept'))->toBe('application/json');
});

it('exposes the projects resource', function () {
$connector = new NieuwbouwOffice('test-token');

expect($connector->projects())->toBeInstanceOf(ProjectResource::class);
});
17 changes: 17 additions & 0 deletions tests/Requests/Projects/GetProjectRequestTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

use NieuwbouwOffice\PhpSdk\Requests\Projects\GetProjectRequest;
use Saloon\Enums\Method;

it('uses the GET method', function () {
expect((new GetProjectRequest('abc-123'))->getMethod())->toBe(Method::GET);
});

it('stores the uuid on a public property', function () {
expect((new GetProjectRequest('abc-123'))->uuid)->toBe('abc-123');
});

it('resolves to the /projects/{uuid}/ endpoint', function () {
expect((new GetProjectRequest('abc-123'))->resolveEndpoint())
->toBe('/projects/abc-123/');
});
12 changes: 12 additions & 0 deletions tests/Requests/Projects/GetProjectsRequestTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

use NieuwbouwOffice\PhpSdk\Requests\Projects\GetProjectsRequest;
use Saloon\Enums\Method;

it('uses the GET method', function () {
expect((new GetProjectsRequest)->getMethod())->toBe(Method::GET);
});

it('resolves to the /projects/ endpoint', function () {
expect((new GetProjectsRequest)->resolveEndpoint())->toBe('/projects/');
});
67 changes: 67 additions & 0 deletions tests/Resources/ProjectResourceTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

use NieuwbouwOffice\PhpSdk\NieuwbouwOffice;
use NieuwbouwOffice\PhpSdk\Requests\Projects\GetProjectRequest;
use NieuwbouwOffice\PhpSdk\Requests\Projects\GetProjectsRequest;
use NieuwbouwOffice\PhpSdk\Resources\ProjectResource;
use Saloon\Http\Faking\MockClient;
use Saloon\Http\Faking\MockResponse;
use Saloon\Http\Response;

it('list() sends a GetProjectsRequest and returns the response', function () {
$mockClient = new MockClient([
GetProjectsRequest::class => MockResponse::make([
'data' => [
['uuid' => 'a', 'name' => 'Project A'],
['uuid' => 'b', 'name' => 'Project B'],
],
]),
]);

$connector = new NieuwbouwOffice('test-token');
$connector->withMockClient($mockClient);

$response = $connector->projects()->list();

expect($response)->toBeInstanceOf(Response::class)
->and($response->json())->toBe([
'data' => [
['uuid' => 'a', 'name' => 'Project A'],
['uuid' => 'b', 'name' => 'Project B'],
],
]);

$mockClient->assertSent(GetProjectsRequest::class);
});

it('get() sends a GetProjectRequest with the given uuid and returns the response', function () {
$mockClient = new MockClient([
GetProjectRequest::class => MockResponse::make([
'uuid' => 'abc-123',
'name' => 'Project ABC',
]),
]);

$connector = new NieuwbouwOffice('test-token');
$connector->withMockClient($mockClient);

$response = $connector->projects()->get('abc-123');

expect($response)->toBeInstanceOf(Response::class)
->and($response->json())->toBe([
'uuid' => 'abc-123',
'name' => 'Project ABC',
]);

$mockClient->assertSent(function ($request) {
return $request instanceof GetProjectRequest
&& $request->uuid === 'abc-123'
&& $request->resolveEndpoint() === '/projects/abc-123/';
});
});

it('can be instantiated directly with a connector', function () {
$connector = new NieuwbouwOffice('test-token');

expect(new ProjectResource($connector))->toBeInstanceOf(ProjectResource::class);
});