diff --git a/features/agreement/step_definitions/agreement-creation.ts b/features/agreement/step_definitions/agreement-creation.ts index dcc20d7d..ccd5ed25 100644 --- a/features/agreement/step_definitions/agreement-creation.ts +++ b/features/agreement/step_definitions/agreement-creation.ts @@ -135,9 +135,11 @@ Given( async function (tenantType: TenantType) { assertContextSchema(this, { eserviceId: z.string(), + descriptorId: z.string().optional(), }); const token = await getToken(tenantType); + this.oldDescriptorId = this.descriptorId; this.descriptorId = await dataPreparationService.createNextDraftDescriptor( token, this.eserviceId diff --git a/features/voucher/step_definitions/voucher-generation-eservice.ts b/features/voucher/step_definitions/voucher-generation-eservice.ts new file mode 100644 index 00000000..4638036e --- /dev/null +++ b/features/voucher/step_definitions/voucher-generation-eservice.ts @@ -0,0 +1,109 @@ +import { Given, Then } from "@cucumber/cucumber"; +import { z } from "zod"; +import { + assertContextSchema, + getToken, + TenantType, +} from "../../../utils/commons"; +import { dataPreparationService } from "../../../services/data-preparation.service"; + +Given( + "{string} ha già una nuova versione in stato DRAFT per quell'e-service", + async function (tenantType: TenantType) { + assertContextSchema(this, { + eserviceId: z.string(), + }); + const token = await getToken(tenantType); + + const descriptorId = await dataPreparationService.createNextDraftDescriptor( + token, + this.eserviceId + ); + this.descriptorId = descriptorId; + + await dataPreparationService.bringDescriptorToGivenState({ + token, + eserviceId: this.eserviceId, + descriptorId, + descriptorState: "DRAFT", + }); + } +); + +Given( + "{string} ha già attivato nuovamente quell'e-service", + async function (tenantType: TenantType) { + assertContextSchema(this, { + eserviceId: z.string(), + descriptorId: z.string(), + }); + + const token = await getToken(tenantType); + + await dataPreparationService.activateDescriptor( + token, + this.eserviceId, + this.descriptorId + ); + } +); + +Given( + "{string} ha già sospeso la vecchia versione di quell'e-service", + async function (tenant: TenantType) { + assertContextSchema(this, { + eserviceId: z.string(), + oldDescriptorId: z.string(), + }); + const token = await getToken(tenant); + this.response = await dataPreparationService.suspendDescriptor( + token, + this.eserviceId, + this.oldDescriptorId + ); + } +); + +Given( + "{string} ha già attivato nuovamente la vecchia versione quell'e-service", + async function (tenantType: TenantType) { + assertContextSchema(this, { + eserviceId: z.string(), + oldDescriptorId: z.string(), + }); + + const token = await getToken(tenantType); + + await dataPreparationService.activateDescriptor( + token, + this.eserviceId, + this.oldDescriptorId + ); + } +); + +Then( + "la richiesta di generazione del Voucher non va a buon fine", + async function () { + assertContextSchema(this, { + response: z.object({ + data: z.object({ + correlationId: z.string().uuid(), + errors: z.tuple([ + z.object({ + code: z.literal("015-0008"), + detail: z.literal( + "Unable to generate a token for the given request" + ), + }), + ]), + status: z.literal(400), + title: z.literal( + "The request contains bad syntax or cannot be fulfilled." + ), + type: z.literal("about:blank"), + }), + }), + }); + } +); diff --git a/features/voucher/step_definitions/voucher-generation.ts b/features/voucher/step_definitions/voucher-generation.ts index 3224c7e9..a865971a 100644 --- a/features/voucher/step_definitions/voucher-generation.ts +++ b/features/voucher/step_definitions/voucher-generation.ts @@ -25,12 +25,10 @@ When("l'utente richiede la generazione del voucher", async function () { privateKey, }); - const result = await requestVoucher({ + this.response = await requestVoucher({ clientId, clientAssertion, }); - - this.result = result; }); When( @@ -54,21 +52,22 @@ When( includeDigest: true, }); - const result = await requestVoucher({ + this.response = await requestVoucher({ clientId, clientAssertion, }); - - this.result = result; } ); Then("si ottiene la corretta generazione del voucher", async function () { assertContextSchema(this, { - result: z.object({ - access_token: z.string(), - expires_in: z.number(), - token_type: z.literal("Bearer"), + response: z.object({ + data: z.object({ + access_token: z.string(), + expires_in: z.number(), + token_type: z.literal("Bearer"), + }), + status: z.literal(200), }), }); }); diff --git a/features/voucher/voucher-generation-eservice.feature b/features/voucher/voucher-generation-eservice.feature new file mode 100644 index 00000000..845e97b5 --- /dev/null +++ b/features/voucher/voucher-generation-eservice.feature @@ -0,0 +1,185 @@ +@voucher_generation_eservice +Feature: Generazione del voucher richiesta da un Ente + + @voucher_generation_eservice1 + Scenario Outline: La generazione del Voucher va a buon fine per una Versione deprecata dell'EService + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + Given "PA2" ha già pubblicato una nuova versione per quell'e-service + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + + @voucher_generation_eservice2 + Scenario Outline: La generazione del Voucher va a buon fine per una Versione pubblicata dell'EService, quando esiste una versione precedente deprecata + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "GSP" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA2" ha già pubblicato una nuova versione per quell'e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + + @voucher_generation_eservice3 + Scenario Outline: La generazione del Voucher va a buon fine per una Versione pubblicata dell'EService, quando la precedente è stata archiviata in seguito alla pubblicazione + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA2" ha già pubblicato una nuova versione per quell'e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + + @voucher_generation_eservice4 + Scenario Outline: La generazione del Voucher va a buon fine per una Versione pubblicata dell'EService, quando esiste una Versione precedente sospesa + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "GSP" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA2" ha già sospeso quell'e-service + Given "PA2" ha già pubblicato una nuova versione per quell'e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + + @voucher_generation_eservice5 + Scenario Outline: La generazione del Voucher va a buon fine per una Versione deprecata dell'EService quando la Versione più recente è sospesa + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + Given "PA2" ha già pubblicato una nuova versione per quell'e-service + Given "PA2" ha già sospeso quell'e-service + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + + @voucher_generation_eservice6 + Scenario Outline: La generazione del Voucher va a buon fine per una Versione pubblicata dell'EService quando esiste una Versione più recente in bozza + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + Given "PA2" ha già una nuova versione in stato DRAFT per quell'e-service + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + + @voucher_generation_eservice7 + Scenario Outline: La generazione del Voucher va a buon fine per una Versione sospesa e poi riattivata dell'EService + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + Given "PA2" ha già sospeso quell'e-service + Given "PA2" ha già attivato nuovamente quell'e-service + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + + @voucher_generation_eservice8 + Scenario Outline: La generazione del Voucher va a buon fine per una Versione deprecata dell'EService che viene sospesa e poi riattivata + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + Given "PA2" ha già pubblicato una nuova versione per quell'e-service + Given "PA2" ha già sospeso la vecchia versione di quell'e-service + Given "PA2" ha già attivato nuovamente la vecchia versione quell'e-service + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + + @voucher_generation_eservice9 + Scenario Outline: La generazione del Voucher fallisce per una Versione sospesa dell'EService quando esiste una Versione più recente in bozza + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + Given "PA2" ha già sospeso quell'e-service + Given "PA2" ha già una nuova versione in stato DRAFT per quell'e-service + When l'utente richiede la generazione del voucher + Then la richiesta di generazione del Voucher non va a buon fine + + @voucher_generation_eservice10 + Scenario Outline: La generazione del Voucher fallisce per una Versione sospesa dell'EService quando esiste una Versione precedente deprecata + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "GSP" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA2" ha già pubblicato una nuova versione per quell'e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + Given "PA2" ha già sospeso quell'e-service + When l'utente richiede la generazione del voucher + Then la richiesta di generazione del Voucher non va a buon fine + + @voucher_generation_eservice11 + Scenario Outline: La generazione del Voucher fallisce per una Versione sospesa dell'EService quando esiste una Versione più recente pubblicata + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA2" ha già pubblicato una nuova versione per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + Given "PA2" ha già sospeso la vecchia versione di quell'e-service + When l'utente richiede la generazione del voucher + Then la richiesta di generazione del Voucher non va a buon fine + + # Waiting for the descriptor archivation to be implemented in the bff and fe + @voucher_generation_eservice12 @wait_for_fix @PIN-3371 + Scenario Outline: La generazione del Voucher fallisce per una Versione dell'EService manualmente archiviata + Given l'utente è un "admin" di "PA1" + Given "PA2" ha già creato e pubblicato 1 e-service + Given "PA1" ha una richiesta di fruizione in stato "ACTIVE" per quell'e-service + Given "PA1" ha già creato 1 finalità in stato "ACTIVE" per quell'eservice + Given "PA1" ha già creato 1 client "CONSUMER" + Given "PA1" ha già inserito l'utente con ruolo "admin" come membro di quel client + Given "PA1" ha già associato la finalità a quel client + Given un "admin" di "PA1" ha caricato una chiave pubblica nel client + #TODO! ADD STEP HERE!! + When l'utente richiede la generazione del voucher + Then si ottiene la corretta generazione del voucher + +# Dynamo DB degli stati (token-generation-read-model) non è più sync, bisogna aggiungere sleep +# Wait for fix sopra diff --git a/services/data-preparation.service.ts b/services/data-preparation.service.ts index afb6faaa..8e553bcd 100644 --- a/services/data-preparation.service.ts +++ b/services/data-preparation.service.ts @@ -317,6 +317,30 @@ export const dataPreparationService = { ); }, + async activateDescriptor( + token: string, + eserviceId: string, + descriptorId: string + ) { + const response = await apiClient.eservices.activateDescriptor( + eserviceId, + descriptorId, + getAuthorizationHeader(token) + ); + + assertValidResponse(response); + + await makePolling( + () => + apiClient.producers.getProducerEServiceDescriptor( + eserviceId, + descriptorId, + getAuthorizationHeader(token) + ), + (res) => res.data.state === "PUBLISHED" || res.data.state === "DEPRECATED" + ); + }, + async createAgreement( token: string, eserviceId: string, diff --git a/utils/commons.ts b/utils/commons.ts index b4ba8915..bfc7fc76 100644 --- a/utils/commons.ts +++ b/utils/commons.ts @@ -261,7 +261,7 @@ export async function requestVoucher({ clientId: string; clientAssertion: string; }) { - const response = await axios.post( + return await axios.post( env.AUTHORIZATION_SERVER_TOKEN_CREATION_URL, new URLSearchParams({ client_id: clientId, @@ -274,8 +274,7 @@ export async function requestVoucher({ headers: { "Content-Type": "application/x-www-form-urlencoded", }, + validateStatus: () => true, } ); - - return response.data; }