Skip to content

Commit

Permalink
QA-5253: started TA impl. of e-service templates
Browse files Browse the repository at this point in the history
- Added .pom file entry that forces code generation despite the input OpenApi file not being well-formed
- Modified the pointing in the .pom file to the new OpenApi file
- Started implementing automatic tests
  • Loading branch information
Vincenzo-Massaro committed Feb 26, 2025
1 parent 8c3a444 commit b1fa580
Show file tree
Hide file tree
Showing 9 changed files with 196 additions and 3 deletions.
11 changes: 10 additions & 1 deletion interop-qa-tests/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,19 @@
</goals>
<phase>process-resources</phase>
<configuration>
<!-- FIXME 25/02/2025 al momento le APIs di e-service template non risultano ben formate
(feature non ancora rilasciata in dev), questa config serve per forzare ugualmente
la generazione del codice-->
<skipValidateSpec>true</skipValidateSpec>

<typeMappings>
<typeMapping>OffsetDateTime=java.lang.String</typeMapping>
</typeMappings>
<inputSpec>https://raw.githubusercontent.com/pagopa/interop-be-monorepo/refs/heads/develop/packages/api-clients/open-api/bffApi.yml</inputSpec>

<!-- FIXME 25/02/2025 puntamento originale da ripristinare dopo il rilascio in DEVELOP -->
<!-- <inputSpec>https://raw.githubusercontent.com/pagopa/interop-be-monorepo/refs/heads/develop/packages/api-clients/open-api/bffApi.yml</inputSpec> -->

<inputSpec>https://raw.githubusercontent.com/pagopa/interop-be-monorepo/refs/heads/feature/pin-4901_e-service-template/packages/api-clients/open-api/bffApi.yml</inputSpec>
<generatorName>java</generatorName>
<library>resttemplate</library>
<generateApiTests>false</generateApiTests>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,11 @@ public PublicKey getClientKeyById(String xCorrelationId, UUID clientId, String k

@Override
public void createKeys(String xCorrelationId, UUID clientId, List<KeySeed> keySeed) {
clientsApi.createKeys(xCorrelationId, clientId, keySeed);
keySeed.forEach(ks -> createKey(xCorrelationId, clientId, ks));
}

private void createKey(String xCorrelationId, UUID clientId, KeySeed keySeed) {
clientsApi.createKey(xCorrelationId, clientId, keySeed);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package it.pagopa.interop.e_service_template;

import it.pagopa.interop.authorization.service.utils.SettableBearerToken;
import it.pagopa.interop.generated.openapi.clients.bff.model.CreatedEServiceTemplateVersion;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTemplateSeed;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTemplateVersionDetails;
import java.util.UUID;

public interface IEServiceTemplateClient extends SettableBearerToken {
CreatedEServiceTemplateVersion createEServiceTemplate(String xCorrelationId, EServiceTemplateSeed eserviceSeed);
EServiceTemplateVersionDetails getEServiceTemplateVersion(String xCorrelationId, UUID eServiceTemplateId, UUID eServiceTemplateVersionId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package it.pagopa.interop.e_service_template.impl;

import it.pagopa.interop.conf.InteropClientConfigs;
import it.pagopa.interop.e_service_template.IEServiceTemplateClient;
import it.pagopa.interop.generated.openapi.clients.bff.ApiClient;
import it.pagopa.interop.generated.openapi.clients.bff.api.EserviceTemplatesApi;
import it.pagopa.interop.generated.openapi.clients.bff.model.CreatedEServiceTemplateVersion;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTemplateSeed;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTemplateVersionDetails;
import java.util.UUID;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class EServiceTemplateApiClientImpl implements IEServiceTemplateClient {
private final EserviceTemplatesApi eserviceTemplatesApi;
private final RestTemplate restTemplate;
private final String basePath;

public EServiceTemplateApiClientImpl(RestTemplate restTemplate, InteropClientConfigs interopClientConfigs) {
this.restTemplate = restTemplate;
this.basePath = interopClientConfigs.getBaseUrl();
this.eserviceTemplatesApi = new EserviceTemplatesApi(createApiClient("dummyBearer"));
}

private ApiClient createApiClient(String bearerToken) {
ApiClient apiClient = new ApiClient(restTemplate);
apiClient.setBasePath(basePath);
apiClient.setBearerToken(bearerToken);
return apiClient;
}

@Override
public CreatedEServiceTemplateVersion createEServiceTemplate(String xCorrelationId,
EServiceTemplateSeed eserviceSeed) {
return eserviceTemplatesApi.createEServiceTemplate(xCorrelationId, eserviceSeed);
}

@Override
public EServiceTemplateVersionDetails getEServiceTemplateVersion(String xCorrelationId,
UUID eServiceTemplateId, UUID eServiceTemplateVersionId) {
return eserviceTemplatesApi.getEServiceTemplateVersion(xCorrelationId, eServiceTemplateId,
eServiceTemplateVersionId);
}

@Override
public void setBearerToken(String bearerToken) {
this.eserviceTemplatesApi.setApiClient(createApiClient(bearerToken));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import it.pagopa.interop.delegate.service.IConsumerDelegationsApiClient;
import it.pagopa.interop.delegate.service.IDelegationApiClient;
import it.pagopa.interop.delegate.service.IProducerDelegationsApiClient;
import it.pagopa.interop.e_service_template.IEServiceTemplateClient;
import it.pagopa.interop.purpose.service.IPurposeApiClient;
import it.pagopa.interop.tenant.service.ITenantsApi;
import lombok.AllArgsConstructor;
Expand All @@ -25,6 +26,7 @@ public class ClientTokenConfigurator {
private IAttributeApiClient attributeApiClient;
private ITenantsApi tenantsApi;
private IEServiceClient eServiceClient;
private IEServiceTemplateClient eServiceTemplateClient;
private IProducerClient producerClient;
private IPurposeApiClient purposeApiClient;
private IProducerDelegationsApiClient producerDelegationsApiClient;
Expand All @@ -37,6 +39,7 @@ public void setBearerToken(String token) {
attributeApiClient.setBearerToken(token);
tenantsApi.setBearerToken(token);
eServiceClient.setBearerToken(token);
eServiceTemplateClient.setBearerToken(token);
producerClient.setBearerToken(token);
purposeApiClient.setBearerToken(token);
producerDelegationsApiClient.setBearerToken(token);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import it.pagopa.interop.authorization.service.IAuthorizationClient;
import it.pagopa.interop.authorization.service.IProducerClient;
import it.pagopa.interop.authorization.service.utils.PollingService;
import it.pagopa.interop.e_service_template.IEServiceTemplateClient;
import it.pagopa.interop.generated.openapi.clients.bff.model.AgreementPayload;
import it.pagopa.interop.generated.openapi.clients.bff.model.AgreementRejectionPayload;
import it.pagopa.interop.generated.openapi.clients.bff.model.AgreementState;
Expand All @@ -24,12 +25,15 @@
import it.pagopa.interop.generated.openapi.clients.bff.model.ClientSeed;
import it.pagopa.interop.generated.openapi.clients.bff.model.CompactUser;
import it.pagopa.interop.generated.openapi.clients.bff.model.CreatedEServiceDescriptor;
import it.pagopa.interop.generated.openapi.clients.bff.model.CreatedEServiceTemplateVersion;
import it.pagopa.interop.generated.openapi.clients.bff.model.CreatedResource;
import it.pagopa.interop.generated.openapi.clients.bff.model.DescriptorAttributesSeed;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceDescriptorState;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceMode;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceSeed;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTechnology;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTemplateSeed;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTemplateVersionDetails;
import it.pagopa.interop.generated.openapi.clients.bff.model.InlineObject3;
import it.pagopa.interop.generated.openapi.clients.bff.model.KeySeed;
import it.pagopa.interop.generated.openapi.clients.bff.model.ProducerEServiceDescriptor;
Expand Down Expand Up @@ -83,6 +87,7 @@ public class DataPreparationService {
private final IAttributeApiClient attributeApiClient;
private final ITenantsApi tenantsApi;
private final IEServiceClient eServiceClient;
private final IEServiceTemplateClient eServiceTemplateClient;
private final IProducerClient producerClient;
private final IPurposeApiClient purposeApiClient;
private final PollingService pollingService;
Expand All @@ -104,6 +109,7 @@ public DataPreparationService(ClientTokenConfigurator clientTokenConfigurator,
this.attributeApiClient = clientTokenConfigurator.getAttributeApiClient();
this.tenantsApi = clientTokenConfigurator.getTenantsApi();
this.eServiceClient = clientTokenConfigurator.getEServiceClient();
this.eServiceTemplateClient = clientTokenConfigurator.getEServiceTemplateClient();
this.producerClient = clientTokenConfigurator.getProducerClient();
this.purposeApiClient = clientTokenConfigurator.getPurposeApiClient();
this.sharedStepsContext = sharedStepsContext;
Expand Down Expand Up @@ -325,6 +331,20 @@ public void assignCertifiedAttributeToTenant(UUID tenantId, UUID attributeId) {
);
}

public EServiceTemplateVersionDetails createEServiceTemplate(EServiceTemplateSeed templateSeed) {
httpCallExecutor.performCall(() -> eServiceTemplateClient.createEServiceTemplate(sharedStepsContext.getXCorrelationId(), templateSeed));
pollingService.makePolling(
() -> httpCallExecutor.performCall(
() -> eServiceTemplateClient.getEServiceTemplateVersion(
sharedStepsContext.getXCorrelationId(),
((CreatedEServiceTemplateVersion) httpCallExecutor.getResponse()).getId(),
((CreatedEServiceTemplateVersion) httpCallExecutor.getResponse()).getVersionId())),
res -> res != HttpStatus.NOT_FOUND,
"There was an error while retrieving the e-service template"
);
return (EServiceTemplateVersionDetails) httpCallExecutor.getResponse();
}

public EServiceDescriptor createEServiceAndDraftDescriptor(EServiceSeed partialEserviceSeed, UpdateEServiceDescriptorSeed partialDescriptorSeed) {
EServiceSeed DEFAULT_ESERVICE_SEED = new EServiceSeed()
.name(String.format("e-service %d", ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@
import it.pagopa.interop.authorization.service.utils.PollingService;
import it.pagopa.interop.conf.InteropClientConfigs;
import it.pagopa.interop.config.springconfig.springconfig.InteropRestTemplateConfiguration;
import it.pagopa.interop.delegate.service.impl.ConsumerDelegationsApiClientImpl;
import it.pagopa.interop.config.springconfig.springconfig.JwtTokenServiceConfiguration;
import it.pagopa.interop.delegate.service.impl.ConsumerDelegationsApiClientImpl;
import it.pagopa.interop.delegate.service.impl.DelegationApiClientImpl;
import it.pagopa.interop.delegate.service.impl.ProducerDelegationsApiClientImpl;
import it.pagopa.interop.e_service_template.impl.EServiceTemplateApiClientImpl;
import it.pagopa.interop.purpose.RiskAnalysisDataInitializer;
import it.pagopa.interop.purpose.service.impl.PurposeApiClientImpl;
import it.pagopa.interop.tenant.service.ITenantsApi;
Expand Down Expand Up @@ -52,6 +53,7 @@
PurposeApiClientImpl.class,
IEServiceClient.class,
EServiceApiClientImpl.class,
EServiceTemplateApiClientImpl.class,
RiskAnalysisDataInitializer.class,
ClientTokenConfigurator.class,
ProducerDelegationsApiClientImpl.class,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package it.pagopa.pn.interop.cucumber.steps.e_service_template;

import io.cucumber.java.en.When;
import it.pagopa.interop.authorization.service.utils.IdentityService;
import it.pagopa.interop.authorization.service.utils.PollingService;
import it.pagopa.interop.e_service_template.IEServiceTemplateClient;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceMode;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTechnology;
import it.pagopa.interop.generated.openapi.clients.bff.model.EServiceTemplateSeed;
import it.pagopa.interop.generated.openapi.clients.bff.model.VersionSeedForEServiceTemplateCreation;
import it.pagopa.pn.interop.cucumber.steps.ClientTokenConfigurator;
import it.pagopa.pn.interop.cucumber.steps.DataPreparationService;
import it.pagopa.pn.interop.cucumber.steps.SharedStepsContext;
import java.util.concurrent.ThreadLocalRandom;
import lombok.Data;

@Data
public class EServiceTemplateSteps {
private ClientTokenConfigurator clientTokenConfigurator;
private DataPreparationService dataPreparationService;
private IdentityService identityService;
private SharedStepsContext sharedStepsContext;
private IEServiceTemplateClient eServiceTemplateClient;
private PollingService pollingService;

public EServiceTemplateSteps(ClientTokenConfigurator clientTokenConfigurator,
DataPreparationService dataPreparationService,
SharedStepsContext sharedStepsContext) {
this.clientTokenConfigurator = clientTokenConfigurator;
this.dataPreparationService = dataPreparationService;
this.sharedStepsContext = sharedStepsContext;
this.identityService = sharedStepsContext.getIdentityService();
this.eServiceTemplateClient = clientTokenConfigurator.getEServiceTemplateClient();
this.pollingService = sharedStepsContext.getPollingService();
}

@When("l'utente effettua la creazione di un e-service template")
public void createEServiceTemplate() {
clientTokenConfigurator.setBearerToken(sharedStepsContext.getUserToken());
int randomInt = ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE);
String templateName = String.format("eservice-template-%d-%d", sharedStepsContext.getTestSeed(), randomInt);
VersionSeedForEServiceTemplateCreation version = new VersionSeedForEServiceTemplateCreation()
.voucherLifespan(86400);
EServiceTemplateSeed templateSeed = new EServiceTemplateSeed()
.audienceDescription("Audience description per il template " + templateName)
.name(templateName)
.eserviceDescription("Descrizione del servizio associato al template " + templateName)
.mode(EServiceMode.DELIVER)
.version(version)
.technology(EServiceTechnology.REST);
dataPreparationService.createEServiceTemplate(templateSeed);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
@e-service-template
Feature: Test API of e-service template
#Background:
# Given l'ente "PA2" rimuove la disponibilità a ricevere deleghe in fruizione
# And l'ente "PA1" rimuove la disponibilità a ricevere deleghe in fruizione
# And l'ente "GSP2" rimuove la disponibilità a ricevere deleghe in fruizione

Scenario Outline: [INCARICATO-EST-001] La creazione di un e-service template NON può essere fatta da parte un ente NON erogatore di e-service
Given l'utente è un "<ruolo>" di "PA1"
When l'utente effettua la creazione di un e-service template
Then si ottiene status code <statusCode>
Examples:
| ruolo | statusCode |
| admin | 403 |
| api | 403 |
| security | 403 |
| api,security| 403 |
| support | 403 |

Scenario Outline: [INCARICATO-EST-002] La creazione di un e-service template può essere fatta da parte un ente erogatore di e-service in veste di ADMIN o API
Given l'utente è un "<ruolo>" di "PA1"
And "PA1" ha già creato e pubblicato 1 e-service
When l'utente effettua la creazione di un e-service template
Then si ottiene status code <statusCode>
Examples:
| ruolo | statusCode |
| admin | 200 |
| api | 200 |
| security | 403 |
| api,security| 403 |
| support | 403 |

#TODO: test in cui vengono specificati tutti i campi nella api di creazione
#TODO: test dove vengono specificati meno dei campi obbligatori nella api di creazione

#TODO test in cui vengono specificati tutti i campi nella api di creazione, oggetto Versione
#TODO: test dove vengono specificati meno dei campi obbligatori nella api di creazione, oggetto Versione

0 comments on commit b1fa580

Please sign in to comment.