Skip to content

Commit

Permalink
Issue #526
Browse files Browse the repository at this point in the history
Aggiunti test per la validazione della configurazione degli header in un
connettore integrazione di un'applicazione.
  • Loading branch information
pintorig committed Sep 16, 2022
1 parent 16c560b commit 4404b9f
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,23 @@ Then status 400
And match response == { categoria: 'RICHIESTA', codice: 'SINTASSI', descrizione: 'Richiesta non valida', dettaglio: '#notnull' }
And match response.dettaglio contains 'Il campo regExpIuv non puo\' essere vuoto quando e\' selezionato il campo generazioneIuvInterna.'

Scenario Outline: Modifica di una applicazione (<field>)

* def applicazione = read('classpath:test/api/backoffice/v1/applicazioni/put/msg/applicazione.json')
* set applicazione.<field> = <value>

Given url backofficeBaseurl
And path 'applicazioni', idA2A
And headers basicAutenticationHeader
And request applicazione
When method put
Then status 400
And match response == { categoria: 'RICHIESTA', codice: 'SINTASSI', descrizione: 'Richiesta non valida', dettaglio: '#notnull' }
And match response.dettaglio contains <fieldName>

Examples:
| field | value | fieldName |
| servizioIntegrazione | { versioneApi: 'REST v1', url: 'http://prova.it', auth: { username: 'usr', password: 'pwd' } , headers: [ {name: null , value: 'value'}] } | 'name' |
| servizioIntegrazione | { versioneApi: 'REST v1', url: 'http://prova.it', auth: { username: 'usr', password: 'pwd' } , headers: [ {name: '#(loremIpsum)' , value: 'value'}] } | 'name' |
| servizioIntegrazione | { versioneApi: 'REST v1', url: 'http://prova.it', auth: { username: 'usr', password: 'pwd' } , headers: [ {name: 'name' , value: null}] } | 'value' |

Original file line number Diff line number Diff line change
Expand Up @@ -232,3 +232,27 @@ And match response.apiPendenze == true
And match response.apiRagioneria == true


Scenario Outline: Modifica di una applicazione (<field>)

* def applicazione = read('classpath:test/api/backoffice/v1/applicazioni/put/msg/applicazione.json')
* set applicazione.<field> = <value>
* def checkValue = <value> != null ? <value> : '#notpresent'

Given url backofficeBaseurl
And path 'applicazioni', idA2A
And headers basicAutenticationHeader
And request applicazione
When method put
Then assert responseStatus == 200 || responseStatus == 201

Given url backofficeBaseurl
And path 'applicazioni', idA2A
And headers basicAutenticationHeader
When method get
Then status 200
And match response.<field> == checkValue

Examples:
| field | value |
| servizioIntegrazione | { versioneApi: 'NETPAY v1', url: 'http://prova.it', auth: { username: 'usr', password: 'pwd' }, headers: [ {name: 'name' , value: 'value'}] } |

Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import it.govpay.core.beans.EventoContext;
import it.govpay.core.beans.EventoContext.Componente;
import it.govpay.core.exceptions.IOException;
import it.govpay.core.utils.SimpleDateFormatUtils;
import it.govpay.core.utils.client.HttpMethod;
import it.govpay.core.utils.eventi.EventiUtils;
Expand Down Expand Up @@ -143,4 +144,15 @@ protected byte[] getDumpResponse(Object responseBody) {
}
return null;
}

public static String toJSON(Object obj) throws IOException {
if(obj == null)
return null;

try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new IOException(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,21 @@
import java.util.Date;
import java.util.stream.Collectors;

import javax.xml.bind.JAXBException;

import org.apache.commons.codec.binary.Base64;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import org.xml.sax.SAXException;

import it.gov.digitpa.schemas._2011.pagamenti.CtRicevutaTelematica;
import it.gov.pagopa.pagopa_api.pa.pafornode.PaSendRTReq;
import it.govpay.core.beans.EventoContext;
import it.govpay.core.beans.EventoContext.Categoria;
import it.govpay.core.beans.EventoContext.Componente;
import it.govpay.core.exceptions.GovPayException;
import it.govpay.core.utils.SimpleDateFormatUtils;
import it.govpay.core.utils.client.INotificaClient;
import it.govpay.core.utils.client.exception.ClientException;
import it.govpay.model.Connettore;
Expand All @@ -28,6 +35,7 @@
import it.govpay.netpay.v1.model.RegisterPaymentReceipt;
import it.govpay.netpay.v1.model.RegisterPaymentResponse;
import it.govpay.netpay.v1.model.RegisterPaymentResponse.ResultEnum;
import it.govpay.pagopa.beans.utils.JaxbUtils;

public class NotificaClient extends BasicClient implements INotificaClient {

Expand Down Expand Up @@ -90,24 +98,39 @@ public byte[] invoke(Notifica notifica) throws ClientException, GovPayException
registerPaymentNotify.setCreditorTxId(iuv);
registerPaymentNotify.setDomainId(codDominio);
registerPaymentNotify.setPayStatus(PayStatusEnum.EXECUTED);

registerPaymentNotify.setPspId(this.rpt.getCodPsp());
RegisterPaymentReceipt recepit = new RegisterPaymentReceipt();
recepit.setAmountPaid(null);
recepit.setBankExecDate(null);
recepit.setBankResultCode(ccp);
recepit.setBankResultMessage(ccp);
recepit.setBankTXRefNum(ccp);


registerPaymentNotify.setReceipt(recepit);
// registerPaymentNotify.setReceiptXML(receiptXml);

byte[] dumpRequest = getDumpRequest(registerPaymentNotify);
byte[] dumpResponse = null;
HttpHeaders responseHeaders = new HttpHeaders();
HttpHeaders requestHeaders = new HttpHeaders();

try {
registerPaymentNotify.setReceiptXML(Base64.encodeBase64String(rpt.getXmlRt()));
switch (this.rpt.getVersione()) {
case SANP_230:
CtRicevutaTelematica ctRt = JaxbUtils.toRT(rpt.getXmlRt(), false);
recepit.setAmountPaid(ctRt.getDatiPagamento().getImportoTotalePagato());
recepit.setBankExecDate(SimpleDateFormatUtils.toLocalDatetime(ctRt.getDataOraMessaggioRicevuta()));
recepit.setBankResultCode(rpt.getEsitoPagamento().getCodifica() + "");
recepit.setBankResultMessage(rpt.getDescrizioneStato());
recepit.setBankTXRefNum(rpt.getCodMsgRicevuta());
break;
case SANP_240:
default:
PaSendRTReq paSendRTReq_RT = JaxbUtils.toPaSendRTReq_RT(rpt.getXmlRt(), false);
recepit.setAmountPaid(paSendRTReq_RT.getReceipt().getPaymentAmount());
recepit.setBankExecDate(SimpleDateFormatUtils.toLocalDatetime(paSendRTReq_RT.getReceipt().getPaymentDateTime()));
recepit.setBankResultCode(rpt.getEsitoPagamento().getCodifica() + "");
recepit.setBankResultMessage(rpt.getDescrizioneStato());
recepit.setBankTXRefNum(rpt.getCodMsgRicevuta());
break;
}

requestHeaders.add("x-company", this.valoreHeaderXCompany);
requestHeaders.add("x-role", this.valoreHeaderXCompany);
requestHeaders.add("Accept", "application/json");
Expand All @@ -133,7 +156,7 @@ public byte[] invoke(Notifica notifica) throws ClientException, GovPayException
ErrorReasonAgID errorReasonAgID = registerPaymentResponse.getErrorReasonAgID();
String errorMessage = registerPaymentResponse.getErrorMessage();
log.warn("Spedizione della notifica di " + notifica.getTipo() + " PAGAMENTO della transazione (" + codDominio + ")(" + iuv + ")(" + ccp + ") conclusa con esito KO: [ErrorRease: "+errorReason+", ErrorReasonAgID: "+errorReasonAgID+", ErrorMessage: "+errorMessage+"]");

throw new ClientException(errorMessage, responseCode, dumpResponse);
}
}
Expand All @@ -145,6 +168,10 @@ public byte[] invoke(Notifica notifica) throws ClientException, GovPayException

log.warn("Spedizione della notifica di " + notifica.getTipo() + " PAGAMENTO della transazione (" + codDominio + ")(" + iuv + ")(" + ccp + ") conclusa con errore: ", e.getMessage(),e);
throw new ClientException(e);
} catch (JAXBException | SAXException e) {
responseCode = 500;
log.error("Spedizione della notifica di " + notifica.getTipo() + " PAGAMENTO della transazione (" + codDominio + ")(" + iuv + ")(" + ccp + ") conclusa con errore: ", e.getMessage(),e);
throw new GovPayException(e);
} finally {
this.popolaContextEvento(responseCode, dumpRequest, dumpResponse, requestHeaders, responseHeaders);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ public enum Versione {
// Se aggiunta una nuova versione, ricordarsi di aggiornare
// il metodo getUltimaVersione.

NETPAY_REST_01("NETPAY_REST","1"),
NETPAY_REST_01("NETPAY","1"),
GP_SOAP_01("SOAP","1"),
GP_SOAP_03("SOAP","3"),
GP_REST_01("REST","1"),
GP_REST_02("REST","2");

private String api;
private String label;
public static String[] labels = {"NETPAY_REST_1", "SOAP_1","SOAP_3","REST_1","REST_2"};
public static String[] labels = {"NETPAY_1", "SOAP_1","SOAP_3","REST_1","REST_2"};

Versione(String api, String label){
this.label = label;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@ public static Connettore toDTO(List<it.govpay.orm.Connettore> connettoreLst) thr
CollectionType var = mapper.getTypeFactory().constructCollectionType(List.class, Header.class);

dto.setHeaders(mapper.readerFor(var).readValue(connettore.getValore()));
dto.setVersione(Versione.toEnum(connettore.getValore()));
} catch (JsonProcessingException e) {
throw new IOException(e.getMessage(), e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@
import it.govpay.core.dao.anagrafica.UtentiDAO;
import it.govpay.core.dao.anagrafica.dto.PutApplicazioneDTO;
import it.govpay.core.exceptions.NotAuthorizedException;
import it.govpay.core.exceptions.ValidationException;
import it.govpay.model.Acl.Servizio;
import it.govpay.model.Rpt.FirmaRichiesta;
import it.govpay.model.TipoVersamento;
import it.govpay.model.exception.CodificaInesistenteException;

public class ApplicazioniConverter {

public static PutApplicazioneDTO getPutApplicazioneDTO(ApplicazionePost applicazionePost, String idA2A, Authentication user) throws NotAuthorizedException, CodificaInesistenteException {
public static PutApplicazioneDTO getPutApplicazioneDTO(ApplicazionePost applicazionePost, String idA2A, Authentication user) throws NotAuthorizedException, CodificaInesistenteException, ValidationException {
PutApplicazioneDTO applicazioneDTO = new PutApplicazioneDTO(user);
it.govpay.bd.model.Applicazione applicazione = new it.govpay.bd.model.Applicazione();
it.govpay.bd.model.Utenza utenza = new it.govpay.bd.model.Utenza();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,21 @@
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.ArrayUtils;

import it.govpay.backoffice.v1.beans.Connector;
import it.govpay.backoffice.v1.beans.Connector.VersioneApiEnum;
import it.govpay.backoffice.v1.beans.TipoAutenticazione.TipoEnum;
import it.govpay.core.exceptions.ValidationException;
import it.govpay.model.Connettore;
import it.govpay.model.Connettore.EnumAuthType;
import it.govpay.model.Connettore.EnumSslType;
import it.govpay.model.Versionabile;
import it.govpay.model.connettori.Header;
import it.govpay.model.exception.CodificaInesistenteException;

public class ConnettoriConverter {

public static Connettore getConnettore(it.govpay.backoffice.v1.beans.Connector connector) throws CodificaInesistenteException {
public static Connettore getConnettore(it.govpay.backoffice.v1.beans.Connector connector) throws ValidationException {
Connettore connettore = new Connettore();

if(connector.getAuth() != null) {
Expand Down Expand Up @@ -51,8 +53,22 @@ public static Connettore getConnettore(it.govpay.backoffice.v1.beans.Connector c
}

connettore.setUrl(connector.getUrl());
if(connector.getVersioneApi() != null)
connettore.setVersione(Versionabile.Versione.toEnum(VersioneApiEnum.fromValue(connector.getVersioneApi()).toNameString()));
if(connector.getVersioneApi() != null) {
switch(VersioneApiEnum.fromValue(connector.getVersioneApi())) {
case NETPAY_V1:
connettore.setVersione(Versionabile.Versione.NETPAY_REST_01);
break;
case REST_V1:
connettore.setVersione(Versionabile.Versione.GP_REST_01);
break;
case REST_V2:
connettore.setVersione(Versionabile.Versione.GP_REST_02);
break;
default:
throw new ValidationException("Codifica inesistente per Servizio. Valore fornito [" + connector.getVersioneApi() + "] valori possibili " + ArrayUtils.toString(VersioneApiEnum.values()));

}
}

connettore.setHeaders(getHeaders(connector.getHeaders()));

Expand All @@ -64,8 +80,21 @@ public static Connector toRsModel(it.govpay.model.Connettore connettore) {
if(connettore.getTipoAutenticazione()!=null && !connettore.getTipoAutenticazione().equals(EnumAuthType.NONE))
rsModel.setAuth(toTipoAutenticazioneRsModel(connettore));
rsModel.setUrl(connettore.getUrl());
if(connettore.getVersione() != null)
rsModel.setVersioneApi(VersioneApiEnum.fromName(connettore.getVersione().getApiLabel()).toString());
if(connettore.getVersione() != null) {
switch (connettore.getVersione()) {
case GP_REST_01:
rsModel.setVersioneApi(VersioneApiEnum.REST_V1.toString());
break;
case GP_REST_02:
rsModel.setVersioneApi(VersioneApiEnum.REST_V2.toString());
break;
case NETPAY_REST_01:
rsModel.setVersioneApi(VersioneApiEnum.NETPAY_V1.toString());
break;
default:
break;
}
}

rsModel.setHeaders(toHeadersRsModel(connettore.getHeaders()));

Expand Down

0 comments on commit 4404b9f

Please sign in to comment.