Skip to content

Commit

Permalink
test: fix credential offer test
Browse files Browse the repository at this point in the history
Signed-off-by: Anton Baliasnikov <anton.baliasnikov@iohk.io>
  • Loading branch information
Anton Baliasnikov committed Nov 15, 2023
1 parent bd1a518 commit ef023f5
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ export class Issuer extends Actor {
this.didService.waitForDidState(this.longFormDid!, "PUBLISHED");
}

createCredentialSchema() {
this.schema = this.credentialsService.createCredentialSchema(this.did!);
createCredentialSchema(schemaType: string = "json") {
this.schema = this.credentialsService.createCredentialSchema(this.did!, schemaType);
}

createCredentialDefinition() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { sleep } from "k6";
import { HttpService } from "./HttpService";
import { ISSUER_AGENT_URL, WAITING_LOOP_MAX_ITERATIONS, WAITING_LOOP_PAUSE_INTERVAL } from "./Config";
import { IssueCredentialRecord, Connection, CredentialSchemaResponse } from "@input-output-hk/prism-typescript-client";
import { crypto } from "k6/experimental/webcrypto";
import {sleep} from "k6";
import {HttpService} from "./HttpService";
import {ISSUER_AGENT_URL, WAITING_LOOP_MAX_ITERATIONS, WAITING_LOOP_PAUSE_INTERVAL} from "./Config";
import {IssueCredentialRecord, Connection, CredentialSchemaResponse} from "@input-output-hk/prism-typescript-client";
import {crypto} from "k6/experimental/webcrypto";


/**
Expand All @@ -11,14 +11,14 @@ import { crypto } from "k6/experimental/webcrypto";
*/
export class CredentialsService extends HttpService {

/**
* Creates a credential offer for a specific issuing DID and connection.
* @param {string} issuingDid - The issuing DID.
* @param {Connection} connection - The connection object.
* @returns {IssueCredentialRecord} The created credential offer record.
*/
createCredentialOffer(issuingDid: string, connection: Connection, schema: CredentialSchemaResponse): IssueCredentialRecord {
const payload = `{
/**
* Creates a credential offer for a specific issuing DID and connection.
* @param {string} issuingDid - The issuing DID.
* @param {Connection} connection - The connection object.
* @returns {IssueCredentialRecord} The created credential offer record.
*/
createCredentialOffer(issuingDid: string, connection: Connection, schema: CredentialSchemaResponse): IssueCredentialRecord {
const payload = `{
"claims": {
"emailAddress": "${crypto.randomUUID()}-@atala.io",
"familyName": "Test",
Expand All @@ -31,12 +31,12 @@ export class CredentialsService extends HttpService {
"connectionId": "${connection.connectionId}",
"automaticIssuance": false
}`;
const res = this.post("issue-credentials/credential-offers", payload);
return this.toJson(res) as unknown as IssueCredentialRecord;
}
const res = this.post("issue-credentials/credential-offers", payload);
return this.toJson(res) as unknown as IssueCredentialRecord;
}

createCredentialDefinition(issuingDid: string, schema: CredentialSchemaResponse) {
const payload = `
createCredentialDefinition(issuingDid: string, schema: CredentialSchemaResponse) {
const payload = `
{
"name": "${crypto.randomUUID()}}",
"description": "Birth certificate Anoncred Credential Definition",
Expand All @@ -48,116 +48,169 @@ export class CredentialsService extends HttpService {
"supportRevocation": false
}
`;
this.post("credential-definition-registry/definitions", payload);
}
this.post("credential-definition-registry/definitions", payload);
}

createCredentialSchema(issuingDid: string) {
const payload = `
{
"name": "${crypto.randomUUID()}",
"version": "1.0.0",
"description": "Simple credential schema for the driving licence verifiable credential.",
"type": "AnoncredSchemaV1",
"schema": {
"name": "${crypto.randomUUID()}",
"version": "1.0.0",
"attrNames": [
"emailAddress",
"familyName"
],
"issuerId": "${issuingDid}"
},
"author": "${issuingDid}",
"tags": [
"Licence"
]
createCredentialSchema(issuingDid: string, schemaType: string = "json") {
const payload = (function () {
switch (schemaType) {
case "json":
return `{
"name": "${crypto.randomUUID()}}",
"version": "1.0.0",
"description": "Simple credential schema for the driving licence verifiable credential.",
"type": "https://w3c-ccg.github.io/vc-json-schemas/schema/2.0/schema.json",
"schema": {
"$id": "https://example.com/driving-license-1.0",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"description": "Driving License",
"type": "object",
"properties": {
"emailAddress": {
"type": "string",
"format": "email"
},
"givenName": {
"type": "string"
},
"familyName": {
"type": "string"
},
"dateOfIssuance": {
"type": "string"
},
"drivingLicenseID": {
"type": "string"
},
"drivingClass": {
"type": "integer"
}
},
"required": [
"emailAddress",
"familyName",
"dateOfIssuance",
"drivingLicenseID",
"drivingClass"
],
"additionalProperties": false
},
"tags": [
"driving",
"licence",
"id"
],
"author": "${issuingDid}"
}`;
case "anoncred":
return `{
"name": "${crypto.randomUUID()}",
"version": "1.0.0",
"description": "Simple credential schema for the driving licence verifiable credential.",
"type": "AnoncredSchemaV1",
"schema": {
"name": "${crypto.randomUUID()}",
"version": "1.0.0",
"attrNames": [
"emailAddress",
"familyName"
],
"issuerId": "${issuingDid}"
},
"author": "${issuingDid}",
"tags": [
"Licence"
]
}`;
default:
throw new Error(`Schema type ${schemaType} is not supported`);
}
})();
const res = this.post("schema-registry/schemas", payload);
return this.toJson(res) as unknown as CredentialSchemaResponse;
}
`
const res = this.post("schema-registry/schemas", payload);
return this.toJson(res) as unknown as CredentialSchemaResponse;
}

/**
* Retrieves a specific credential record by ID.
* @param {IssueCredentialRecord} record - The credential record.
* @returns {IssueCredentialRecord} The credential record.
*/
getCredentialRecord(record: IssueCredentialRecord): IssueCredentialRecord {
const res = this.get(`issue-credentials/records/${record.recordId}`);
return this.toJson(res) as unknown as IssueCredentialRecord;
}
/**
* Retrieves a specific credential record by ID.
* @param {IssueCredentialRecord} record - The credential record.
* @returns {IssueCredentialRecord} The credential record.
*/
getCredentialRecord(record: IssueCredentialRecord): IssueCredentialRecord {
const res = this.get(`issue-credentials/records/${record.recordId}`);
return this.toJson(res) as unknown as IssueCredentialRecord;
}

/**
* Retrieves all credential records.
* @returns {IssueCredentialRecord[]} An array of credential records.
*/
getCredentialRecords(thid: string): IssueCredentialRecord[] {
const res = this.get(`issue-credentials/records?thid=${thid}`);
return this.toJson(res).contents as unknown as IssueCredentialRecord[];
}
/**
* Retrieves all credential records.
* @returns {IssueCredentialRecord[]} An array of credential records.
*/
getCredentialRecords(thid: string): IssueCredentialRecord[] {
const res = this.get(`issue-credentials/records?thid=${thid}`);
return this.toJson(res).contents as unknown as IssueCredentialRecord[];
}

/**
* Accepts a credential offer and associates it with a subject DID.
* @param {IssueCredentialRecord} record - The credential record.
* @param {string} subjectDid - The subject DID.
* @returns {IssueCredentialRecord} The updated credential record.
*/
acceptCredentialOffer(record: IssueCredentialRecord, subjectDid: string): IssueCredentialRecord {
const payload = { subjectId: subjectDid };
const res = this.post(`issue-credentials/records/${record.recordId}/accept-offer`, payload, 200);
return this.toJson(res) as unknown as IssueCredentialRecord;
}
/**
* Accepts a credential offer and associates it with a subject DID.
* @param {IssueCredentialRecord} record - The credential record.
* @param {string} subjectDid - The subject DID.
* @returns {IssueCredentialRecord} The updated credential record.
*/
acceptCredentialOffer(record: IssueCredentialRecord, subjectDid: string): IssueCredentialRecord {
const payload = {subjectId: subjectDid};
const res = this.post(`issue-credentials/records/${record.recordId}/accept-offer`, payload, 200);
return this.toJson(res) as unknown as IssueCredentialRecord;
}

/**
* Issues a credential for a specific credential record.
* @param {IssueCredentialRecord} record - The credential record.
* @returns {IssueCredentialRecord} The updated credential record.
*/
issueCredential(record: IssueCredentialRecord): IssueCredentialRecord {
const res = this.post(`issue-credentials/records/${record.recordId}/issue-credential`, null, 200);
return this.toJson(res) as unknown as IssueCredentialRecord;
}
/**
* Issues a credential for a specific credential record.
* @param {IssueCredentialRecord} record - The credential record.
* @returns {IssueCredentialRecord} The updated credential record.
*/
issueCredential(record: IssueCredentialRecord): IssueCredentialRecord {
const res = this.post(`issue-credentials/records/${record.recordId}/issue-credential`, null, 200);
return this.toJson(res) as unknown as IssueCredentialRecord;
}

/**
* Waits for a credential offer to be received.
* @returns {IssueCredentialRecord} The received credential offer record.
* @throws {Error} If the credential offer is not received within the maximum iterations.
*/
waitForCredentialOffer(thid: string): IssueCredentialRecord {
let iterations = 0;
let record: IssueCredentialRecord | undefined;
do {
// console.log(`Waiting for credential offer with thid=${thid}`)
record = this.getCredentialRecords(thid).find(
r => r.thid === thid && r.protocolState === "OfferReceived"
);
if (record) {
return record;
}
sleep(WAITING_LOOP_PAUSE_INTERVAL);
iterations++;
} while (iterations < WAITING_LOOP_MAX_ITERATIONS);
throw new Error(`Record with thid=${thid} not achieved during the waiting loop`);
}
/**
* Waits for a credential offer to be received.
* @returns {IssueCredentialRecord} The received credential offer record.
* @throws {Error} If the credential offer is not received within the maximum iterations.
*/
waitForCredentialOffer(thid: string): IssueCredentialRecord {
let iterations = 0;
let record: IssueCredentialRecord | undefined;
do {
// console.log(`Waiting for credential offer with thid=${thid}`)
record = this.getCredentialRecords(thid).find(
r => r.thid === thid && r.protocolState === "OfferReceived"
);
if (record) {
return record;
}
sleep(WAITING_LOOP_PAUSE_INTERVAL);
iterations++;
} while (iterations < WAITING_LOOP_MAX_ITERATIONS);
throw new Error(`Record with thid=${thid} not achieved during the waiting loop`);
}

/**
* Waits for a credential to reach a specific state.
* @param {IssueCredentialRecord} credentialRecord - The credential record.
* @param {string} state - The required state.
* @throws {Error} If the credential state does not reach the required state within the maximum iterations.
*/
waitForCredentialState(credentialRecord: IssueCredentialRecord, state: string) {
let iterations = 0;
let currentState;
do {
const response = this.getCredentialRecord(credentialRecord);
currentState = response.protocolState;
sleep(WAITING_LOOP_PAUSE_INTERVAL);
iterations++;
} while (currentState !== state && iterations < WAITING_LOOP_MAX_ITERATIONS);
if (currentState !== state) {
throw new Error(`Credential is not ${state} after the waiting loop`);
/**
* Waits for a credential to reach a specific state.
* @param {IssueCredentialRecord} credentialRecord - The credential record.
* @param {string} state - The required state.
* @throws {Error} If the credential state does not reach the required state within the maximum iterations.
*/
waitForCredentialState(credentialRecord: IssueCredentialRecord, state: string) {
let iterations = 0;
let currentState;
do {
const response = this.getCredentialRecord(credentialRecord);
currentState = response.protocolState;
sleep(WAITING_LOOP_PAUSE_INTERVAL);
iterations++;
} while (currentState !== state && iterations < WAITING_LOOP_MAX_ITERATIONS);
if (currentState !== state) {
throw new Error(`Credential is not ${state} after the waiting loop`);
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export function setup() {
});

group("Issuer creates credential schema", function () {
issuer.createCredentialSchema();
issuer.createCredentialSchema("anoncred");
});

return {
Expand Down

0 comments on commit ef023f5

Please sign in to comment.