diff --git a/src/NieuwbouwOffice.php b/src/NieuwbouwOffice.php index 8c9afd4..a9664f8 100755 --- a/src/NieuwbouwOffice.php +++ b/src/NieuwbouwOffice.php @@ -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; @@ -32,4 +33,9 @@ public function projects(): ProjectResource { return new ProjectResource($this); } + + public function unitTypes(string $projectUuid): UnitTypeResource + { + return new UnitTypeResource($this, $projectUuid); + } } diff --git a/src/Requests/UnitTypes/GetUnitTypeRequest.php b/src/Requests/UnitTypes/GetUnitTypeRequest.php new file mode 100644 index 0000000..070ebc8 --- /dev/null +++ b/src/Requests/UnitTypes/GetUnitTypeRequest.php @@ -0,0 +1,21 @@ +projectUuid}/projectwoningen/{$this->uuid}/"; + } +} diff --git a/src/Requests/UnitTypes/GetUnitTypesRequest.php b/src/Requests/UnitTypes/GetUnitTypesRequest.php new file mode 100644 index 0000000..9295c20 --- /dev/null +++ b/src/Requests/UnitTypes/GetUnitTypesRequest.php @@ -0,0 +1,18 @@ +projectUuid}/projectwoningen/"; + } +} diff --git a/src/Resources/UnitTypeResource.php b/src/Resources/UnitTypeResource.php new file mode 100644 index 0000000..fe72c7f --- /dev/null +++ b/src/Resources/UnitTypeResource.php @@ -0,0 +1,29 @@ +connector->send(new GetUnitTypesRequest($this->projectUuid)); + } + + public function get(string $uuid): Response + { + return $this->connector->send(new GetUnitTypeRequest($this->projectUuid, $uuid)); + } +} diff --git a/tests/NieuwbouwOfficeTest.php b/tests/NieuwbouwOfficeTest.php index 6553d82..5a8cc9e 100644 --- a/tests/NieuwbouwOfficeTest.php +++ b/tests/NieuwbouwOfficeTest.php @@ -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; @@ -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); +}); diff --git a/tests/Requests/UnitTypes/GetUnitTypeRequestTest.php b/tests/Requests/UnitTypes/GetUnitTypeRequestTest.php new file mode 100644 index 0000000..be7bfd2 --- /dev/null +++ b/tests/Requests/UnitTypes/GetUnitTypeRequestTest.php @@ -0,0 +1,20 @@ +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/'); +}); diff --git a/tests/Requests/UnitTypes/GetUnitTypesRequestTest.php b/tests/Requests/UnitTypes/GetUnitTypesRequestTest.php new file mode 100644 index 0000000..566d471 --- /dev/null +++ b/tests/Requests/UnitTypes/GetUnitTypesRequestTest.php @@ -0,0 +1,17 @@ +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/'); +}); diff --git a/tests/Resources/UnitTypeResourceTest.php b/tests/Resources/UnitTypeResourceTest.php new file mode 100644 index 0000000..6b8c56e --- /dev/null +++ b/tests/Resources/UnitTypeResourceTest.php @@ -0,0 +1,72 @@ + 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); +});