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\UnitTypeResource;
use Saloon\Http\Auth\TokenAuthenticator;
use Saloon\Http\Connector;
use Saloon\Traits\Plugins\AcceptsJson;
Expand Down Expand Up @@ -32,4 +33,9 @@ public function projects(): ProjectResource
{
return new ProjectResource($this);
}

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

namespace NieuwbouwOffice\PhpSdk\Requests\UnitTypes;

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

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

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

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

namespace NieuwbouwOffice\PhpSdk\Requests\UnitTypes;

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

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

public function __construct(public string $projectUuid) {}

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

namespace NieuwbouwOffice\PhpSdk\Resources;

use NieuwbouwOffice\PhpSdk\Requests\UnitTypes\GetUnitTypeRequest;
use NieuwbouwOffice\PhpSdk\Requests\UnitTypes\GetUnitTypesRequest;
use Saloon\Http\BaseResource;
use Saloon\Http\Connector;
use Saloon\Http\Response;

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

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

public function get(string $uuid): Response
{
return $this->connector->send(new GetUnitTypeRequest($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\UnitTypeResource;
use Saloon\Enums\Method;
use Saloon\Http\Auth\TokenAuthenticator;
use Saloon\Http\Connector;
Expand Down Expand Up @@ -78,3 +79,9 @@ public function resolveEndpoint(): string

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

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

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

use NieuwbouwOffice\PhpSdk\Requests\UnitTypes\GetUnitTypeRequest;
use Saloon\Enums\Method;

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

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

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

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

use NieuwbouwOffice\PhpSdk\Requests\UnitTypes\GetUnitTypesRequest;
use Saloon\Enums\Method;

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

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

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

use NieuwbouwOffice\PhpSdk\NieuwbouwOffice;
use NieuwbouwOffice\PhpSdk\Requests\UnitTypes\GetUnitTypeRequest;
use NieuwbouwOffice\PhpSdk\Requests\UnitTypes\GetUnitTypesRequest;
use NieuwbouwOffice\PhpSdk\Resources\UnitTypeResource;
use Saloon\Http\Faking\MockClient;
use Saloon\Http\Faking\MockResponse;
use Saloon\Http\Response;

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

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

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

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

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

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

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

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

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

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

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

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