Skip to content

Commit 98c93c9

Browse files
committed
fix(wallet-mobile): submit the previewed presentation request
1 parent 55cb7bd commit 98c93c9

6 files changed

Lines changed: 306 additions & 199 deletions

File tree

waltid-applications/waltid-wallet-demo-ios/iosApp/iosAppTests/MobileWalletIntegrationTests.swift

Lines changed: 72 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -213,37 +213,26 @@ final class MobileWalletIntegrationTests: XCTestCase {
213213
try await TestHelpers.waitForVerifierSuccess(transactionID: transaction.transactionId, timeoutSeconds: verifierPollingTimeout)
214214
}
215215

216-
func testReceiveAndPresentEudiPidSdJwtAgainstDemoIssuer2AndVerifier2() async throws {
217-
try await receiveAndPresentDemoCredential(scenarioID: "eudi-pid-sdjwt")
218-
}
219-
220-
func testReceiveAndPresentEudiPidMdocAgainstDemoIssuer2AndVerifier2() async throws {
221-
try await receiveAndPresentDemoCredential(scenarioID: "eudi-pid-mdoc")
222-
}
223-
224-
func testPreviewAndSubmitEudiPidMdocAgainstDemoIssuer2AndVerifier2() async throws {
225-
let scenario = try demoPresentationScenario("eudi-pid-mdoc")
226-
let walletId = "ios-demo-preview-submit-\(scenario.id)-\(UUID().uuidString)"
216+
func testPreviewAndSubmitFullFlowAgainstEudi() async throws {
217+
let walletId = "ios-eudi-preview-submit-\(UUID().uuidString)"
227218
await clearTestData(walletId: walletId)
228219

229220
let wallet = try await makeWallet(walletId: walletId)
230221
let bootstrapResult = try await wallet.bootstrap()
231222
let did = bootstrapResult.did
232223

233-
let offer = try await DemoBackend.shared.createOffer(scenario: scenario)
224+
let offer = try await EudiTestBackend.shared.generateOffer()
234225
let offerURL = try XCTUnwrap(URL(string: offer.offerUrl))
235226
let credentialIDs = try await wallet.receive(offer: offerURL)
236-
XCTAssertFalse(
237-
credentialIDs.isEmpty,
238-
"Should receive \(scenario.displayName) from public demo issuer2"
239-
)
227+
XCTAssertFalse(credentialIDs.isEmpty, "Should receive at least one EUDI credential")
240228

241-
let session = try await DemoBackend.shared.createVerifierSession(scenario: scenario)
242-
let presentationURL = try XCTUnwrap(URL(string: session.authorizationRequestUri))
229+
let credentialId = await EudiTestBackend.shared.extractCredentialIdFromOfferUrl(offerUrl: offer.offerUrl)
230+
let transaction = try await EudiTestBackend.shared.createVerifierTransaction(credentialId: credentialId)
231+
let presentationURL = try XCTUnwrap(URL(string: transaction.authorizationRequestUri))
243232
let preview = try await wallet.previewPresentation(request: presentationURL)
244233
XCTAssertFalse(
245234
preview.credentialOptions.isEmpty,
246-
"Should preview at least one matching credential for \(scenario.displayName): \(preview)"
235+
"Should preview at least one matching EUDI credential: \(preview)"
247236
)
248237
XCTAssertTrue(
249238
preview.credentialOptions.allSatisfy { credentialIDs.contains($0.credentialID) },
@@ -255,16 +244,28 @@ final class MobileWalletIntegrationTests: XCTestCase {
255244
selectedCredentialOptions: preview.credentialOptions.map(\.selection),
256245
did: did
257246
)
258-
259247
XCTAssertTrue(
260248
result.success,
261-
"public demo verifier2 stepwise presentation should succeed for \(scenario.displayName). Preview: \(preview), Result: \(result)"
249+
"EUDI stepwise presentation should succeed. Preview: \(preview), Result: \(result)"
262250
)
263251

264-
try await DemoBackend.shared.waitForVerifierSuccess(
265-
sessionID: session.sessionID,
266-
timeoutSeconds: verifierPollingTimeout
267-
)
252+
try await TestHelpers.waitForVerifierSuccess(transactionID: transaction.transactionId, timeoutSeconds: verifierPollingTimeout)
253+
}
254+
255+
func testReceiveAndPresentEudiPidSdJwtAgainstDemoIssuer2AndVerifier2() async throws {
256+
try await receiveAndPresentDemoCredential(scenarioID: "eudi-pid-sdjwt")
257+
}
258+
259+
func testReceiveAndPresentEudiPidMdocAgainstDemoIssuer2AndVerifier2() async throws {
260+
try await receiveAndPresentDemoCredential(scenarioID: "eudi-pid-mdoc")
261+
}
262+
263+
func testPreviewAndSubmitEudiPidSdJwtAgainstDemoIssuer2AndVerifier2() async throws {
264+
try await previewAndSubmitDemoCredential(scenarioID: "eudi-pid-sdjwt")
265+
}
266+
267+
func testPreviewAndSubmitEudiPidMdocAgainstDemoIssuer2AndVerifier2() async throws {
268+
try await previewAndSubmitDemoCredential(scenarioID: "eudi-pid-mdoc")
268269
}
269270

270271
func testReceiveAndPresentIsoMdlAgainstDemoIssuer2AndVerifier2() async throws {
@@ -347,6 +348,52 @@ final class MobileWalletIntegrationTests: XCTestCase {
347348
)
348349
}
349350

351+
private func previewAndSubmitDemoCredential(scenarioID: String) async throws {
352+
let scenario = try demoPresentationScenario(scenarioID)
353+
let walletId = "ios-demo-preview-submit-\(scenario.id)-\(UUID().uuidString)"
354+
await clearTestData(walletId: walletId)
355+
356+
let wallet = try await makeWallet(walletId: walletId)
357+
let bootstrapResult = try await wallet.bootstrap()
358+
let did = bootstrapResult.did
359+
360+
let offer = try await DemoBackend.shared.createOffer(scenario: scenario)
361+
let offerURL = try XCTUnwrap(URL(string: offer.offerUrl))
362+
let credentialIDs = try await wallet.receive(offer: offerURL)
363+
XCTAssertFalse(
364+
credentialIDs.isEmpty,
365+
"Should receive \(scenario.displayName) from public demo issuer2"
366+
)
367+
368+
let session = try await DemoBackend.shared.createVerifierSession(scenario: scenario)
369+
let presentationURL = try XCTUnwrap(URL(string: session.authorizationRequestUri))
370+
let preview = try await wallet.previewPresentation(request: presentationURL)
371+
XCTAssertFalse(
372+
preview.credentialOptions.isEmpty,
373+
"Should preview at least one matching credential for \(scenario.displayName): \(preview)"
374+
)
375+
XCTAssertTrue(
376+
preview.credentialOptions.allSatisfy { credentialIDs.contains($0.credentialID) },
377+
"Preview should only offer credentials received in this test. Received: \(credentialIDs), Preview: \(preview)"
378+
)
379+
380+
let result = try await wallet.submitPresentation(
381+
request: presentationURL,
382+
selectedCredentialOptions: preview.credentialOptions.map(\.selection),
383+
did: did
384+
)
385+
386+
XCTAssertTrue(
387+
result.success,
388+
"public demo verifier2 stepwise presentation should succeed for \(scenario.displayName). Preview: \(preview), Result: \(result)"
389+
)
390+
391+
try await DemoBackend.shared.waitForVerifierSuccess(
392+
sessionID: session.sessionID,
393+
timeoutSeconds: verifierPollingTimeout
394+
)
395+
}
396+
350397
private func receiveCredentialFromDemoIssuer2(scenarioID: String) async throws {
351398
let scenario = try demoScenario(scenarioID)
352399
let walletId = "ios-demo-receive-\(scenario.id)-\(UUID().uuidString)"

waltid-libraries/protocols/waltid-openid4vc-wallet-mobile/src/androidDeviceTest/kotlin/id/walt/wallet2/mobile/test/MobileWalletIntegrationTest.kt

Lines changed: 72 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -98,41 +98,28 @@ class MobileWalletIntegrationTest {
9898
}
9999

100100
@Test
101-
fun receiveAndPresentEudiPidSdJwtAgainstDemoIssuer2AndVerifier2() = runBlocking {
102-
receiveAndPresentDemoCredential("eudi-pid-sdjwt")
103-
}
104-
105-
@Test
106-
fun receiveAndPresentEudiPidMdocAgainstDemoIssuer2AndVerifier2() = runBlocking {
107-
receiveAndPresentDemoCredential("eudi-pid-mdoc")
108-
}
109-
110-
@Test
111-
fun previewAndSubmitEudiPidMdocAgainstDemoIssuer2AndVerifier2() = runBlocking {
112-
val scenario = demoPresentationScenario("eudi-pid-mdoc")
113-
val client = MobileWalletFactory(context).create(walletConfig("preview-submit-${scenario.id}"))
101+
fun previewAndSubmitFullFlowAgainstEudi() = runBlocking {
102+
val client = MobileWalletFactory(context).create(walletConfig("eudi-preview-submit"))
114103
val bootstrapResult = client.bootstrap()
115104

116-
val offer = DemoTestBackend.createOffer(scenario)
105+
val offer = EudiTestBackend.generateOffer()
117106
val credentialIds = client.receive(offer.offerUrl, txCode = offer.txCode)
118-
assertTrue(
119-
credentialIds.isNotEmpty(),
120-
"Should receive ${scenario.displayName} from public demo issuer2",
121-
)
107+
assertTrue(credentialIds.isNotEmpty(), "Should receive at least one EUDI credential")
122108

123-
val session = DemoTestBackend.createVerifierSession(scenario)
124-
val preview = client.previewPresentation(session.authorizationRequestUri)
109+
val credentialId = EudiTestBackend.extractCredentialIdFromOfferUrl(offer.offerUrl)
110+
val transaction = EudiTestBackend.createVerifierTransaction(credentialId)
111+
val preview = client.previewPresentation(transaction.authorizationRequestUri)
125112
assertTrue(
126113
preview.credentialOptions.isNotEmpty(),
127-
"Should preview at least one matching credential for ${scenario.displayName}: preview=$preview",
114+
"Should preview at least one matching EUDI credential: preview=$preview",
128115
)
129116
assertTrue(
130117
preview.credentialOptions.all { it.credentialId in credentialIds },
131118
"Preview should only offer credentials received in this test: received=$credentialIds, preview=$preview",
132119
)
133120

134121
val result = client.submitPresentation(
135-
requestUrl = session.authorizationRequestUri,
122+
requestUrl = transaction.authorizationRequestUri,
136123
selectedCredentialOptions = preview.credentialOptions.map { option ->
137124
MobileWalletPresentationCredentialSelection(
138125
queryId = option.queryId,
@@ -143,10 +130,30 @@ class MobileWalletIntegrationTest {
143130
)
144131
assertTrue(
145132
result.success,
146-
"public demo verifier2 stepwise presentation should succeed for ${scenario.displayName}: preview=$preview, result=$result",
133+
"EUDI stepwise presentation should succeed: preview=$preview, result=$result",
147134
)
148135

149-
DemoTestBackend.waitForVerifierSuccess(session.sessionId)
136+
EudiTestBackend.waitForVerifierSuccess(transaction.transactionId)
137+
}
138+
139+
@Test
140+
fun receiveAndPresentEudiPidSdJwtAgainstDemoIssuer2AndVerifier2() = runBlocking {
141+
receiveAndPresentDemoCredential("eudi-pid-sdjwt")
142+
}
143+
144+
@Test
145+
fun receiveAndPresentEudiPidMdocAgainstDemoIssuer2AndVerifier2() = runBlocking {
146+
receiveAndPresentDemoCredential("eudi-pid-mdoc")
147+
}
148+
149+
@Test
150+
fun previewAndSubmitEudiPidSdJwtAgainstDemoIssuer2AndVerifier2() = runBlocking {
151+
previewAndSubmitDemoCredential("eudi-pid-sdjwt")
152+
}
153+
154+
@Test
155+
fun previewAndSubmitEudiPidMdocAgainstDemoIssuer2AndVerifier2() = runBlocking {
156+
previewAndSubmitDemoCredential("eudi-pid-mdoc")
150157
}
151158

152159
@Test
@@ -248,6 +255,47 @@ class MobileWalletIntegrationTest {
248255
DemoTestBackend.waitForVerifierSuccess(session.sessionId)
249256
}
250257

258+
private suspend fun previewAndSubmitDemoCredential(scenarioId: String) {
259+
val scenario = demoPresentationScenario(scenarioId)
260+
val client = MobileWalletFactory(context).create(walletConfig("preview-submit-${scenario.id}"))
261+
val bootstrapResult = client.bootstrap()
262+
263+
val offer = DemoTestBackend.createOffer(scenario)
264+
val credentialIds = client.receive(offer.offerUrl, txCode = offer.txCode)
265+
assertTrue(
266+
credentialIds.isNotEmpty(),
267+
"Should receive ${scenario.displayName} from public demo issuer2",
268+
)
269+
270+
val session = DemoTestBackend.createVerifierSession(scenario)
271+
val preview = client.previewPresentation(session.authorizationRequestUri)
272+
assertTrue(
273+
preview.credentialOptions.isNotEmpty(),
274+
"Should preview at least one matching credential for ${scenario.displayName}: preview=$preview",
275+
)
276+
assertTrue(
277+
preview.credentialOptions.all { it.credentialId in credentialIds },
278+
"Preview should only offer credentials received in this test: received=$credentialIds, preview=$preview",
279+
)
280+
281+
val result = client.submitPresentation(
282+
requestUrl = session.authorizationRequestUri,
283+
selectedCredentialOptions = preview.credentialOptions.map { option ->
284+
MobileWalletPresentationCredentialSelection(
285+
queryId = option.queryId,
286+
credentialId = option.credentialId,
287+
)
288+
},
289+
did = bootstrapResult.did,
290+
)
291+
assertTrue(
292+
result.success,
293+
"public demo verifier2 stepwise presentation should succeed for ${scenario.displayName}: preview=$preview, result=$result",
294+
)
295+
296+
DemoTestBackend.waitForVerifierSuccess(session.sessionId)
297+
}
298+
251299
private fun demoScenario(id: String) = DemoTestBackend.scenarios.first { it.id == id }
252300

253301
private fun demoPresentationScenario(id: String) = DemoTestBackend.presentationScenarios.first { it.id == id }

0 commit comments

Comments
 (0)