Skip to content

Commit a6e1f9c

Browse files
committed
Add vc-workflow instance for testing interactions.
1 parent 9f152d2 commit a6e1f9c

File tree

6 files changed

+106
-11
lines changed

6 files changed

+106
-11
lines changed

test/mocha/30-interactions.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ let api;
1212

1313
const baseURL = `https://${config.server.host}`;
1414

15-
describe.skip('interactions', () => {
15+
describe('interactions', () => {
1616
// mock session authentication for delegations endpoint
1717
let passportStub;
1818
before(async () => {
@@ -28,8 +28,6 @@ describe.skip('interactions', () => {
2828
passportStub.restore();
2929
});
3030

31-
// FIXME: create associated workflow instance w/`inviteRequest` feature
32-
// before()
3331
it('fails to create a new interaction with bad post data', async () => {
3432
let result;
3533
let error;

test/mocha/helpers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*!
2-
* Copyright (c) 2020-2022 Digital Bazaar, Inc. All rights reserved.
2+
* Copyright (c) 2020-2025 Digital Bazaar, Inc. All rights reserved.
33
*/
44
import * as brAccount from '@bedrock/account';
55
import * as database from '@bedrock/mongodb';

test/mocha/mock.data.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*!
2-
* Copyright (c) 2020-2022 Digital Bazaar, Inc. All rights reserved.
2+
* Copyright (c) 2020-2025 Digital Bazaar, Inc. All rights reserved.
33
*/
44
import {v4 as uuid} from 'uuid';
55
import {constants as zcapConstants} from '@digitalbazaar/zcap';
@@ -15,7 +15,10 @@ mockData.productIdMap = new Map([
1515
['urn:uuid:80a82316-e8c2-11eb-9570-10bf48838a41', 'webkms'],
1616
// edv service
1717
['edv', 'urn:uuid:dbd15f08-ff67-11eb-893b-10bf48838a41'],
18-
['urn:uuid:dbd15f08-ff67-11eb-893b-10bf48838a41', 'edv']
18+
['urn:uuid:dbd15f08-ff67-11eb-893b-10bf48838a41', 'edv'],
19+
// workflow service
20+
['vc-workflow', 'urn:uuid:146b6a5b-eade-4612-a215-1f3b5f03d648'],
21+
['urn:uuid:146b6a5b-eade-4612-a215-1f3b5f03d648', 'vc-workflow']
1922
]);
2023

2124
const zcaps = mockData.zcaps = {};

test/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,24 @@
2828
"@bedrock/meter-usage-reporter": "^10.0.0",
2929
"@bedrock/mongodb": "^11.0.0",
3030
"@bedrock/notify": "^1.1.0",
31+
"@bedrock/oauth2-verifier": "^2.4.0",
3132
"@bedrock/package-manager": "^3.0.0",
3233
"@bedrock/passport": "^12.0.0",
3334
"@bedrock/profile": "^26.0.0",
3435
"@bedrock/profile-http": "file:..",
3536
"@bedrock/security-context": "^9.0.0",
3637
"@bedrock/server": "^5.1.0",
38+
"@bedrock/service-agent": "^10.2.0",
39+
"@bedrock/service-core": "^11.2.1",
3740
"@bedrock/ssm-mongodb": "^13.0.0",
3841
"@bedrock/test": "^8.2.0",
3942
"@bedrock/validation": "^7.1.1",
43+
"@bedrock/vc-delivery": "^7.7.0",
4044
"@bedrock/vc-verifier": "^22.1.0",
4145
"@bedrock/veres-one-context": "^16.0.0",
4246
"@bedrock/zcap-storage": "^9.0.0",
47+
"@digitalbazaar/ed25519-signature-2020": "^5.4.0",
48+
"@digitalbazaar/webkms-client": "^14.2.0",
4349
"@digitalbazaar/zcap": "^9.0.1",
4450
"@digitalbazaar/zcap-context": "^2.0.0",
4551
"apisauce": "^3.1.0",

test/test.config.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ config['profile-http'].additionalEdvs = {
3737
credentials: {referenceId: 'credentials'},
3838
};
3939

40-
// enable optional `interactions`
41-
config['profile-http'].interactions.enabled = true;
40+
// `interactions` to be programmatically enabled in `test.js`
41+
config['profile-http'].interactions.enabled = false;
4242
config['profile-http'].interactions.types.test = {
4343
localInteractionId: '1d35d09b-94c8-44d5-9d10-8dd3460a5fc4',
4444
zcaps: {
45-
// FIXME:
45+
// to be populated by `test.js`
4646
readWriteExchanges: '{}'
4747
}
4848
};
@@ -51,3 +51,6 @@ config.notify.push.hmacKey = {
5151
id: 'urn:test:hmacKey',
5252
secretKeyMultibase: 'uogHy02QDNPX4GID7dGUSGuYQ_Gv0WOIcpmTuKgt1ZNz7_4'
5353
};
54+
55+
// service agent
56+
config['service-agent'].kms.baseUrl = `${config.server.baseUri}/kms`;

test/test.js

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
* Copyright (c) 2020-2025 Digital Bazaar, Inc. All rights reserved.
33
*/
44
import * as bedrock from '@bedrock/core';
5+
import {CapabilityAgent} from '@digitalbazaar/webkms-client';
56
import {handlers} from '@bedrock/meter-http';
7+
import {meters as meterReporting} from '@bedrock/meter-usage-reporter';
8+
import {meters} from '@bedrock/meter';
9+
import {workflowService} from '@bedrock/vc-delivery';
610
import '@bedrock/ssm-mongodb';
711
import '@bedrock/kms';
812
import '@bedrock/edv-storage';
@@ -11,14 +15,29 @@ import '@bedrock/profile';
1115
import '@bedrock/app-identity';
1216
import '@bedrock/https-agent';
1317
import '@bedrock/jsonld-document-loader';
14-
import '@bedrock/meter';
15-
import '@bedrock/meter-usage-reporter';
1618
import '@bedrock/notify';
1719
import '@bedrock/passport';
1820
import '@bedrock/server';
1921
import '@bedrock/kms-http';
2022
import '@bedrock/profile-http';
2123

24+
// for generating workflow for interactions...
25+
import {IdEncoder, IdGenerator} from 'bnid';
26+
import {Ed25519Signature2020} from '@digitalbazaar/ed25519-signature-2020';
27+
import {
28+
processInteractionConfig
29+
} from '@bedrock/profile-http/lib/interactions.js';
30+
import {ZCAP_CLIENT} from '@bedrock/profile-http/lib/zcapClient.js';
31+
import {ZcapClient} from '@digitalbazaar/ezcap';
32+
// 128 bit random id generator
33+
const idGenerator = new IdGenerator({bitLength: 128});
34+
// base58-multibase-multihash encoder
35+
const idEncoder = new IdEncoder({
36+
encoding: 'base58',
37+
multibase: true,
38+
multihash: true
39+
});
40+
2241
import {mockData} from './mocha/mock.data.js';
2342

2443
bedrock.events.on('bedrock.init', async () => {
@@ -38,5 +57,71 @@ bedrock.events.on('bedrock.init', async () => {
3857
handlers.setUseHandler({handler: ({meter} = {}) => ({meter})});
3958
});
4059

60+
bedrock.events.on('bedrock.ready', async () => {
61+
// programmatically create workflow for interactions
62+
{
63+
// create some controller for the workflow
64+
const secret = '53ad64ce-8e1d-11ec-bb12-10bf48838a41';
65+
const handle = 'test';
66+
const capabilityAgent = await CapabilityAgent.fromSecret({secret, handle});
67+
const {baseUri} = bedrock.config.server;
68+
69+
const meter = {
70+
id: idEncoder.encode(await idGenerator.generate()),
71+
controller: capabilityAgent.id,
72+
product: {
73+
id: mockData.productIdMap.get('vc-workflow')
74+
},
75+
serviceId: bedrock.config['app-identity'].seeds.services['vc-workflow'].id
76+
};
77+
await meters.insert({meter});
78+
const meterId = `${baseUri}/meters/${meter.id}`;
79+
await meterReporting.upsert({id: meterId, serviceType: 'vc-workflow'});
80+
81+
const localWorkflowId = idEncoder.encode(await idGenerator.generate());
82+
const config = {
83+
id: `${baseUri}/workflows/${localWorkflowId}`,
84+
sequence: 0,
85+
controller: capabilityAgent.id,
86+
meterId,
87+
steps: {
88+
myStep: {
89+
stepTemplate: {
90+
type: 'jsonata',
91+
template: `
92+
{
93+
"inviteRequest": inviteRequest
94+
}`
95+
}
96+
}
97+
},
98+
initialStep: 'myStep'
99+
};
100+
await workflowService.configStorage.insert({config});
101+
102+
// delegate ability to read/write exchanges for workflow to app identity
103+
const signer = capabilityAgent.getSigner();
104+
const zcapClient = new ZcapClient({
105+
invocationSigner: signer,
106+
delegationSigner: signer,
107+
SuiteClass: Ed25519Signature2020
108+
});
109+
const readWriteExchanges = await zcapClient.delegate({
110+
capability: `urn:zcap:root:${encodeURIComponent(config.id)}`,
111+
invocationTarget: `${config.id}/exchanges`,
112+
controller: ZCAP_CLIENT.invocationSigner.id,
113+
expires: new Date(Date.now() + 1000 * 60 * 60),
114+
allowedActions: ['read', 'write']
115+
});
116+
// update interactions config
117+
const interactionsConfig = bedrock.config['profile-http'].interactions;
118+
interactionsConfig.enabled = true;
119+
interactionsConfig.types.test.zcaps
120+
.readWriteExchanges = JSON.stringify(readWriteExchanges);
121+
// re-process interactions config
122+
processInteractionConfig();
123+
}
124+
});
125+
41126
import '@bedrock/test';
42127
bedrock.start();

0 commit comments

Comments
 (0)