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 @@ -3,6 +3,7 @@
namespace NieuwbouwOffice\PhpSdk;

use NieuwbouwOffice\PhpSdk\Resources\ProjectResource;
use NieuwbouwOffice\PhpSdk\Resources\UnitResource;
use NieuwbouwOffice\PhpSdk\Resources\UnitTypeResource;
use Saloon\Http\Auth\TokenAuthenticator;
use Saloon\Http\Connector;
Expand Down Expand Up @@ -38,4 +39,9 @@ public function unitTypes(string $projectUuid): UnitTypeResource
{
return new UnitTypeResource($this, $projectUuid);
}

public function units(string $projectUuid): UnitResource
{
return new UnitResource($this, $projectUuid);
}
}
21 changes: 21 additions & 0 deletions src/Requests/Units/GetUnitRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace NieuwbouwOffice\PhpSdk\Requests\Units;

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

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

public function __construct(
public string $projectUuid,
public string $uuid,
) {}

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

namespace NieuwbouwOffice\PhpSdk\Requests\Units;

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

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

public function __construct(public string $projectUuid) {}

public function resolveEndpoint(): string
{
return "/projects/{$this->projectUuid}/woningen/";
}
}
29 changes: 29 additions & 0 deletions src/Resources/UnitResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace NieuwbouwOffice\PhpSdk\Resources;

use NieuwbouwOffice\PhpSdk\Requests\Units\GetUnitRequest;
use NieuwbouwOffice\PhpSdk\Requests\Units\GetUnitsRequest;
use Saloon\Http\BaseResource;
use Saloon\Http\Connector;
use Saloon\Http\Response;

class UnitResource extends BaseResource
{
public function __construct(
Connector $connector,
protected string $projectUuid,
) {
parent::__construct($connector);
}

public function list(): Response
{
return $this->connector->send(new GetUnitsRequest($this->projectUuid));
}

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

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

expect($connector->unitTypes('proj-1'))->toBeInstanceOf(UnitTypeResource::class);
});

it('exposes the units resource for a project', function () {
$connector = new NieuwbouwOffice('test-token');

expect($connector->units('proj-1'))->toBeInstanceOf(UnitResource::class);
});
20 changes: 20 additions & 0 deletions tests/Requests/Units/GetUnitRequestTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

use NieuwbouwOffice\PhpSdk\Requests\Units\GetUnitRequest;
use Saloon\Enums\Method;

it('uses the GET method', function () {
expect((new GetUnitRequest('proj-1', 'unit-9'))->getMethod())->toBe(Method::GET);
});

it('stores the project uuid and uuid on public properties', function () {
$request = new GetUnitRequest('proj-1', 'unit-9');

expect($request->projectUuid)->toBe('proj-1')
->and($request->uuid)->toBe('unit-9');
});

it('resolves to the project-scoped woningen detail endpoint', function () {
expect((new GetUnitRequest('proj-1', 'unit-9'))->resolveEndpoint())
->toBe('/projects/proj-1/woningen/unit-9/');
});
17 changes: 17 additions & 0 deletions tests/Requests/Units/GetUnitsRequestTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

use NieuwbouwOffice\PhpSdk\Requests\Units\GetUnitsRequest;
use Saloon\Enums\Method;

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

it('stores the project uuid on a public property', function () {
expect((new GetUnitsRequest('proj-1'))->projectUuid)->toBe('proj-1');
});

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

use NieuwbouwOffice\PhpSdk\NieuwbouwOffice;
use NieuwbouwOffice\PhpSdk\Requests\Units\GetUnitRequest;
use NieuwbouwOffice\PhpSdk\Requests\Units\GetUnitsRequest;
use NieuwbouwOffice\PhpSdk\Resources\UnitResource;
use Saloon\Http\Faking\MockClient;
use Saloon\Http\Faking\MockResponse;
use Saloon\Http\Response;

it('list() sends a GetUnitsRequest scoped to the project and returns the response', function () {
$mockClient = new MockClient([
GetUnitsRequest::class => MockResponse::make([
'data' => [
['uuid' => 'u1'],
['uuid' => 'u2'],
],
]),
]);

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

$response = $connector->units('proj-1')->list();

expect($response)->toBeInstanceOf(Response::class)
->and($response->json())->toBe([
'data' => [
['uuid' => 'u1'],
['uuid' => 'u2'],
],
]);

$mockClient->assertSent(function ($request) {
return $request instanceof GetUnitsRequest
&& $request->projectUuid === 'proj-1'
&& $request->resolveEndpoint() === '/projects/proj-1/woningen/';
});
});

it('get() sends a GetUnitRequest with the right project uuid and uuid', function () {
$mockClient = new MockClient([
GetUnitRequest::class => MockResponse::make([
'uuid' => 'unit-9',
]),
]);

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

$response = $connector->units('proj-1')->get('unit-9');

expect($response)->toBeInstanceOf(Response::class)
->and($response->json())->toBe([
'uuid' => 'unit-9',
]);

$mockClient->assertSent(function ($request) {
return $request instanceof GetUnitRequest
&& $request->projectUuid === 'proj-1'
&& $request->uuid === 'unit-9'
&& $request->resolveEndpoint() === '/projects/proj-1/woningen/unit-9/';
});
});

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

expect(new UnitResource($connector, 'proj-1'))->toBeInstanceOf(UnitResource::class);
});
Loading