diff --git a/bootstrap.php b/bootstrap.php index a510008..e7c259e 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -12,9 +12,9 @@ use Api\Core\RateLimiter\RateLimiterInterface; use Api\Core\RateLimiter\FileRateLimiter; use Api\Core\RateLimiter\InMemoryRateLimiter; use Api\Core\Log\LoggerFactory; -use ElixForms\ElixFormsClient; -use ElixForms\Auth\ElixFormsApiClient; -use ElixForms\Auth\ElixFormsAuthenticationClient; +use ElixForms\Clients\ElixFormsApiClient; +use ElixForms\Clients\ElixFormsAuthenticationClient; +use ElixForms\Clients\ElixFormsGenericClient; use Psr\Log\LoggerInterface; $container = new Container(); @@ -63,27 +63,27 @@ $container->singleton(LoggerInterface::class, function($c) { }); // ElixForms client binding -$container->singleton(ElixFormsClient::class, function($c) { +$container->singleton(ElixFormsGenericClient::class, function($c) { $config = $c->make(Config::class); $baseUrl = $config->get('elixforms_api_base_url'); - return new ElixFormsClient($baseUrl); + return new ElixFormsGenericClient($baseUrl, null); +}); + +$container->singleton(ElixFormsAuthenticationClient::class, function($c) { + $config = $c->make(Config::class); + + return new ElixFormsAuthenticationClient($config->get('elixforms_api_base_url')); +}); + +$container->singleton(ElixFormsApiClient::class, function($c) { + $config = $c->make(Config::class); + + return new ElixFormsApiClient( + $config->get('elixforms_api_base_url'), + $c->make(HttpClient::class) + ); }); -$container->singleton(ElixFormsAuthenticationClient::class, function($c) { - $config = $c->make(Config::class); - - return new ElixFormsAuthenticationClient($config->get('elixforms_api_base_url')); -}); - -$container->singleton(ElixFormsApiClient::class, function($c) { - $config = $c->make(Config::class); - - return new ElixFormsApiClient( - $config->get('elixforms_api_base_url'), - $c->make(HttpClient::class) - ); -}); - // If you have other services, bind them here, for example: // $container->singleton(SomeService::class, function($c) { // return new SomeService($c->make(LoggerInterface::class), ...); diff --git a/docs/http/test_authorization.http b/docs/http/test_authorization.http deleted file mode 100644 index d3b9a9f..0000000 --- a/docs/http/test_authorization.http +++ /dev/null @@ -1,19 +0,0 @@ -@term=MA - -GET http://localhost:8000/api/dipendenti/cerca?term={{term}} -Authorization: Basic elixforms_ws:password123 -X-API-Key: myApiAccessToken - -### - -@term=ID - -GET http://localhost:8000/api/contratti/cerca?term={{term}}&cod_fis=MMMPPL74T17E463A -Authorization: Basic elixforms_ws:password123 -X-API-Key: myApiAccessToken - -### - -@term=ID - -GET http://localhost:8000/contratti/cerca?term={{term}} diff --git a/src/Api/Controllers/V1/ElixFormsController.php b/src/Api/Controllers/V1/ElixFormsController.php index c49e642..2254a3a 100644 --- a/src/Api/Controllers/V1/ElixFormsController.php +++ b/src/Api/Controllers/V1/ElixFormsController.php @@ -4,9 +4,8 @@ namespace Api\Controllers\V1; use Api\Core\Config; use Api\Core\Request; use Api\Core\Response; -use ElixForms\Auth\ElixFormsApiClient; -use ElixForms\Auth\ElixFormsAuthenticationClient; -use ElixForms\Exceptions\ElixFormsException; +use ElixForms\Clients\ElixFormsApiClient; +use ElixForms\Clients\ElixFormsAuthenticationClient; class ElixFormsController { @@ -30,11 +29,15 @@ class ElixFormsController $moduleTag = $this->requiredString($query, 'moduleTag'); $fieldName = $this->requiredString($query, 'fieldName'); $fieldValue = $this->requiredString($query, 'fieldValue'); + $requestStatuses = $this->requiredString($query, 'requestStatuses'); $exportGroup = $this->optionalNonEmptyString($query, 'exportGroup', 'API'); if ($moduleTag === null || $fieldName === null || $fieldValue === null || $exportGroup === null) { return $res->json([ - 'error' => 'moduleTag, fieldName e fieldValue sono obbligatori; exportGroup, se specificato, deve essere una stringa non vuota.' + 'status' => 'fail', + 'data' => [ + 'parameters' => 'moduleTag, fieldName e fieldValue sono obbligatori; exportGroup, se specificato, deve essere una stringa non vuota.', + ], ], 400); } @@ -42,11 +45,31 @@ class ElixFormsController $password = $this->config->secret('elixforms_api_password'); if (!\is_string($username) || trim($username) === '' || !\is_string($password) || $password === '') { - throw new ElixFormsException('Credenziali elixForms non configurate.'); + return $res->json([ + 'status' => 'error', + 'message' => 'Credenziali elixForms non configurate.', + 'code' => 500, + ], 500); } - $token = $this->authenticationClient->login($username, $password); - $instances = $this->apiClient->lookupByStatus($moduleTag, $token, $username); + $login = $this->authenticationClient->login($username, $password); + if ($login['status'] !== 'success') { + return $this->respondWithJSendFailure($res, $login); + } + + $token = $login['data']['authToken']; + + $instancesResponse = $this->apiClient->lookupByStatus( + $moduleTag, + $token, + $username, + $requestStatuses + ); + if ($instancesResponse['status'] !== 'success') { + return $this->respondWithJSendFailure($res, $instancesResponse); + } + + $instances = $instancesResponse['data']; $matchingInstances = []; foreach ($instances as $instance) { @@ -59,13 +82,18 @@ class ElixFormsController continue; } - $exportTags = $this->apiClient->getExportTags( + $exportTagsResponse = $this->apiClient->getExportTags( $requestId, $moduleTag, $token, $username, $exportGroup ); + if ($exportTagsResponse['status'] !== 'success') { + return $this->respondWithJSendFailure($res, $exportTagsResponse); + } + + $exportTags = $exportTagsResponse['data']; $exportTagsByName = array_column($exportTags, null, 'name'); if (!\array_key_exists($fieldName, $exportTagsByName)) { @@ -80,7 +108,12 @@ class ElixFormsController } } - return $res->json($matchingInstances); + return $res->json(['status' => 'success', 'data' => $matchingInstances]); + } + + private function respondWithJSendFailure(Response $response, array $payload) + { + return $response->json($payload, $payload['status'] === 'fail' ? 400 : 502); } private function requiredString(array $values, string $key): ?string diff --git a/src/ElixForms/Auth/ElixFormsApiClient.php b/src/ElixForms/Clients/ElixFormsApiClient.php similarity index 56% rename from src/ElixForms/Auth/ElixFormsApiClient.php rename to src/ElixForms/Clients/ElixFormsApiClient.php index 1803488..775ac6e 100644 --- a/src/ElixForms/Auth/ElixFormsApiClient.php +++ b/src/ElixForms/Clients/ElixFormsApiClient.php @@ -1,8 +1,8 @@ > + * @return array{status:string,data?:array>,message?:string,code?:int} */ public function lookupByStatus( string $moduleTag, string $authToken, string $username, - ?int $status = null + ?string $requestStatuses = null ): array { $queryParts = []; - if ($status !== null) { - foreach (ElixFormsRequestStatus::toApiValues($status) as $statusValue) { + try { + foreach (ElixFormsRequestStatus::fromQueryParameter($requestStatuses) as $statusValue) { $queryParts[] = 'requestStatus=' . rawurlencode($statusValue); } + } catch (\InvalidArgumentException $exception) { + return $this->fail(['requestStatuses' => $exception->getMessage()]); } $queryParts[] = 'moduleTag=' . rawurlencode($moduleTag); $url = "{$this->baseUrl}/api/request/lookup/by-status?" . implode('&', $queryParts); $payload = $this->getJsonAsArray($url, $authToken, $username, 'LookupByStatus'); + if ($payload['status'] !== 'success') { + return $payload; + } + + $payload = $payload['data']; $requests = $payload['value']['requests'] ?? []; if (!\is_array($requests)) { - throw new ElixFormsException('Risposta LookupByStatus non valida: requests deve essere un array.'); + return $this->error('Risposta LookupByStatus non valida: requests deve essere un array.'); } - return array_values($requests); + return $this->success(array_values($requests)); } /** * @param int|string $requestId - * @return array + * @return array{status:string,data?:array,message?:string,code?:int} */ public function getExportTags( $requestId, @@ -61,7 +68,7 @@ class ElixFormsApiClient { $exportGroup = trim($exportGroup); if ($exportGroup === '') { - throw new \InvalidArgumentException('exportGroup deve essere una stringa non vuota.'); + return $this->fail(['exportGroup' => 'deve essere una stringa non vuota.']); } $url = \sprintf( @@ -72,13 +79,18 @@ class ElixFormsApiClient rawurlencode($exportGroup) ); $payload = $this->getJsonAsArray($url, $authToken, $username, 'GetExportTags'); + if ($payload['status'] !== 'success') { + return $payload; + } + + $payload = $payload['data']; $exportTags = $payload['value']['exportTags'] ?? []; if (!\is_array($exportTags)) { - throw new ElixFormsException('Risposta GetExportTags non valida: exportTags deve essere un array.'); + return $this->error('Risposta GetExportTags non valida: exportTags deve essere un array.'); } - return array_values($exportTags); + return $this->success(array_values($exportTags)); } private function getJsonAsArray( @@ -94,13 +106,9 @@ class ElixFormsApiClient 'x-api-username' => $username, ]); - $status = $response['status'] ?? 500; + $status = (int) ($response['status'] ?? 500); if ($status !== 200) { - throw new ElixFormsException(\sprintf( - 'Errore durante %s. HTTP Status: %d', - $operation, - $status - )); + return $this->error(\sprintf('Errore durante %s.', $operation), $status); } $payload = $response['json'] ?? null; @@ -111,22 +119,33 @@ class ElixFormsApiClient } if (!\is_array($payload) || $jsonError !== JSON_ERROR_NONE) { - throw new ElixFormsException(\sprintf( - 'Risposta non valida da %s: atteso JSON.', - $operation - )); + return $this->error(\sprintf('Risposta non valida da %s: atteso JSON.', $operation)); } $globalStatus = $payload['value']['globalStatus'] ?? null; if ($globalStatus === 'ERROR') { $description = $payload['value']['description'] ?? 'errore non specificato'; - throw new ElixFormsException(\sprintf( - '%s ha restituito un errore: %s', - $operation, - $description - )); + return $this->fail([ + 'operation' => $operation, + 'description' => $description, + ]); } - return $payload; + return $this->success($payload); + } + + private function success(array $data): array + { + return ['status' => 'success', 'data' => $data]; + } + + private function fail(array $data): array + { + return ['status' => 'fail', 'data' => $data]; + } + + private function error(string $message, int $code = 502): array + { + return ['status' => 'error', 'message' => $message, 'code' => $code]; } } diff --git a/src/ElixForms/Auth/ElixFormsAuthenticationClient.php b/src/ElixForms/Clients/ElixFormsAuthenticationClient.php similarity index 59% rename from src/ElixForms/Auth/ElixFormsAuthenticationClient.php rename to src/ElixForms/Clients/ElixFormsAuthenticationClient.php index 53cc627..abdb641 100644 --- a/src/ElixForms/Auth/ElixFormsAuthenticationClient.php +++ b/src/ElixForms/Clients/ElixFormsAuthenticationClient.php @@ -1,7 +1,6 @@ baseUrl}/services/api/authentication/login/v1"; try { @@ -39,23 +37,23 @@ class ElixFormsAuthenticationClient { $status = $response->getStatusCode(); if ($status !== 200) { - throw new ElixFormsException("Errore durante il login elixForms. HTTP Status: " . $status); + return $this->error('Errore durante il login elixForms.', $status); } $body = $response->getBody()->getContents(); $json = json_decode($body, true); if (json_last_error() !== JSON_ERROR_NONE || empty($json)) { - throw new ElixFormsException("Risposta non valida dal server elixForms: atteso JSON."); + return $this->error('Risposta non valida dal server elixForms: atteso JSON.'); } if (isset($json['value']['authToken'])) { - return $json['value']['authToken']; + return $this->success(['authToken' => $json['value']['authToken']]); } - throw new ElixFormsException("authToken non trovato nella risposta del login elixForms."); + return $this->fail(['authToken' => 'non trovato nella risposta del login elixForms.']); } catch (GuzzleException $e) { - throw new ElixFormsException("Errore di connessione al server elixForms: " . $e->getMessage(), 0, $e); + return $this->error('Errore di connessione al server elixForms.'); } } @@ -64,10 +62,9 @@ class ElixFormsAuthenticationClient { * * @param string $username * @param string $token - * @return bool True se il logout ha successo - * @throws ElixFormsException Se c'è un errore durante il logout + * @return array{status:string,data?:array{loggedOut:bool},message?:string,code?:int} */ - public function logout(string $username, string $token): bool { + public function logout(string $username, string $token): array { $url = "{$this->baseUrl}/services/api/authentication/" . urlencode($username) . '/logout/v1'; try { @@ -80,12 +77,24 @@ class ElixFormsAuthenticationClient { $status = $response->getStatusCode(); if ($status !== 200) { - throw new ElixFormsException("Errore durante il logout elixForms. HTTP Status: " . $status); + return $this->error('Errore durante il logout elixForms.', $status); } - return true; + return $this->success(['loggedOut' => true]); } catch (GuzzleException $e) { - throw new ElixFormsException("Errore di connessione al server elixForms: " . $e->getMessage(), 0, $e); + return $this->error('Errore di connessione al server elixForms.'); } } + + private function success(array $data): array { + return ['status' => 'success', 'data' => $data]; + } + + private function fail(array $data): array { + return ['status' => 'fail', 'data' => $data]; + } + + private function error(string $message, int $code = 502): array { + return ['status' => 'error', 'message' => $message, 'code' => $code]; + } } diff --git a/src/ElixForms/ElixFormsClient.php b/src/ElixForms/Clients/ElixFormsGenericClient.php similarity index 59% rename from src/ElixForms/ElixFormsClient.php rename to src/ElixForms/Clients/ElixFormsGenericClient.php index 83d7d21..54a1412 100644 --- a/src/ElixForms/ElixFormsClient.php +++ b/src/ElixForms/Clients/ElixFormsGenericClient.php @@ -1,12 +1,11 @@ httpClient = $httpClient ?? new Client(['timeout' => 10.0, 'http_errors' => false]); } - public function auth(): AuthClient + public function auth(): ElixFormsAuthenticationClient { - return new AuthClient($this->baseUrl, $this->httpClient); + return new ElixFormsAuthenticationClient($this->baseUrl, $this->httpClient); } public function request(string $method, string $path, ?array $body, array $headers = []): array @@ -38,15 +37,31 @@ class ElixFormsClient $contentType = $response->getHeaderLine('Content-Type'); $isJson = stripos($contentType, 'application/json') !== false; - return [ + $data = [ 'status' => $status, 'headers' => $response->getHeaders(), 'body' => $bodyRaw, 'is_json' => $isJson, 'json' => $isJson ? json_decode($bodyRaw, true) : null, ]; + + if ($status < 200 || $status >= 300) { + return $this->error('Richiesta a elixForms non riuscita.', $status); + } + + return $this->success($data); } catch (GuzzleException $e) { - throw new ElixFormsException('Errore di connessione al server elixForms: ' . $e->getMessage(), 0, $e); + return $this->error('Errore di connessione al server elixForms.'); } } + + private function success(array $data): array + { + return ['status' => 'success', 'data' => $data]; + } + + private function error(string $message, int $code = 502): array + { + return ['status' => 'error', 'message' => $message, 'code' => $code]; + } } diff --git a/src/ElixForms/Auth/ElixFormsRequestStatus.php b/src/ElixForms/Enums/ElixFormsRequestStatus.php similarity index 54% rename from src/ElixForms/Auth/ElixFormsRequestStatus.php rename to src/ElixForms/Enums/ElixFormsRequestStatus.php index 2ab0d71..7403815 100644 --- a/src/ElixForms/Auth/ElixFormsRequestStatus.php +++ b/src/ElixForms/Enums/ElixFormsRequestStatus.php @@ -1,5 +1,5 @@ */ - public static function toApiValues(int $status): array + public static function toApiValues(?int $status = self::ALL): array { if ($status <= 0 || ($status & ~self::ALL) !== 0) { throw new InvalidArgumentException('La combinazione di stati elixForms non è valida.'); @@ -43,4 +43,31 @@ final class ElixFormsRequestStatus return $values; } + + /** + * @return array + */ + public static function fromQueryParameter(?string $requestStatuses): array + { + if ($requestStatuses === null || trim($requestStatuses) === '') { + return []; + } + + $allowedValues = array_values(self::API_VALUES); + $statuses = []; + foreach (explode(',', $requestStatuses) as $requestStatus) { + $requestStatus = trim($requestStatus); + if ($requestStatus === '') { + continue; + } + + if (!in_array($requestStatus, $allowedValues, true)) { + throw new InvalidArgumentException('Lo stato elixForms richiesto non è valido.'); + } + + $statuses[] = $requestStatus; + } + + return array_values(array_unique($statuses)); + } } diff --git a/tests/Manual/api-authorization.http b/tests/Manual/api-authorization.http new file mode 100644 index 0000000..1304347 --- /dev/null +++ b/tests/Manual/api-authorization.http @@ -0,0 +1,17 @@ +# Sample requests to try out authorization logic + +### +# Authorization OK + +@term=MA + +GET http://localhost:8000/api/dipendenti/cerca?term={{term}} +Authorization: Basic elixforms_ws:password123 +X-API-Key: myApiAccessToken + +### +# Should return 401 Unauthorized + +@term=MA + +GET http://localhost:8000/api/dipendenti/cerca?term={{term}} diff --git a/tests/Manual/elixforms-instances-search.http b/tests/Manual/elixforms-instances-search.http new file mode 100644 index 0000000..98e9cca --- /dev/null +++ b/tests/Manual/elixforms-instances-search.http @@ -0,0 +1,26 @@ +# Sample requests to trigger web service + +### +# TAG not found + +GET http://localhost:8000/elixforms/instances/search?moduleTag=ANTANI&fieldName=responsabileScientifico.codiceFiscale&fieldValue=MMM + +### +# No data found (choose a TAG with very few instances...) + +GET http://localhost:8000/elixforms/instances/search?moduleTag=RequestForm_EDILIZIA_RDA_MANUTENZIONE&fieldName=responsabileScientifico.codiceFiscale&fieldValue=MMM + +### +# With one status + +GET http://localhost:8000/elixforms/instances/search?requestStatuses=PROCESSED&moduleTag=RequestForm_EDILIZIA_RDA_MANUTENZIONE&fieldName=responsabileScientifico.codiceFiscale&fieldValue=MMM + +### +# With two statuses (comma-separated) + +GET http://localhost:8000/elixforms/instances/search?requestStatuses=PROCESSED,SUBMITTED&moduleTag=RequestForm_EDILIZIA_RDA_MANUTENZIONE&fieldName=responsabileScientifico.codiceFiscale&fieldValue=MMM + +### +# With wrong status + +GET http://localhost:8000/elixforms/instances/search?requestStatuses=UNKNOWN&moduleTag=RequestForm_EDILIZIA_RDA_MANUTENZIONE&fieldName=responsabileScientifico.codiceFiscale&fieldValue=MMM diff --git a/tests/Unit/ElixFormsApiClientTest.php b/tests/Unit/ElixFormsApiClientTest.php index 29af2ed..287afae 100644 --- a/tests/Unit/ElixFormsApiClientTest.php +++ b/tests/Unit/ElixFormsApiClientTest.php @@ -2,8 +2,7 @@ namespace Tests\Unit; use Api\Core\HttpClient; -use ElixForms\Auth\ElixFormsApiClient; -use ElixForms\Auth\ElixFormsRequestStatus; +use ElixForms\Clients\ElixFormsApiClient; use PHPUnit\Framework\TestCase; final class ElixFormsApiClientTest extends TestCase @@ -32,16 +31,17 @@ final class ElixFormsApiClientTest extends TestCase }; $client = new ElixFormsApiClient('https://example.test', $httpClient); - $requests = $client->lookupByStatus('MODULO TEST', 'token', 'user'); + $response = $client->lookupByStatus('MODULO TEST', 'token', 'user'); - self::assertSame([['requestId' => 123]], $requests); + self::assertSame('success', $response['status']); + self::assertSame([['requestId' => 123]], $response['data']); self::assertStringNotContainsString('requestStatus=', $httpClient->url); self::assertStringContainsString('moduleTag=MODULO%20TEST', $httpClient->url); self::assertSame('Bearer token', $httpClient->headers['Authorization']); self::assertSame('user', $httpClient->headers['x-api-username']); } - public function testLookupByStatusExpandsCombinedFlags(): void + public function testLookupByStatusExpandsCommaSeparatedStatuses(): void { $httpClient = new class extends HttpClient { public string $url = ''; @@ -67,7 +67,7 @@ final class ElixFormsApiClientTest extends TestCase 'MODULO', 'token', 'user', - ElixFormsRequestStatus::IN_PROGRESS | ElixFormsRequestStatus::PROCESSED + 'IN_PROGRESS, PROCESSED' ); self::assertStringContainsString('requestStatus=IN_PROGRESS', $httpClient->url); @@ -75,11 +75,39 @@ final class ElixFormsApiClientTest extends TestCase self::assertStringContainsString('requestStatus=PROCESSED', $httpClient->url); } - public function testRequestStatusRejectsUnknownFlags(): void + public function testLookupByStatusOmitsStatusesWhenTheValueIsEmpty(): void { - $this->expectException(\InvalidArgumentException::class); + $httpClient = new class extends HttpClient { + public string $url = ''; - ElixFormsRequestStatus::toApiValues(8); + public function get(string $url, array $headers = []) + { + $this->url = $url; + + return [ + 'status' => 200, + 'json' => ['value' => ['globalStatus' => 'OK', 'requests' => []]], + ]; + } + }; + $client = new ElixFormsApiClient('https://example.test', $httpClient); + + $client->lookupByStatus('MODULO', 'token', 'user', ' '); + + self::assertStringNotContainsString('requestStatus=', $httpClient->url); + } + + public function testLookupByStatusReturnsFailForAnUnknownStatus(): void + { + $httpClient = new HttpClient(); + $client = new ElixFormsApiClient('https://example.test', $httpClient); + + $response = $client->lookupByStatus('MODULO', 'token', 'user', 'UNKNOWN'); + + self::assertSame([ + 'status' => 'fail', + 'data' => ['requestStatuses' => 'Lo stato elixForms richiesto non è valido.'], + ], $response); } public function testGetExportTagsSupportsVendorJsonContentTypeResponses(): void @@ -107,14 +135,15 @@ final class ElixFormsApiClientTest extends TestCase }; $client = new ElixFormsApiClient('https://example.test/', $httpClient); - $tags = $client->getExportTags(42, 'MODULO', 'token', 'user'); + $response = $client->getExportTags(42, 'MODULO', 'token', 'user'); + self::assertSame('success', $response['status']); self::assertSame( [['name' => 'contratto.id', 'value' => 'ABC-123']], - $tags + $response['data'] ); self::assertSame( - 'https://example.test/eF/services/api/request/42/view/_DEFAULT/exportTags/get/v1?moduleTag=MODULO&exportGroup=API', + 'https://example.test/services/api/request/42/view/_DEFAULT/exportTags/get/v1?moduleTag=MODULO&exportGroup=API', $httpClient->url ); } @@ -146,12 +175,34 @@ final class ElixFormsApiClientTest extends TestCase self::assertStringContainsString('exportGroup=REPORT%20ORE', $httpClient->url); } - public function testGetExportTagsRejectsAnEmptyExportGroup(): void + public function testGetExportTagsReturnsFailForAnEmptyExportGroup(): void { - $this->expectException(\InvalidArgumentException::class); - $httpClient = new HttpClient(); $client = new ElixFormsApiClient('https://example.test', $httpClient); - $client->getExportTags(42, 'MODULO', 'token', 'user', ' '); + $response = $client->getExportTags(42, 'MODULO', 'token', 'user', ' '); + + self::assertSame([ + 'status' => 'fail', + 'data' => ['exportGroup' => 'deve essere una stringa non vuota.'], + ], $response); + } + + public function testLookupByStatusReturnsErrorForAnUnsuccessfulHttpResponse(): void + { + $httpClient = new class extends HttpClient { + public function get(string $url, array $headers = []) + { + return ['status' => 503]; + } + }; + $client = new ElixFormsApiClient('https://example.test', $httpClient); + + $response = $client->lookupByStatus('MODULO', 'token', 'user'); + + self::assertSame([ + 'status' => 'error', + 'message' => 'Errore durante LookupByStatus.', + 'code' => 503, + ], $response); } } diff --git a/tests/Unit/ElixFormsControllerTest.php b/tests/Unit/ElixFormsControllerTest.php index 752aafd..954aa18 100644 --- a/tests/Unit/ElixFormsControllerTest.php +++ b/tests/Unit/ElixFormsControllerTest.php @@ -5,8 +5,8 @@ use Api\Controllers\V1\ElixFormsController; use Api\Core\Config; use Api\Core\Request; use Api\Core\Response; -use ElixForms\Auth\ElixFormsApiClient; -use ElixForms\Auth\ElixFormsAuthenticationClient; +use ElixForms\Clients\ElixFormsApiClient; +use ElixForms\Clients\ElixFormsAuthenticationClient; use PHPUnit\Framework\TestCase; final class ElixFormsControllerTest extends TestCase @@ -18,9 +18,9 @@ final class ElixFormsControllerTest extends TestCase { } - public function login(string $username, string $password): string + public function login(string $username, string $password): array { - return 'token'; + return ['status' => 'success', 'data' => ['authToken' => 'token']]; } }; $apiClient = new class extends ElixFormsApiClient { @@ -32,14 +32,18 @@ final class ElixFormsControllerTest extends TestCase string $moduleTag, string $authToken, string $username, - ?int $status = null + ?string $requestStatuses = null ): array { - return [ + if ($requestStatuses !== 'IN_PROGRESS,PROCESSED') { + throw new \RuntimeException('requestStatuses non inoltrato al client.'); + } + + return ['status' => 'success', 'data' => [ ['idDomanda' => 10], ['requestId' => 20], ['idRequest' => 30], - ]; + ]]; } public function getExportTags( @@ -69,7 +73,7 @@ final class ElixFormsControllerTest extends TestCase ], ]; - return [$tags[$requestId]]; + return ['status' => 'success', 'data' => [$tags[$requestId]]]; } }; $config = new class extends Config { @@ -85,6 +89,7 @@ final class ElixFormsControllerTest extends TestCase 'moduleTag' => 'MODULO', 'fieldName' => 'contratto.id', 'fieldValue' => 'abc-123', + 'requestStatuses' => 'IN_PROGRESS,PROCESSED', 'exportGroup' => ' CUSTOM ', ]; } @@ -97,7 +102,10 @@ final class ElixFormsControllerTest extends TestCase self::fail('La risposta avrebbe dovuto interrompere il flusso del test.'); } catch (CapturedResponseException $exception) { self::assertSame(200, $exception->status); - self::assertSame([['requestId' => 20]], $exception->payload); + self::assertSame([ + 'status' => 'success', + 'data' => [['requestId' => 20]], + ], $exception->payload); } }