Skip to content

Commit

Permalink
ATL-6775: integration test + documentation
Browse files Browse the repository at this point in the history
Signed-off-by: Bassam Riman <bassam.riman@iohk.io>
  • Loading branch information
CryptoKnightIOG committed Apr 25, 2024
1 parent 7ee0b16 commit 276e924
Show file tree
Hide file tree
Showing 18 changed files with 173 additions and 141 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ object VcVerificationEndpoints {
List[http.VcVerificationResponse],
Any
] =
endpoint.get
endpoint.post
.tag("Verifiable Credentials Verification")
.name("verify")
.summary("As a Verifier, verify a set of credentials")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ import sttp.tapir.Schema.annotations.{description, encodedExample}
import zio.json.{DeriveJsonDecoder, DeriveJsonEncoder, JsonDecoder, JsonEncoder}
import zio.{IO, *}

import java.time.OffsetDateTime

final case class VcVerificationRequest(
@description(VcVerificationRequest.annotations.credential.description)
@encodedExample(VcVerificationRequest.annotations.credential.example)
credential: String,
@description(VcVerificationRequest.annotations.vcVerification.description)
@encodedExample(VcVerificationRequest.annotations.vcVerification.example)
@description(VcVerificationRequest.annotations.parameterizableVcVerifications.description)
@encodedExample(VcVerificationRequest.annotations.parameterizableVcVerifications.example)
verifications: List[ParameterizableVcVerification]
)

Expand All @@ -26,22 +28,28 @@ object VcVerificationRequest {
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
)

object vcVerification
extends Annotation[List[VcVerification]](
object parameterizableVcVerifications
extends Annotation[List[ParameterizableVcVerification]](
description = "The list of Verifications to verify. All verifications run if Verifications left empty",
example = List(
VcVerification.SignatureVerification,
VcVerification.IssuerIdentification,
VcVerification.ExpirationCheck,
VcVerification.NotBeforeCheck,
VcVerification.AudienceCheck,
VcVerification.SubjectVerification,
VcVerification.IntegrityOfClaims,
VcVerification.ComplianceWithStandards,
VcVerification.RevocationCheck,
VcVerification.AlgorithmVerification,
VcVerification.SchemaCheck,
VcVerification.SemanticCheckOfClaims,
ParameterizableVcVerification(VcVerification.SignatureVerification, None),
ParameterizableVcVerification(VcVerification.IssuerIdentification, Some(DidParameter("did:prism:issuer"))),
ParameterizableVcVerification(
VcVerification.ExpirationCheck,
Some(DateTimeParameter(OffsetDateTime.parse("2022-03-10T12:00:00Z")))
),
ParameterizableVcVerification(
VcVerification.NotBeforeCheck,
Some(DateTimeParameter(OffsetDateTime.parse("2022-03-10T12:00:00Z")))
),
ParameterizableVcVerification(VcVerification.AudienceCheck, Some(DidParameter("did:prism:holder"))),
ParameterizableVcVerification(VcVerification.SubjectVerification, None),
ParameterizableVcVerification(VcVerification.IntegrityOfClaims, None),
ParameterizableVcVerification(VcVerification.ComplianceWithStandards, None),
ParameterizableVcVerification(VcVerification.RevocationCheck, None),
ParameterizableVcVerification(VcVerification.AlgorithmVerification, None),
ParameterizableVcVerification(VcVerification.SchemaCheck, None),
ParameterizableVcVerification(VcVerification.SemanticCheckOfClaims, None)
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ final case class VcVerificationResponse(
@description(VcVerificationResponse.annotations.credential.description)
@encodedExample(VcVerificationResponse.annotations.credential.example)
credential: String,
@description(VcVerificationResponse.annotations.checks.description)
@encodedExample(VcVerificationResponse.annotations.checks.example)
@description(VcVerificationResponse.annotations.vcVerificationResults.description)
@encodedExample(VcVerificationResponse.annotations.vcVerificationResults.example)
result: List[VcVerificationResult],
)

Expand All @@ -25,79 +25,22 @@ object VcVerificationResponse {
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
)

object checks
extends Annotation[List[VcVerification]](
object vcVerificationResults
extends Annotation[List[VcVerificationResult]](
description = "The list executed Verifications",
example = List(
VcVerification.SignatureVerification,
VcVerification.IssuerIdentification,
VcVerification.ExpirationCheck,
VcVerification.NotBeforeCheck,
VcVerification.AudienceCheck,
VcVerification.SubjectVerification,
VcVerification.IntegrityOfClaims,
VcVerification.ComplianceWithStandards,
VcVerification.RevocationCheck,
VcVerification.AlgorithmVerification,
VcVerification.SchemaCheck,
VcVerification.SemanticCheckOfClaims,
)
)

object successfulChecks
extends Annotation[List[VcVerification]](
description = "The list of successful Verifications",
example = List(
VcVerification.SignatureVerification,
VcVerification.IssuerIdentification,
VcVerification.ExpirationCheck,
VcVerification.NotBeforeCheck,
VcVerification.AudienceCheck,
VcVerification.SubjectVerification,
VcVerification.IntegrityOfClaims,
VcVerification.ComplianceWithStandards,
VcVerification.RevocationCheck,
VcVerification.AlgorithmVerification,
VcVerification.SchemaCheck,
VcVerification.SemanticCheckOfClaims,
)
)

object failedChecks
extends Annotation[List[VcVerification]](
description = "The list of failed Verifications.",
example = List(
VcVerification.SignatureVerification,
VcVerification.IssuerIdentification,
VcVerification.ExpirationCheck,
VcVerification.NotBeforeCheck,
VcVerification.AudienceCheck,
VcVerification.SubjectVerification,
VcVerification.IntegrityOfClaims,
VcVerification.ComplianceWithStandards,
VcVerification.RevocationCheck,
VcVerification.AlgorithmVerification,
VcVerification.SchemaCheck,
VcVerification.SemanticCheckOfClaims,
)
)

object failedAsWarningChecks
extends Annotation[List[VcVerification]](
description = "The list of failed Verifications as warning",
example = List(
VcVerification.SignatureVerification,
VcVerification.IssuerIdentification,
VcVerification.ExpirationCheck,
VcVerification.NotBeforeCheck,
VcVerification.AudienceCheck,
VcVerification.SubjectVerification,
VcVerification.IntegrityOfClaims,
VcVerification.ComplianceWithStandards,
VcVerification.RevocationCheck,
VcVerification.AlgorithmVerification,
VcVerification.SchemaCheck,
VcVerification.SemanticCheckOfClaims,
VcVerificationResult(VcVerification.SignatureVerification, true),
VcVerificationResult(VcVerification.IssuerIdentification, true),
VcVerificationResult(VcVerification.ExpirationCheck, true),
VcVerificationResult(VcVerification.NotBeforeCheck, true),
VcVerificationResult(VcVerification.AudienceCheck, true),
VcVerificationResult(VcVerification.SubjectVerification, true),
VcVerificationResult(VcVerification.IntegrityOfClaims, true),
VcVerificationResult(VcVerification.ComplianceWithStandards, true),
VcVerificationResult(VcVerification.RevocationCheck, true),
VcVerificationResult(VcVerification.AlgorithmVerification, true),
VcVerificationResult(VcVerification.SchemaCheck, true),
VcVerificationResult(VcVerification.SemanticCheckOfClaims, true),
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ object VcVerificationControllerImplSpec extends ZIOSpecDefault with VcVerificati
backend = httpBackend(vcVerificationController, authenticator)
response: Response[Either[DeserializationException[String], List[VcVerificationResponse]]] <-
basicRequest
.get(uri"${vcVerificationUriBase}")
.post(uri"${vcVerificationUriBase}")
.body(
List(
VcVerificationRequest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ enum class CredentialSchema {
"name" to JsonSchemaProperty(type = "string"),
"age" to JsonSchemaProperty(type = "integer"),
),
required = listOf("name", "age")
required = listOf("name", "age"),
)
override val credentialSchema: CredentialSchemaInput = CredentialSchemaInput(
author = "did:prism:agent",
Expand All @@ -30,7 +30,7 @@ enum class CredentialSchema {
tags = listOf("school", "students"),
version = "1.0.0",
)
};
}, ;

abstract val credentialSchema: CredentialSchemaInput
abstract val schema: JsonSchema
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package common

import io.iohk.atala.prism.models.*
import models.JsonSchema
import models.JsonSchemaProperty
import java.time.Duration
import java.util.UUID

object TestConstants {
val TESTS_CONFIG = System.getProperty("TESTS_CONFIG") ?: "/configs/basic.conf"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package config

enum class VaultAuthType {
APP_ROLE,
TOKEN
TOKEN,
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ interface ServiceBase : Startable {
}

fun postStart() {

}

override fun stop() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ data class Vault(
mapOf(
"VAULT_PORT" to httpPort.toString(),

),
),
).waitingFor(
"vault",
Wait.forHealthcheck(),
Expand Down
1 change: 1 addition & 0 deletions tests/integration-tests/src/test/kotlin/steps/Setup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ object Setup {
config.services?.vault?.stop()
}
}

@BeforeAll
fun init() {
Setup.initServices()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package steps.common

import steps.connection.ConnectionSteps
import steps.credentials.IssueCredentialsSteps
import steps.did.PublishDidSteps
import interactions.Get
import io.cucumber.java.ParameterType
import io.cucumber.java.en.Given
Expand All @@ -16,6 +13,9 @@ import net.serenitybdd.rest.SerenityRest
import net.serenitybdd.screenplay.Actor
import net.serenitybdd.screenplay.actors.OnStage
import org.apache.http.HttpStatus
import steps.connection.ConnectionSteps
import steps.credentials.IssueCredentialsSteps
import steps.did.PublishDidSteps

class CommonSteps {
@ParameterType(".*")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class IssueCredentialsSteps {
holder: Actor,
didForm: String,
schemaGuid: String?,
claims: Map<String, Any>
claims: Map<String, Any>,
) {
val did: String = if (didForm == "short") {
issuer.recall("shortFormDid")
Expand Down Expand Up @@ -85,12 +85,12 @@ class IssueCredentialsSteps {
issuer: Actor,
holder: Actor,
format: String,
schema: CredentialSchema
schema: CredentialSchema,
) {
val schemaGuid = issuer.recall<String>(schema.name)!!
val claims = linkedMapOf(
"name" to "Name",
"age" to 18
"age" to 18,
)
sendCredentialOffer(issuer, holder, format, schemaGuid, claims)
saveCredentialOffer(issuer, holder)
Expand All @@ -101,12 +101,12 @@ class IssueCredentialsSteps {
issuer: Actor,
holder: Actor,
format: String,
schema: CredentialSchema
schema: CredentialSchema,
) {
val schemaGuid = issuer.recall<String>(schema.name)!!
val claims = linkedMapOf(
"name" to "Name",
"surname" to "Surname"
"surname" to "Surname",
)
sendCredentialOffer(issuer, holder, "short", schemaGuid, claims)
}
Expand Down Expand Up @@ -210,10 +210,10 @@ class IssueCredentialsSteps {
it.data.thid == holder.recall<String>("thid")
}
credentialEvent != null &&
credentialEvent!!.data.protocolState == IssueCredentialRecord.ProtocolState.OFFER_RECEIVED
credentialEvent!!.data.protocolState == IssueCredentialRecord.ProtocolState.OFFER_RECEIVED
},
"Holder was unable to receive the credential offer from Issuer! " +
"Protocol state did not achieve ${IssueCredentialRecord.ProtocolState.OFFER_RECEIVED} state.",
"Protocol state did not achieve ${IssueCredentialRecord.ProtocolState.OFFER_RECEIVED} state.",
)

val recordId = ListenToEvents.`as`(holder).credentialEvents.last().data.recordId
Expand Down Expand Up @@ -258,7 +258,7 @@ class IssueCredentialsSteps {
it.data.thid == issuer.recall<String>("thid")
}
credentialEvent != null &&
credentialEvent!!.data.protocolState == IssueCredentialRecord.ProtocolState.REQUEST_RECEIVED
credentialEvent!!.data.protocolState == IssueCredentialRecord.ProtocolState.REQUEST_RECEIVED
},
"Issuer was unable to receive the credential request from Holder! Protocol state did not achieve RequestReceived state.",
)
Expand All @@ -276,10 +276,10 @@ class IssueCredentialsSteps {
it.data.thid == issuer.recall<String>("thid")
}
credentialEvent != null &&
credentialEvent!!.data.protocolState == IssueCredentialRecord.ProtocolState.CREDENTIAL_SENT
credentialEvent!!.data.protocolState == IssueCredentialRecord.ProtocolState.CREDENTIAL_SENT
},
"Issuer was unable to issue the credential! " +
"Protocol state did not achieve ${IssueCredentialRecord.ProtocolState.CREDENTIAL_SENT} state.",
"Protocol state did not achieve ${IssueCredentialRecord.ProtocolState.CREDENTIAL_SENT} state.",
)
}

Expand All @@ -291,18 +291,18 @@ class IssueCredentialsSteps {
it.data.thid == holder.recall<String>("thid")
}
credentialEvent != null &&
credentialEvent!!.data.protocolState == IssueCredentialRecord.ProtocolState.CREDENTIAL_RECEIVED
credentialEvent!!.data.protocolState == IssueCredentialRecord.ProtocolState.CREDENTIAL_RECEIVED
},
"Holder was unable to receive the credential from Issuer! " +
"Protocol state did not achieve ${IssueCredentialRecord.ProtocolState.CREDENTIAL_RECEIVED} state.",
"Protocol state did not achieve ${IssueCredentialRecord.ProtocolState.CREDENTIAL_RECEIVED} state.",
)
holder.remember("issuedCredential", ListenToEvents.`as`(holder).credentialEvents.last().data)
}

@Then("{actor} should see that credential issuance has failed")
fun issuerShouldSeeThatCredentialIssuanceHasFailed(issuer: Actor) {
issuer.attemptsTo(
Ensure.thatTheLastResponse().statusCode().isEqualTo(SC_BAD_REQUEST)
Ensure.thatTheLastResponse().statusCode().isEqualTo(SC_BAD_REQUEST),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,19 @@ class PublishDidSteps {
if (agent.recallAll().containsKey("hasPublishedDid")) {
return
}
if (!agent.recallAll().containsKey("shortFormDid")
&& !agent.recallAll().containsKey("longFormDid")) {
if (!agent.recallAll().containsKey("shortFormDid") &&
!agent.recallAll().containsKey("longFormDid")
) {
createsUnpublishedDid(agent)
}
hePublishesDidToLedger(agent)
}

@Given("{actor} has an unpublished DID")
fun agentHasAnUnpublishedDID(agent: Actor) {
if (agent.recallAll().containsKey("shortFormDid")
|| agent.recallAll().containsKey("longFormDid")) {
if (agent.recallAll().containsKey("shortFormDid") ||
agent.recallAll().containsKey("longFormDid")
) {
// is not published
if (!agent.recallAll().containsKey("hasPublishedDid")) {
return
Expand Down

0 comments on commit 276e924

Please sign in to comment.