shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toPage') ->once() ->with($listResponse, $pagination) ->andReturn($expectedPage); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAll($pagination); // THEN expect($result)->toBe($expectedPage); }); it('returns PageOf when request succeeds with sorter', function () { // GIVEN $listResponse = new IncoListResponse(); $pagination = Pagination::firstPage(); $sorter = new IncoSorter(IncoSortColumn::createdAt, \SortDirection::Ascending); $expectedPage = new PageOf( new PaginationDto(page: 1, pageSize: 50, totalItems: 1, totalPages: 1), [dummyInco()] ); $promise = new FulfilledPromise($listResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toPage') ->once() ->with($listResponse, $pagination) ->andReturn($expectedPage); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAll($pagination, $sorter); // THEN expect($result)->toBe($expectedPage); }); it('returns ApiError when request fails', function () { // GIVEN $pagination = Pagination::firstPage(); $exception = new ApiException('Internal Server Error'); $exception->setResponseStatusCode(500); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toPage'); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAll($pagination); // THEN expect($result)->toBeInstanceOf(ApiError::class); expect($result)->toBeInstanceOf(ServerError::class); expect($result->message())->toBe('Internal Server Error'); expect($result->statusCode())->toBe(500); }); }); describe('selectAllSince', function () { it('returns PageOf when request succeeds', function () { // GIVEN $listResponse = new IncoListResponse(); $pagination = Pagination::firstPage(); $since = new \DateTimeImmutable('2024-01-01'); $expectedPage = new PageOf( new PaginationDto(page: 1, pageSize: 50, totalItems: 1, totalPages: 1), [dummyInco()] ); $promise = new FulfilledPromise($listResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toPage') ->once() ->with($listResponse, $pagination) ->andReturn($expectedPage); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAllSince($pagination, $since); // THEN expect($result)->toBe($expectedPage); }); it('returns ApiError when request fails', function () { // GIVEN $pagination = Pagination::firstPage(); $since = new \DateTimeImmutable('2024-01-01'); $exception = new ApiException('Internal Server Error'); $exception->setResponseStatusCode(500); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toPage'); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAllSince($pagination, $since); // THEN expect($result)->toBeInstanceOf(ApiError::class); expect($result)->toBeInstanceOf(ServerError::class); expect($result->message())->toBe('Internal Server Error'); expect($result->statusCode())->toBe(500); }); }); describe('selectAllHavingBrands', function () { it('returns PageOf when request succeeds', function () { // GIVEN $listResponse = new IncoListResponse(); $pagination = Pagination::firstPage(); $brands = [new BrandCode('LGL39')]; $expectedPage = new PageOf( new PaginationDto(page: 1, pageSize: 50, totalItems: 1, totalPages: 1), [dummyInco()] ); $promise = new FulfilledPromise($listResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toPage') ->once() ->with($listResponse, $pagination) ->andReturn($expectedPage); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAllHavingBrands($pagination, $brands); // THEN expect($result)->toBe($expectedPage); }); it('returns PageOf when request succeeds with sorter', function () { // GIVEN $listResponse = new IncoListResponse(); $pagination = Pagination::firstPage(); $brands = [new BrandCode('LGL39')]; $sorter = new IncoSorter(IncoSortColumn::updatedAt, \SortDirection::Descending); $expectedPage = new PageOf( new PaginationDto(page: 1, pageSize: 50, totalItems: 1, totalPages: 1), [dummyInco()] ); $promise = new FulfilledPromise($listResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toPage') ->once() ->with($listResponse, $pagination) ->andReturn($expectedPage); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAllHavingBrands($pagination, $brands, $sorter); // THEN expect($result)->toBe($expectedPage); }); it('returns ApiError when request fails', function () { // GIVEN $pagination = Pagination::firstPage(); $brands = [new BrandCode('LGL39')]; $exception = new ApiException('Internal Server Error'); $exception->setResponseStatusCode(500); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toPage'); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAllHavingBrands($pagination, $brands); // THEN expect($result)->toBeInstanceOf(ApiError::class); expect($result)->toBeInstanceOf(ServerError::class); expect($result->message())->toBe('Internal Server Error'); expect($result->statusCode())->toBe(500); }); }); describe('selectAllHavingBrandsSince', function () { it('returns PageOf when request succeeds', function () { // GIVEN $listResponse = new IncoListResponse(); $pagination = Pagination::firstPage(); $since = new \DateTimeImmutable('2024-01-01'); $brands = [new BrandCode('LGL39')]; $expectedPage = new PageOf( new PaginationDto(page: 1, pageSize: 50, totalItems: 1, totalPages: 1), [dummyInco()] ); $promise = new FulfilledPromise($listResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toPage') ->once() ->with($listResponse, $pagination) ->andReturn($expectedPage); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAllHavingBrandsSince($pagination, $since, $brands); // THEN expect($result)->toBe($expectedPage); }); it('returns ApiError when request fails', function () { // GIVEN $pagination = Pagination::firstPage(); $since = new \DateTimeImmutable('2024-01-01'); $brands = [new BrandCode('LGL39')]; $exception = new ApiException('Internal Server Error'); $exception->setResponseStatusCode(500); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $incoSheetsBuilder->shouldReceive('get')->once()->andReturn($promise); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toPage'); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->selectAllHavingBrandsSince($pagination, $since, $brands); // THEN expect($result)->toBeInstanceOf(ApiError::class); expect($result)->toBeInstanceOf(ServerError::class); expect($result->message())->toBe('Internal Server Error'); expect($result->statusCode())->toBe(500); }); }); describe('findWhere', function () { it('returns PageOf when request succeeds', function () { // GIVEN $listResponse = new IncoListResponse(); $pagination = Pagination::firstPage(); $expectedPage = new PageOf( new PaginationDto(page: 1, pageSize: 50, totalItems: 1, totalPages: 1), [dummyInco()] ); $promise = new FulfilledPromise($listResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $searchBuilder = Mockery::mock(SearchRequestBuilder::class); $searchBuilder->shouldReceive('get')->once()->andReturn($promise); $incoSheetsBuilder->shouldReceive('search')->once()->andReturn($searchBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toPage') ->once() ->with($listResponse, $pagination) ->andReturn($expectedPage); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->findWhere('poulet', [], $pagination); // THEN expect($result)->toBe($expectedPage); }); it('returns PageOf when request succeeds with brands and sorter', function () { // GIVEN $listResponse = new IncoListResponse(); $pagination = Pagination::firstPage(); $brands = [new BrandCode('LGL39')]; $sorter = new IncoSorter(IncoSortColumn::id, \SortDirection::Ascending); $expectedPage = new PageOf( new PaginationDto(page: 1, pageSize: 50, totalItems: 1, totalPages: 1), [dummyInco()] ); $promise = new FulfilledPromise($listResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $searchBuilder = Mockery::mock(SearchRequestBuilder::class); $searchBuilder->shouldReceive('get')->once()->andReturn($promise); $incoSheetsBuilder->shouldReceive('search')->once()->andReturn($searchBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toPage') ->once() ->with($listResponse, $pagination) ->andReturn($expectedPage); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->findWhere('poulet', $brands, $pagination, $sorter); // THEN expect($result)->toBe($expectedPage); }); it('returns ApiError when request fails', function () { // GIVEN $pagination = Pagination::firstPage(); $exception = new ApiException('Internal Server Error'); $exception->setResponseStatusCode(500); $promise = new RejectedPromise($exception); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $searchBuilder = Mockery::mock(SearchRequestBuilder::class); $searchBuilder->shouldReceive('get')->once()->andReturn($promise); $incoSheetsBuilder->shouldReceive('search')->once()->andReturn($searchBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toPage'); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->findWhere('poulet', [], $pagination); // 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 Inco when sheet is found', function () { // GIVEN $id = new IncoId('12345'); $kiotaInco = new KiotaInco(); $itemResponse = new IncoItemResponse(); $itemResponse->setIncoSheet($kiotaInco); $expectedInco = dummyInco(); $promise = new FulfilledPromise($itemResponse); [ $incoSheetsBuilder, $apiClient, $mapper, ] = incoMocks(); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('get')->once()->andReturn($promise); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldReceive('toDto') ->once() ->with($kiotaInco) ->andReturn($expectedInco); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->find($id); // THEN expect($result)->toBe($expectedInco); }); it('returns null when sheet 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, ] = incoMocks(); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('get')->once()->andReturn($promise); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toDto'); $repository = new IncoApiRepository($apiClient, $mapper); // WHEN $result = $repository->find($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, ] = incoMocks(); $itemBuilder = Mockery::mock(WithIncoItemRequestBuilder::class); $itemBuilder->shouldReceive('get')->once()->andReturn($promise); $incoSheetsBuilder->shouldReceive('byIncoId') ->once() ->with('12345') ->andReturn($itemBuilder); $apiClient->shouldReceive('incoSheets')->once()->andReturn($incoSheetsBuilder); $mapper->shouldNotReceive('toDto'); $repository = new IncoApiRepository($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); }); }); });