prophesize(Security::class); $security->isGranted('IS_AUTHENTICATED')->willReturn(false); $repo = $this->prophesize(AddressReferenceRepositoryInterface::class); $controller = new AddressReferenceAggregatedApiController($security->reveal(), $repo->reveal()); $request = new Request(query: ['q' => 'anything']); $this->expectException(AccessDeniedHttpException::class); $controller->search($request); } public function testBadRequestWhenQueryIsMissing(): void { $security = $this->prophesize(Security::class); $security->isGranted('IS_AUTHENTICATED')->willReturn(true); $repo = $this->prophesize(AddressReferenceRepositoryInterface::class); $controller = new AddressReferenceAggregatedApiController($security->reveal(), $repo->reveal()); $request = new Request(); $this->expectException(BadRequestHttpException::class); $this->expectExceptionMessage('Parameter "q" is required.'); $controller->search($request); } public function testBadRequestWhenQueryIsEmpty(): void { $security = $this->prophesize(Security::class); $security->isGranted('IS_AUTHENTICATED')->willReturn(true); $repo = $this->prophesize(AddressReferenceRepositoryInterface::class); $controller = new AddressReferenceAggregatedApiController($security->reveal(), $repo->reveal()); $request = new Request(query: ['q' => ' ']); $this->expectException(BadRequestHttpException::class); $this->expectExceptionMessage('Parameter "q" is required and cannot be empty.'); $controller->search($request); } public function testSuccessfulSearchReturnsJsonAndCallsRepositoryWithTrimmedQuery(): void { $security = $this->prophesize(Security::class); $security->isGranted('IS_AUTHENTICATED')->willReturn(true); $expectedQuery = 'foo'; $iterableResult = new \ArrayIterator([ [ 'street' => 'Main Street', 'postcode_id' => 123, 'code' => '1000', 'label' => 'Brussels', 'positions' => ['1' => '12', '2' => '14'], 'row_number' => 1, ], ]); $repo = $this->prophesize(AddressReferenceRepositoryInterface::class); $repo->findAggregatedBySearchString($expectedQuery)->willReturn($iterableResult)->shouldBeCalledOnce(); $controller = new AddressReferenceAggregatedApiController($security->reveal(), $repo->reveal()); // Provide spaces around to ensure trimming is applied $request = new Request(query: ['q' => " {$expectedQuery} "]); $response = $controller->search($request); self::assertSame(200, $response->getStatusCode()); $data = json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); self::assertIsArray($data); self::assertCount(1, $data); self::assertSame('Main Street', $data[0]['street']); self::assertSame(123, $data[0]['postcode_id']); self::assertSame('1000', $data[0]['code']); self::assertSame('Brussels', $data[0]['label']); } }