toDto(new KiotaIncoCompo()); } describe('IncoCompoApiRepository', function () { describe('findFor', function () { it('returns IncoCompo when composition is found', function () { // GIVEN $id = new IncoId('12345'); $kiotaCompo = new KiotaIncoCompo(); $itemResponse = new IncoCompoItemResponse(); $itemResponse->setComposition($kiotaCompo); $expectedCompo = dummyIncoCompo(); $promise = new FulfilledPromise($itemResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoCompoMocks(); $compositionBuilder = Mockery::mock(CompositionRequestBuilder::class); $compositionBuilder->shouldReceive('get')->once()->andReturn($promise); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('composition')->once()->andReturn($compositionBuilder); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toDto') ->once() ->with($kiotaCompo) ->andReturn($expectedCompo); $repository = new IncoCompoApiRepository($apiClient, $mapper); // WHEN $result = $repository->findFor($id); // THEN expect($result)->toBe($expectedCompo); }); it('returns null when composition is not found (404)', function () { // GIVEN $id = new IncoId('12345'); $exception = new ApiException('Not Found'); $exception->setResponseStatusCode(404); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoCompoMocks(); $compositionBuilder = Mockery::mock(CompositionRequestBuilder::class); $compositionBuilder->shouldReceive('get')->once()->andReturn($promise); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('composition')->once()->andReturn($compositionBuilder); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toDto'); $repository = new IncoCompoApiRepository($apiClient, $mapper); // WHEN $result = $repository->findFor($id); // THEN expect($result)->toBeNull(); }); it('returns ApiError when request fails', function () { // GIVEN $id = new IncoId('12345'); $exception = new ApiException('Internal Server Error'); $exception->setResponseStatusCode(500); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoCompoMocks(); $compositionBuilder = Mockery::mock(CompositionRequestBuilder::class); $compositionBuilder->shouldReceive('get')->once()->andReturn($promise); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('composition')->once()->andReturn($compositionBuilder); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toDto'); $repository = new IncoCompoApiRepository($apiClient, $mapper); // WHEN $result = $repository->findFor($id); // THEN expect($result)->toBeInstanceOf(ApiError::class); expect($result)->toBeInstanceOf(ServerError::class); expect($result->message())->toBe('Internal Server Error'); expect($result->statusCode())->toBe(500); }); }); describe('find', function () { it('returns IncoCompo when composition is found', function () { // GIVEN $id = new IncoCompoId('12345'); $kiotaCompo = new KiotaIncoCompo(); $itemResponse = new IncoCompoItemResponse(); $itemResponse->setComposition($kiotaCompo); $expectedCompo = dummyIncoCompo(); $promise = new FulfilledPromise($itemResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoCompoMocks(); $compositionBuilder = Mockery::mock(CompositionRequestBuilder::class); $compositionBuilder->shouldReceive('get')->once()->andReturn($promise); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('composition')->once()->andReturn($compositionBuilder); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toDto') ->once() ->with($kiotaCompo) ->andReturn($expectedCompo); $repository = new IncoCompoApiRepository($apiClient, $mapper); // WHEN $result = $repository->find($id); // THEN expect($result)->toBe($expectedCompo); }); it('returns null when composition is not found (404)', function () { // GIVEN $id = new IncoCompoId('12345'); $exception = new ApiException('Not Found'); $exception->setResponseStatusCode(404); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoCompoMocks(); $compositionBuilder = Mockery::mock(CompositionRequestBuilder::class); $compositionBuilder->shouldReceive('get')->once()->andReturn($promise); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('composition')->once()->andReturn($compositionBuilder); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toDto'); $repository = new IncoCompoApiRepository($apiClient, $mapper); // WHEN $result = $repository->find($id); // THEN expect($result)->toBeNull(); }); it('returns ApiError when request fails', function () { // GIVEN $id = new IncoCompoId('12345'); $exception = new ApiException('Internal Server Error'); $exception->setResponseStatusCode(500); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoCompoMocks(); $compositionBuilder = Mockery::mock(CompositionRequestBuilder::class); $compositionBuilder->shouldReceive('get')->once()->andReturn($promise); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('composition')->once()->andReturn($compositionBuilder); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toDto'); $repository = new IncoCompoApiRepository($apiClient, $mapper); // WHEN $result = $repository->find($id); // THEN expect($result)->toBeInstanceOf(ApiError::class); expect($result)->toBeInstanceOf(ServerError::class); expect($result->message())->toBe('Internal Server Error'); expect($result->statusCode())->toBe(500); }); }); });