Skip to content

Commit 19b0704

Browse files
committed
fix: test added
1 parent 19813c8 commit 19b0704

3 files changed

Lines changed: 99 additions & 34 deletions

File tree

packages/callback-example/lib/__tests__/issuerCallback.spec.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { KeyObject } from 'crypto'
22

33
import {
4-
CredentialRequestClient,
54
CredentialRequestClientBuilder,
6-
CredentialRequestClientBuilderV1_0_13,
75
ProofOfPossessionBuilder,
86
} from '@sphereon/oid4vci-client'
97
import {
@@ -224,7 +222,7 @@ describe('issuerCallback', () => {
224222
})
225223

226224
it('Should pass requesting a verifiable credential using the client', async () => {
227-
const credReqClient = ((await CredentialRequestClientBuilder.fromURI({ uri: INITIATION_TEST_URI })) as CredentialRequestClientBuilderV1_0_13)
225+
const credReqClient = (await CredentialRequestClientBuilder.fromURI({ uri: INITIATION_TEST_URI }))
228226
.withCredentialEndpoint('https://oidc4vci.demo.spruceid.com/credential')
229227
.withCredentialEndpointFromMetadata({
230228
credential_configurations_supported: { VeriCred: { format: 'jwt_vc_json' } },
@@ -257,7 +255,7 @@ describe('issuerCallback', () => {
257255
.withKid(kid)
258256
.build()
259257

260-
const credentialRequestClient = new CredentialRequestClient(credReqClient)
258+
const credentialRequestClient = credReqClient.build()
261259
const credentialRequest: CredentialRequest = await credentialRequestClient.createCredentialRequest({
262260
credentialIdentifier: 'VerifiableCredential',
263261
// format: 'jwt_vc_json',

packages/client/lib/CredentialRequestClientBuilder.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,34 @@ import {
88
ExperimentalSubjectIssuance,
99
OID4VCICredentialFormat,
1010
OpenId4VCIVersion,
11-
UniformCredentialOfferRequest,
12-
} from '@sphereon/oid4vci-common';
13-
import { CredentialFormat } from '@sphereon/ssi-types';
11+
UniformCredentialOfferRequest
12+
} from '@sphereon/oid4vci-common'
13+
import { CredentialFormat } from '@sphereon/ssi-types'
1414

1515
import { CredentialOfferClient } from './CredentialOfferClient';
16-
import { CredentialRequestClient } from './CredentialRequestClient';
1716
import { CredentialRequestClientBuilderV1_0_11 } from './CredentialRequestClientBuilderV1_0_11';
1817
import { CredentialRequestClientBuilderV1_0_13 } from './CredentialRequestClientBuilderV1_0_13';
19-
import { CredentialRequestClientV1_0_11 } from './CredentialRequestClientV1_0_11';
2018

2119
type CredentialRequestClientBuilderVersionSpecific = CredentialRequestClientBuilderV1_0_11 | CredentialRequestClientBuilderV1_0_13;
2220

21+
function isV1_0_13(builder: CredentialRequestClientBuilderVersionSpecific): builder is CredentialRequestClientBuilderV1_0_13 {
22+
return (builder as CredentialRequestClientBuilderV1_0_13).withCredentialIdentifier !== undefined;
23+
}
24+
2325
export class CredentialRequestClientBuilder {
2426
private _builder: CredentialRequestClientBuilderVersionSpecific;
2527

2628
private constructor(builder: CredentialRequestClientBuilderVersionSpecific) {
2729
this._builder = builder;
2830
}
2931

30-
private isV1_0_13(builder: CredentialRequestClientBuilderVersionSpecific): builder is CredentialRequestClientBuilderV1_0_13 {
31-
return (builder as CredentialRequestClientBuilderV1_0_13).withCredentialIdentifier !== undefined;
32-
}
33-
3432
public static fromCredentialIssuer({
35-
credentialIssuer,
36-
metadata,
37-
version,
38-
credentialIdentifier,
39-
credentialTypes,
40-
}: {
33+
credentialIssuer,
34+
metadata,
35+
version,
36+
credentialIdentifier,
37+
credentialTypes,
38+
}: {
4139
credentialIssuer: string;
4240
metadata?: EndpointMetadata;
4341
version?: OpenId4VCIVersion;
@@ -101,9 +99,9 @@ export class CredentialRequestClientBuilder {
10199
}
102100

103101
public static fromCredentialOffer({
104-
credentialOffer,
105-
metadata,
106-
}: {
102+
credentialOffer,
103+
metadata,
104+
}: {
107105
credentialOffer: CredentialOfferRequestWithBaseUrl;
108106
metadata?: EndpointMetadata;
109107
}): CredentialRequestClientBuilder {
@@ -129,8 +127,12 @@ export class CredentialRequestClientBuilder {
129127
return this._builder.version;
130128
}
131129

132-
public withCredentialEndpointFromMetadata(metadata: CredentialIssuerMetadata): this {
133-
this._builder.credentialEndpoint = metadata.credential_endpoint;
130+
public withCredentialEndpointFromMetadata(metadata: CredentialIssuerMetadata | CredentialIssuerMetadataV1_0_13): this {
131+
if (isV1_0_13(this._builder)) {
132+
this._builder.withCredentialEndpointFromMetadata(metadata as CredentialIssuerMetadataV1_0_13)
133+
} else {
134+
this._builder.withCredentialEndpointFromMetadata(metadata as CredentialIssuerMetadata)
135+
}
134136
return this;
135137
}
136138

@@ -140,12 +142,10 @@ export class CredentialRequestClientBuilder {
140142
}
141143

142144
public withDeferredCredentialEndpointFromMetadata(metadata: CredentialIssuerMetadata | CredentialIssuerMetadataV1_0_13): this {
143-
if (this.isV1_0_13(this._builder)) {
144-
(this._builder as CredentialRequestClientBuilderV1_0_13).withDeferredCredentialEndpointFromMetadata(
145-
metadata as CredentialIssuerMetadataV1_0_13,
146-
);
145+
if (isV1_0_13(this._builder)) {
146+
this._builder.withDeferredCredentialEndpointFromMetadata(metadata as CredentialIssuerMetadataV1_0_13);
147147
} else {
148-
this._builder.withDeferredCredentialEndpointFromMetadata(metadata);
148+
this._builder.withDeferredCredentialEndpointFromMetadata(metadata as CredentialIssuerMetadata);
149149
}
150150
return this;
151151
}
@@ -198,7 +198,7 @@ export class CredentialRequestClientBuilder {
198198
return this;
199199
}
200200

201-
public build(): CredentialRequestClient | CredentialRequestClientV1_0_11 {
201+
public build() {
202202
return this._builder.build();
203203
}
204204
}

packages/client/lib/__tests__/IT.spec.ts

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import {
22
AccessTokenResponse,
3-
Alg,
3+
Alg, CredentialOfferPayloadV1_0_13,
44
CredentialOfferRequestWithBaseUrl,
55
Jwt,
66
OpenId4VCIVersion,
77
ProofOfPossession,
8-
WellKnownEndpoints,
9-
} from '@sphereon/oid4vci-common';
8+
WellKnownEndpoints
9+
} from '@sphereon/oid4vci-common'
1010
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
1111
// @ts-ignore
1212
import nock from 'nock';
@@ -225,7 +225,7 @@ describe('OID4VCI-Client should', () => {
225225
}
226226

227227
it(
228-
'succeed with a full flow without the client',
228+
'succeed with a full flow without the client v1_0_11',
229229
async () => {
230230
/* Convert the URI into an object */
231231
const credentialOffer: CredentialOfferRequestWithBaseUrl = await CredentialOfferClient.fromURI(INITIATE_QR_V1_0_08);
@@ -284,6 +284,73 @@ describe('OID4VCI-Client should', () => {
284284
UNIT_TEST_TIMEOUT,
285285
);
286286

287+
it(
288+
'succeed with a full flow without the client v1_0_13',
289+
async () => {
290+
/* Convert the URI into an object */
291+
const credentialOffer: CredentialOfferRequestWithBaseUrl = await CredentialOfferClient.fromURI(INITIATE_QR_V1_0_13);
292+
const preAuthorizedCode = 'oaKazRN8I0IbtZ0C7JuMn5';
293+
expect(credentialOffer.baseUrl).toEqual('openid-credential-offer://');
294+
expect((credentialOffer.credential_offer as CredentialOfferPayloadV1_0_13).credential_configuration_ids).toEqual(['OpenBadgeCredentialUrl']);
295+
expect(credentialOffer.original_credential_offer.grants).toEqual({
296+
'urn:ietf:params:oauth:grant-type:pre-authorized_code': {
297+
'pre-authorized_code': preAuthorizedCode,
298+
tx_code: {
299+
input_mode: 'text',
300+
description: 'Please enter the serial number of your physical drivers license',
301+
length: preAuthorizedCode.length,
302+
},
303+
},
304+
});
305+
306+
nock(ISSUER_URL)
307+
.post(/token.*/)
308+
.reply(200, JSON.stringify(mockedAccessTokenResponse));
309+
310+
/* The actual access token calls */
311+
const accessTokenClient: AccessTokenClient = new AccessTokenClient();
312+
const accessTokenResponse = await accessTokenClient.acquireAccessToken({ credentialOffer: credentialOffer, pin: '1234' });
313+
expect(accessTokenResponse.successBody).toEqual(mockedAccessTokenResponse);
314+
// Get the credential
315+
nock(ISSUER_URL)
316+
.post(/credential/)
317+
.reply(200, {
318+
format: 'jwt-vc',
319+
credential: mockedVC,
320+
});
321+
const credReqClient = CredentialRequestClientBuilder.fromCredentialOffer({ credentialOffer: credentialOffer })
322+
.withFormat('jwt_vc')
323+
324+
.withTokenFromResponse(accessTokenResponse.successBody!)
325+
.build();
326+
327+
//TS2322: Type '(args: ProofOfPossessionCallbackArgs) => Promise<string>'
328+
// is not assignable to type 'ProofOfPossessionCallback'.
329+
// Types of parameters 'args' and 'args' are incompatible.
330+
// Property 'kid' is missing in type '{ header: unknown; payload: unknown; }' but required in type 'ProofOfPossessionCallbackArgs'.
331+
const proof: ProofOfPossession = await ProofOfPossessionBuilder.fromJwt({
332+
jwt: jwtDid,
333+
callbacks: {
334+
signCallback: proofOfPossessionCallbackFunction,
335+
},
336+
version: OpenId4VCIVersion.VER_1_0_11,
337+
})
338+
.withEndpointMetadata({
339+
issuer: 'https://issuer.research.identiproof.io',
340+
credential_endpoint: 'https://issuer.research.identiproof.io/credential',
341+
token_endpoint: 'https://issuer.research.identiproof.io/token',
342+
})
343+
.withKid('did:example:ebfeb1f712ebc6f1c276e12ec21/keys/1')
344+
.build();
345+
const credResponse = await credReqClient.acquireCredentialsUsingProof({
346+
proofInput: proof,
347+
credentialTypes: credentialOffer.original_credential_offer.credential_configuration_ids[0],
348+
});
349+
expect(credResponse.successBody?.credential).toEqual(mockedVC);
350+
},
351+
UNIT_TEST_TIMEOUT,
352+
);
353+
287354
it(
288355
'succeed with a full flow without the client and without did',
289356
async () => {

0 commit comments

Comments
 (0)