diff --git a/tests/integration-tests/src/test/kotlin/steps/connectionless/ConnectionLessSteps.kt b/tests/integration-tests/src/test/kotlin/steps/connectionless/ConnectionLessSteps.kt index 627281d15a..24f2e281ac 100644 --- a/tests/integration-tests/src/test/kotlin/steps/connectionless/ConnectionLessSteps.kt +++ b/tests/integration-tests/src/test/kotlin/steps/connectionless/ConnectionLessSteps.kt @@ -1,5 +1,6 @@ package steps.connectionless +import com.google.gson.JsonObject import interactions.Post import interactions.body import io.cucumber.java.en.* @@ -78,4 +79,94 @@ class ConnectionLessSteps { holder.remember("recordId", holderIssueCredentialRecord.recordId) holder.remember("thid", holderIssueCredentialRecord.thid) } + + @When("{actor} creates a OOB Invitation request for JWT proof presentation") + fun verifierCreatesARequestForJwtProofPresentationOfferInvitation(verifier: Actor) { + val presentationRequest = RequestPresentationInput( + goalCode = "present-vp", + goal = "Request proof of vaccine", + options = Options( + challenge = "11c91493-01b3-4c4d-ac36-b336bab5bddf", + domain = "https://example-verifier.com", + ), + proofs = listOf( + ProofRequestAux( + schemaId = "https://schema.org/Person", + trustIssuers = listOf("did:web:atalaprism.io/users/testUser"), + ), + ), + ) + + verifier.attemptsTo( + Post.to("/present-proof/presentations/invitation").body(presentationRequest), + Ensure.thatTheLastResponse().statusCode().isEqualTo(SC_CREATED), + ) + val presentationStatus = SerenityRest.lastResponse().get() + + verifier.attemptsTo( + Ensure.thatTheLastResponse().statusCode().isEqualTo(SC_CREATED), + Ensure.that(presentationStatus.status).isEqualTo(PresentationStatus.Status.INVITATION_GENERATED), + Ensure.that(presentationStatus.role).isEqualTo(PresentationStatus.Role.VERIFIER), + ) + + verifier.remember("presentationStatus", presentationStatus) + verifier.remember("thid", presentationStatus.thid) + } + + @And("{actor} accepts the OOB invitation request for JWT proof presentation from {actor}") + fun holderAcceptsJwtProofPresentationOfferInvitation(holder: Actor, verifier: Actor) { + val verifierPresentationStatusRecord = verifier.recall("presentationStatus") + holder.attemptsTo( + Post.to("/present-proof/presentations/accept-invitation") + .with { + it.body( + AcceptRequestPresentationInvitation( + verifierPresentationStatusRecord.invitation?.invitationUrl?.split("=")?.getOrNull(1) + ?: throw IllegalStateException("Invalid invitation URL format"), + ), + ) + }, + ) + val holderPresentationStatusRecord = SerenityRest.lastResponse().get() + + holder.attemptsTo( + Ensure.thatTheLastResponse().statusCode().isEqualTo(SC_OK), + Ensure.that(holderPresentationStatusRecord.status).isEqualTo(PresentationStatus.Status.REQUEST_RECEIVED), + Ensure.that(holderPresentationStatusRecord.role).isEqualTo(PresentationStatus.Role.PROVER), + ) + holder.remember("recordId", holderPresentationStatusRecord.presentationId) + holder.remember("thid", holderPresentationStatusRecord.thid) + } + + @When("{actor} creates a OOB Invitation request for sd-jwt proof presentation requesting [{}] claims") + fun verifierCreatesARequestForSdJwtProofPresentationInvitation(verifier: Actor, keys: String) { + val claims = JsonObject() + for (key in keys.split(",")) { + claims.addProperty(key, "{}") + } + val presentationRequest = RequestPresentationInput( + options = Options( + challenge = "11c91493-01b3-4c4d-ac36-b336bab5bddf", + domain = "https://example-verifier.com", + ), + proofs = listOf(), + credentialFormat = "SDJWT", + claims = claims, + ) + + verifier.attemptsTo( + Post.to("/present-proof/presentations/invitation").body(presentationRequest), + Ensure.thatTheLastResponse().statusCode().isEqualTo(SC_CREATED), + ) + val presentationStatus = SerenityRest.lastResponse().get() + + verifier.attemptsTo( + Ensure.thatTheLastResponse().statusCode().isEqualTo(SC_CREATED), + Ensure.that(presentationStatus.status).isEqualTo(PresentationStatus.Status.INVITATION_GENERATED), + Ensure.that(presentationStatus.role).isEqualTo(PresentationStatus.Role.VERIFIER), + ) + + verifier.remember("presentationStatus", presentationStatus) + verifier.remember("thid", presentationStatus.thid) + } } diff --git a/tests/integration-tests/src/test/resources/features/credential/jwt/present_proof.feature b/tests/integration-tests/src/test/resources/features/credential/jwt/present_proof.feature index 5b0f46564c..43612873d6 100644 --- a/tests/integration-tests/src/test/resources/features/credential/jwt/present_proof.feature +++ b/tests/integration-tests/src/test/resources/features/credential/jwt/present_proof.feature @@ -25,3 +25,10 @@ Feature: Present Proof Protocol And Holder rejects the proof Then Holder sees the proof is rejected + Scenario: Connectionless Verification Holder presents jwt credential proof to verifier + Given Holder has a jwt issued credential from Issuer + When Verifier creates a OOB Invitation request for JWT proof presentation + And Holder accepts the OOB invitation request for JWT proof presentation from Verifier + And Holder receives the presentation proof request + And Holder makes the jwt presentation of the proof + Then Verifier has the proof verified \ No newline at end of file diff --git a/tests/integration-tests/src/test/resources/features/credential/sdjwt/present_proof.feature b/tests/integration-tests/src/test/resources/features/credential/sdjwt/present_proof.feature index e5d273bf37..96e8f4e961 100644 --- a/tests/integration-tests/src/test/resources/features/credential/sdjwt/present_proof.feature +++ b/tests/integration-tests/src/test/resources/features/credential/sdjwt/present_proof.feature @@ -25,6 +25,18 @@ Feature: Present SD-JWT Proof Protocol | Verifier | | Issuer | + Scenario Outline: Holder presents sd-jwt proof to + Given Holder has a sd-jwt issued credential from Issuer + When creates a OOB Invitation request for sd-jwt proof presentation requesting [firstName] claims + And Holder accepts the OOB invitation request for JWT proof presentation from + And Holder receives the presentation proof request + And Holder makes the sd-jwt presentation of the proof disclosing [firstName] claims + Then has the proof verified + Examples: + | verifier | + | Verifier | + | Issuer | + # Scenario: Holder presents sd-jwt proof with different claims from requested # Given Verifier and Holder have an existing connection # And Holder has a bound sd-jwt issued credential from Issuer