@velocitycareerlabs/server-webwallet 1.25.0-dev-build.12642c864

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.localdev.env +57 -0
  2. package/.standalone.env +22 -0
  3. package/LICENSE +248 -0
  4. package/README.md +11 -0
  5. package/jest.config.js +20 -0
  6. package/migrate-mongo.config.js +23 -0
  7. package/package.json +72 -0
  8. package/src/config/config.js +74 -0
  9. package/src/controllers/accounts/autohooks.js +28 -0
  10. package/src/controllers/accounts/controller.js +209 -0
  11. package/src/controllers/accounts/schemas/index.js +6 -0
  12. package/src/controllers/accounts/schemas/webwallet-accounts-request.schema.js +25 -0
  13. package/src/controllers/accounts/schemas/webwallet-accounts-response.schema.js +72 -0
  14. package/src/controllers/accounts/schemas/webwallet-accounts-update-request.schema.js +23 -0
  15. package/src/controllers/accounts/schemas/webwallet-test-personas-response.schema.js +110 -0
  16. package/src/controllers/consent/autohooks.js +14 -0
  17. package/src/controllers/consent/controller.js +91 -0
  18. package/src/controllers/consent/schemas/index.js +3 -0
  19. package/src/controllers/consent/schemas/webwallet-consent-response.schema.js +23 -0
  20. package/src/controllers/credentials/autohooks.js +36 -0
  21. package/src/controllers/credentials/controller.js +92 -0
  22. package/src/controllers/credentials/schemas/index.js +4 -0
  23. package/src/controllers/credentials/schemas/webwallet-credential-categories-response.schema.js +21 -0
  24. package/src/controllers/credentials/schemas/webwallet-credentials-response.schema.js +29 -0
  25. package/src/controllers/disclosures/autohooks.js +21 -0
  26. package/src/controllers/disclosures/controller.js +168 -0
  27. package/src/controllers/disclosures/schemas/index.js +7 -0
  28. package/src/controllers/disclosures/schemas/webwallet-accept-presentation-request-body.schema.js +28 -0
  29. package/src/controllers/disclosures/schemas/webwallet-accept-presentation-response.schema.js +16 -0
  30. package/src/controllers/disclosures/schemas/webwallet-get-disclosures-response.schema.js +18 -0
  31. package/src/controllers/disclosures/schemas/webwallet-get-presentation-request-query.schema.js +21 -0
  32. package/src/controllers/disclosures/schemas/webwallet-get-presentation-request-response.schema.js +16 -0
  33. package/src/controllers/feedback/autohooks.js +11 -0
  34. package/src/controllers/feedback/controller.js +48 -0
  35. package/src/controllers/issuing/common-schemas/index.js +10 -0
  36. package/src/controllers/issuing/common-schemas/webwallet-get-credential-manifest-query.schema.js +27 -0
  37. package/src/controllers/issuing/common-schemas/webwallet-get-credential-manifest-response.schema.js +31 -0
  38. package/src/controllers/issuing/deep-link/autohooks.js +51 -0
  39. package/src/controllers/issuing/deep-link/controller.js +192 -0
  40. package/src/controllers/issuing/deep-link/schemas/index.js +6 -0
  41. package/src/controllers/issuing/deep-link/schemas/webwallet-deep-link-accept-offers-request.schema.js +30 -0
  42. package/src/controllers/issuing/deep-link/schemas/webwallet-deep-link-accept-offers-response.schema.js +36 -0
  43. package/src/controllers/issuing/deep-link/schemas/webwallet-deep-link-offers-request.schema.js +28 -0
  44. package/src/controllers/issuing/deep-link/schemas/webwallet-deep-link-offers-response.schema.js +48 -0
  45. package/src/controllers/issuing/identity-credentials/autohooks.js +42 -0
  46. package/src/controllers/issuing/identity-credentials/controller.js +188 -0
  47. package/src/controllers/issuing/identity-credentials/schemas/index.js +6 -0
  48. package/src/controllers/issuing/identity-credentials/schemas/webwallet-identity-credentials-confirm-body.schema.js +20 -0
  49. package/src/controllers/issuing/identity-credentials/schemas/webwallet-identity-credentials-confirm-response.schema.js +37 -0
  50. package/src/controllers/issuing/identity-credentials/schemas/webwallet-identity-credentials-request-code-body.schema.js +14 -0
  51. package/src/controllers/issuing/identity-credentials/schemas/webwallet-identity-credentials-request-code-params.schema.js +19 -0
  52. package/src/controllers/linkedin/autohooks.js +16 -0
  53. package/src/controllers/linkedin/controller.js +276 -0
  54. package/src/controllers/linkedin/schemas/index.js +3 -0
  55. package/src/controllers/linkedin/schemas/webwallet-linkedin-me-response.schema.js +14 -0
  56. package/src/controllers/root/controller.js +29 -0
  57. package/src/entities/.gitkeep +0 -0
  58. package/src/entities/accounts/constants.js +5 -0
  59. package/src/entities/accounts/domains/extract-auth0-id-token-or-access-token.js +22 -0
  60. package/src/entities/accounts/domains/index.js +5 -0
  61. package/src/entities/accounts/domains/validate-account-permissions.js +36 -0
  62. package/src/entities/accounts/domains/validate-logo-size.js +25 -0
  63. package/src/entities/accounts/index.js +5 -0
  64. package/src/entities/accounts/repos/accounts.repo.js +63 -0
  65. package/src/entities/credentials/domains/index.js +3 -0
  66. package/src/entities/credentials/domains/offer-to-credential-mongo-dto.js +43 -0
  67. package/src/entities/credentials/index.js +6 -0
  68. package/src/entities/credentials/orchestrators/index.js +3 -0
  69. package/src/entities/credentials/orchestrators/load-additional-render-info.js +65 -0
  70. package/src/entities/credentials/repos/credentials.repo.js +132 -0
  71. package/src/entities/credentials/schemas/index.js +4 -0
  72. package/src/entities/credentials/schemas/webwallet-credential-response.schema.js +138 -0
  73. package/src/entities/credentials/schemas/webwallet-credentials-response.schemas.js +95 -0
  74. package/src/entities/credentials/schemas/webwallet-display-descriptor-response.schema.js +106 -0
  75. package/src/entities/disclosures/index.js +4 -0
  76. package/src/entities/disclosures/repos/disclosures.repo.js +31 -0
  77. package/src/entities/disclosures/schemas/index.js +10 -0
  78. package/src/entities/disclosures/schemas/webwallet-disclosure.schema.js +39 -0
  79. package/src/entities/disclosures/schemas/webwallet-presentation-request-field.schema.js +45 -0
  80. package/src/entities/disclosures/schemas/webwallet-presentation-request-filter.schema.js +30 -0
  81. package/src/entities/disclosures/schemas/webwallet-presentation-request-format.schema.js +36 -0
  82. package/src/entities/disclosures/schemas/webwallet-presentation-request-input-descriptors.schema.js +111 -0
  83. package/src/entities/disclosures/schemas/webwallet-presentation-request-schema.schema.js +14 -0
  84. package/src/entities/disclosures/schemas/webwallet-presentation-request-submission-requirements.schema.js +37 -0
  85. package/src/entities/disclosures/schemas/webwallet-presentation-request.schema.js +79 -0
  86. package/src/entities/index.js +6 -0
  87. package/src/entities/issuing/domain/constants.js +8 -0
  88. package/src/entities/issuing/domain/does-user-have-fresh-pending-verification.js +26 -0
  89. package/src/entities/issuing/domain/get-credentials-from-offers.js +18 -0
  90. package/src/entities/issuing/domain/index.js +5 -0
  91. package/src/entities/issuing/index.js +5 -0
  92. package/src/entities/issuing/orchestrators/build-issuing-input-credentials.js +35 -0
  93. package/src/entities/issuing/orchestrators/generate-offers-by-deep-link.js +74 -0
  94. package/src/entities/issuing/orchestrators/get-identity-issuer.js +35 -0
  95. package/src/entities/issuing/orchestrators/get-identity-offers-by-deeplink.js +74 -0
  96. package/src/entities/issuing/orchestrators/index.js +6 -0
  97. package/src/entities/issuing/schemas/index.js +9 -0
  98. package/src/entities/issuing/schemas/webwallet-credential-manifest.schema.js +198 -0
  99. package/src/errors/error-codes.js +12 -0
  100. package/src/fetchers/career-wallet/create-account-fetcher.js +7 -0
  101. package/src/fetchers/career-wallet/create-did-fetcher.js +17 -0
  102. package/src/fetchers/career-wallet/get-app-config.js +11 -0
  103. package/src/fetchers/career-wallet/get-consents.js +13 -0
  104. package/src/fetchers/career-wallet/get-credential-categories.js +7 -0
  105. package/src/fetchers/career-wallet/get-personas.js +7 -0
  106. package/src/fetchers/career-wallet/index.js +12 -0
  107. package/src/fetchers/career-wallet/post-consent.js +9 -0
  108. package/src/fetchers/career-wallet/send-feedback.js +14 -0
  109. package/src/fetchers/career-wallet/sign-fetcher.js +14 -0
  110. package/src/fetchers/career-wallet/verify-id-credential-confirm-code.js +19 -0
  111. package/src/fetchers/career-wallet/verify-id-credential-request-code.js +20 -0
  112. package/src/fetchers/index.js +4 -0
  113. package/src/fetchers/lib-api/get-credential-display-schema.js +12 -0
  114. package/src/fetchers/lib-api/index.js +3 -0
  115. package/src/fetchers/linkedin/create-linkedin-post.js +45 -0
  116. package/src/fetchers/linkedin/get-access-token.js +26 -0
  117. package/src/fetchers/linkedin/get-linkedin-user-email.js +13 -0
  118. package/src/fetchers/linkedin/get-linkedin-user-id.js +16 -0
  119. package/src/fetchers/linkedin/index.js +9 -0
  120. package/src/fetchers/linkedin/register-image-to-upload.js +30 -0
  121. package/src/fetchers/linkedin/revoke-linkedin-access.js +20 -0
  122. package/src/fetchers/linkedin/upload-image-to-linkedin.js +16 -0
  123. package/src/index.js +15 -0
  124. package/src/init-server.js +108 -0
  125. package/src/plugins/crypto-services/index.js +5 -0
  126. package/src/plugins/crypto-services/jwt-sign-service-impl.js +72 -0
  127. package/src/plugins/crypto-services/jwt-verify-service-impl.js +21 -0
  128. package/src/plugins/crypto-services/key-service-impl.js +28 -0
  129. package/src/plugins/fetch-errors-handler-plugin.js +64 -0
  130. package/src/plugins/index.js +4 -0
  131. package/src/plugins/vnf-sdk-plugin.js +53 -0
  132. package/src/standalone.js +8 -0
  133. package/test/accounts-controller.test.js +618 -0
  134. package/test/consent-controller.test.js +185 -0
  135. package/test/credentials-controller.test.js +307 -0
  136. package/test/crypro-services/jwt-sign-service-impl.test.js +83 -0
  137. package/test/crypro-services/jwt-verify-service-impl.test.js +27 -0
  138. package/test/crypro-services/key-service-impl.test.js +76 -0
  139. package/test/crypro-services/mocks/index.js +4 -0
  140. package/test/crypro-services/mocks/jwt-mock.js +15 -0
  141. package/test/crypro-services/mocks/public-jwk.js +14 -0
  142. package/test/disclosures-controller/disclosure-credentials.test.js +428 -0
  143. package/test/disclosures-controller/get-disclosures.test.js +169 -0
  144. package/test/disclosures-controller/mocks/get-credential-manifest.js +20 -0
  145. package/test/disclosures-controller/mocks/index.js +6 -0
  146. package/test/disclosures-controller/mocks/presentation-request.js +32 -0
  147. package/test/disclosures-controller/mocks/presentation-submission.js +21 -0
  148. package/test/disclosures-controller/mocks/submission-result.js +19 -0
  149. package/test/factories/accounts.js +25 -0
  150. package/test/factories/credentials.js +66 -0
  151. package/test/factories/disclosures.js +106 -0
  152. package/test/feedback-controller.test.js +125 -0
  153. package/test/fetch-errors-handler-plugin.test.js +97 -0
  154. package/test/filter-deleted-credentials-extension.test.js +82 -0
  155. package/test/helpers/.env.test +10 -0
  156. package/test/helpers/nock-consent-add.js +16 -0
  157. package/test/helpers/nock-consents-get.js +15 -0
  158. package/test/helpers/nock-feedback.js +9 -0
  159. package/test/helpers/nock-linkedin-access-token.js +9 -0
  160. package/test/helpers/nock-linkedin-email.js +15 -0
  161. package/test/helpers/nock-linkedin-image-register.js +28 -0
  162. package/test/helpers/nock-linkedin-me.js +13 -0
  163. package/test/helpers/nock-linkedin-post.js +37 -0
  164. package/test/helpers/nock-linkedin-revoke.js +9 -0
  165. package/test/helpers/nock-test-personas.js +13 -0
  166. package/test/helpers/webwallet-build-fastify.js +17 -0
  167. package/test/issuing-controller/issuing-by-deeplink-empty-offers.test.js +142 -0
  168. package/test/issuing-controller/issuing-by-deeplink-failed-offers.test.js +142 -0
  169. package/test/issuing-controller/issuing-by-deeplink.test.js +492 -0
  170. package/test/issuing-controller/issuing-identity-credentials.test.js +377 -0
  171. package/test/issuing-controller/mocks/accept-offers-response.js +90 -0
  172. package/test/issuing-controller/mocks/accepted-credentials.js +47 -0
  173. package/test/issuing-controller/mocks/credential-manifest-presentation.js +72 -0
  174. package/test/issuing-controller/mocks/credential-manifest.js +45 -0
  175. package/test/issuing-controller/mocks/identity-issuing/accept-offers.js +22 -0
  176. package/test/issuing-controller/mocks/identity-issuing/confirm-verification-code.js +5 -0
  177. package/test/issuing-controller/mocks/identity-issuing/get-app-config.js +52 -0
  178. package/test/issuing-controller/mocks/identity-issuing/get-organization.js +118 -0
  179. package/test/issuing-controller/mocks/identity-issuing/index.js +6 -0
  180. package/test/issuing-controller/mocks/index.js +6 -0
  181. package/test/issuing-controller/mocks/issuers.js +126 -0
  182. package/test/issuing-controller/mocks/offers.js +48 -0
  183. package/test/issuing-controller/mocks/schema.js +107 -0
  184. package/test/linkedin-controller.test.js +452 -0
  185. package/test/mocks/credential-categories.js +115 -0
  186. package/test/mocks/credentials.js +15 -0
  187. package/test/mocks/didjwk.js +25 -0
  188. package/test/mocks/index.js +7 -0
  189. package/test/mocks/issuers.js +88 -0
  190. package/test/mocks/jwk.js +53 -0
  191. package/test/mocks/schema.js +107 -0
  192. package/test/root.test.js +42 -0
  193. package/test/vcl-sdk-plugin.test.js +86 -0
@@ -0,0 +1,14 @@
1
+ const { VCLPublicJwk } = require('@velocitycareerlabs/vnf-nodejs-wallet-sdk');
2
+
3
+ const PublicJwkJsonMock = {
4
+ kty: 'EC',
5
+ crv: 'secp256k1',
6
+ x: 'CRE774Y_2vG-u6dke0Jd3aXkwTxZA6M_zp6vNDtVky4',
7
+ y: 'Y-hHu-EIyGHaQE7fjlYUYAgiUjqjdW6UyHhr69QYM-8',
8
+ use: 'sig',
9
+ };
10
+ const PublicJwk = VCLPublicJwk.fromJSON(PublicJwkJsonMock);
11
+
12
+ module.exports = {
13
+ PublicJwk,
14
+ };
@@ -0,0 +1,428 @@
1
+ const nock = require('nock');
2
+ const { mongoDb } = require('@spencejs/spence-mongo-repos');
3
+ const { ObjectId } = require('mongodb');
4
+ const { jwtDecode } = require('@velocitycareerlabs/jwt');
5
+ const { errorResponseMatcher } = require('@velocitycareerlabs/tests-helpers');
6
+ const { omit } = require('lodash/fp');
7
+ const {
8
+ VCLProvider,
9
+ VCLPresentationRequestDescriptor,
10
+ VCLDeepLink,
11
+ } = require('@velocitycareerlabs/vnf-nodejs-wallet-sdk');
12
+
13
+ const initAccountsFactory = require('../factories/accounts');
14
+
15
+ jest.mock('@velocitycareerlabs/vnf-nodejs-wallet-sdk', () => {
16
+ const {
17
+ presentationRequestMock,
18
+ submissionResultMock,
19
+ getCredentialManifestMock,
20
+ } = require('./mocks');
21
+ const originalModule = jest.requireActual(
22
+ '@velocitycareerlabs/vnf-nodejs-wallet-sdk'
23
+ );
24
+
25
+ return {
26
+ ...originalModule,
27
+ VCLProvider: {
28
+ getInstance: jest.fn().mockReturnValue({
29
+ initialize: jest.fn().mockResolvedValue(null),
30
+ getPresentationRequest: jest
31
+ .fn()
32
+ .mockResolvedValue(presentationRequestMock),
33
+ getCredentialManifest: jest
34
+ .fn()
35
+ .mockResolvedValue(getCredentialManifestMock),
36
+ submitPresentation: jest.fn().mockResolvedValue(submissionResultMock),
37
+ }),
38
+ },
39
+ };
40
+ });
41
+
42
+ const vclSdk = VCLProvider.getInstance();
43
+
44
+ const buildFastify = require('../helpers/webwallet-build-fastify');
45
+ const { CredentialMocks } = require('../mocks/credentials');
46
+ const { presentationSubmissionMock } = require('./mocks');
47
+ const { submissionResultMock } = require('./mocks/submission-result');
48
+ const { WebWalletServerError } = require('../../src/errors/error-codes');
49
+
50
+ const idToken =
51
+ // eslint-disable-next-line max-len
52
+ 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IktFWSJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0LyIsImF1ZCI6ImZvbyIsInNjb3BlIjoicmVhZDp1c2VycyJ9.VwIIUqx9T-AxqbfL_FyNRAeOxTwiC2JpcwtrqnEWN3DdF07ijUkF1WYy8Ahfr_p4R3KnoPbiefZnIbVANCt-lt0ej32rfil2yHhQEsvFxSOjcrx6ARmPp0YAfWlN-5Sotzkxy29jaOZMEDkmRFZg3jkdC7wosPW_S6M-olC4g3HHfylpZI8O3Jdd87Qr9wD_QtUzANwnPbl2Q-9NEyxVjAZIWg_HWK9JAAaf_2IY5VwHBvyp0oeQSEHKi4hogcM59EOc4FxdR5WH45B_PenVa6W4mHFBkH8sAXxt2Zs9s2efujkfWYfyXvgL_lN7vT-TEADlAPP2L6CpWpDISOMsQWUSgGHcN_KwRh_E7qJwahR6mv4QHY6ReEoyjkmSS3swrD1l74jNs7QLAdsMywvzCMDsHabs7DYcEMGQBdP14PJ_ucLFnkivZeBDAc6sS445ocbyrpyO40XMaMorD5khRd9ej89SxR7d_v0W6Ne2Nn4XgW3pAZzu5Rdc4JvqfzLFxkp95jxy1MTAddjWISPmNOYYyXHM9SSqSpqVECOFS0f4z2zycHRqXUcOytWrvED6VGo9x7-IVCgu8vFzj0zToIWQmsDs3UoH9RnV12z0PMwGXQzca1lT_zGwJxBF3e4zJjmcJ05OMF2JgZ2_G48O3M4Dtb0jlgWbKLd0kWlIFzQ';
53
+
54
+ describe('Test disclosure credentials controller', () => {
55
+ let fastify;
56
+ let persistAccounts;
57
+ const userId = '1234567890';
58
+ const did = 'did:example:123';
59
+
60
+ beforeAll(async () => {
61
+ fastify = buildFastify();
62
+
63
+ await fastify.ready();
64
+
65
+ ({ persistAccounts } = initAccountsFactory(fastify));
66
+
67
+ await persistAccounts({
68
+ userId,
69
+ did,
70
+ });
71
+ });
72
+
73
+ beforeEach(async () => {
74
+ nock('https://localhost/').get('/.well-known/jwks.json').reply(200, jwks);
75
+ });
76
+
77
+ afterEach(async () => {
78
+ nock.cleanAll();
79
+ jest.clearAllMocks();
80
+ await mongoDb().collection('disclosures').deleteMany();
81
+ });
82
+
83
+ afterAll(async () => {
84
+ nock.restore();
85
+ await mongoDb().collection('accounts').deleteMany();
86
+ await fastify.close();
87
+ });
88
+
89
+ describe('GET /disclosures/get-presentation-request - get information about presentation', () => {
90
+ it('should return presentation data successfully', async () => {
91
+ const response = await fastify.injectJson({
92
+ method: 'GET',
93
+ url: `/disclosures/get-presentation-request?link=${encodeURIComponent(
94
+ inspectionDeepLink
95
+ )}`,
96
+ headers: {
97
+ authorization: `Bearer ${idToken}`,
98
+ },
99
+ });
100
+
101
+ expect(response.statusCode).toBe(200);
102
+
103
+ expect(vclSdk.getPresentationRequest).toBeCalledTimes(1);
104
+ expect(vclSdk.getPresentationRequest).toBeCalledWith(
105
+ new VCLPresentationRequestDescriptor(
106
+ new VCLDeepLink(inspectionDeepLink)
107
+ )
108
+ );
109
+
110
+ expect(response.json).toEqual({
111
+ presentation: {
112
+ exchange_id: expect.any(String),
113
+ exp: expect.any(Number),
114
+ iat: expect.any(Number),
115
+ iss: expect.any(String),
116
+ metadata: expect.any(Object),
117
+ nbf: expect.any(Number),
118
+ presentation_definition: expect.any(Object),
119
+ },
120
+ });
121
+ });
122
+
123
+ it('should return 401 if no access token is provided', async () => {
124
+ const response = await fastify.injectJson({
125
+ method: 'GET',
126
+ url: `/disclosures/get-presentation-request?link=${encodeURIComponent(
127
+ inspectionDeepLink
128
+ )}`,
129
+ });
130
+
131
+ expect(response.statusCode).toBe(401);
132
+
133
+ expect(response.json).toEqual(
134
+ errorResponseMatcher({
135
+ error: 'Unauthorized',
136
+ message: 'Missing Authorization HTTP header.',
137
+ errorCode: WebWalletServerError,
138
+ statusCode: 401,
139
+ })
140
+ );
141
+ });
142
+
143
+ it('should return 400 if no link is provided', async () => {
144
+ const response = await fastify.injectJson({
145
+ method: 'GET',
146
+ url: '/disclosures/get-presentation-request',
147
+ headers: {
148
+ authorization: `Bearer ${idToken}`,
149
+ },
150
+ });
151
+
152
+ expect(response.statusCode).toBe(400);
153
+
154
+ expect(response.json).toEqual(
155
+ errorResponseMatcher({
156
+ error: 'Bad Request',
157
+ errorCode: 'request_validation_failed',
158
+ message:
159
+ // eslint-disable-next-line max-len
160
+ "querystring must have required property 'link', querystring must have required property 'public_share', querystring must match exactly one schema in oneOf",
161
+ statusCode: 400,
162
+ })
163
+ );
164
+ });
165
+ });
166
+
167
+ describe('POST /disclosures/accept-presentation-request - accept presentation of selected credentials', () => {
168
+ it('should accept presentation successfully', async () => {
169
+ const { presentationRequestMock } = require('./mocks');
170
+
171
+ const response = await fastify.injectJson({
172
+ method: 'POST',
173
+ url: '/disclosures/accept-presentation-request',
174
+ payload: {
175
+ link: inspectionDeepLink,
176
+ credentials: [
177
+ {
178
+ id: 'credential_id',
179
+ inputDescriptor: 'EducationDegreeGraduationV1.1',
180
+ jwtVc: CredentialMocks.JwtCredentialEmail,
181
+ },
182
+ ],
183
+ },
184
+ headers: {
185
+ authorization: `Bearer ${idToken}`,
186
+ },
187
+ });
188
+
189
+ expect(response.statusCode).toBe(200);
190
+
191
+ expect(vclSdk.getPresentationRequest).toBeCalledTimes(1);
192
+ expect(vclSdk.getPresentationRequest).toBeCalledWith(
193
+ new VCLPresentationRequestDescriptor(
194
+ new VCLDeepLink(inspectionDeepLink),
195
+ null,
196
+ null,
197
+ null
198
+ )
199
+ );
200
+
201
+ const { payload: presentation } = jwtDecode(
202
+ presentationRequestMock.jwt.encodedJwt
203
+ );
204
+
205
+ expect(vclSdk.submitPresentation).toBeCalledTimes(1);
206
+ expect(vclSdk.submitPresentation).toBeCalledWith(
207
+ expect.objectContaining({
208
+ exchangeId: submissionResultMock.exchange.id,
209
+ submitUri: presentationSubmissionMock.submitUri,
210
+ presentationDefinitionId: presentation.presentation_definition.id,
211
+ verifiableCredentials: [
212
+ {
213
+ id: 'credential_id',
214
+ inputDescriptor: 'EducationDegreeGraduationV1.1',
215
+ jwtVc: CredentialMocks.JwtCredentialEmail,
216
+ },
217
+ ],
218
+ })
219
+ );
220
+ const savedDisclosure = await mongoDb()
221
+ .collection('disclosures')
222
+ .findOne();
223
+
224
+ expect(savedDisclosure).toEqual({
225
+ _id: expect.any(ObjectId),
226
+ auth0UserId: userId,
227
+ userDid: did,
228
+ presentation,
229
+ encodedJwt: presentationRequestMock.jwt.encodedJwt,
230
+ jti: submissionResultMock.jti,
231
+ submissionId: submissionResultMock.submissionId,
232
+ presentationDefinitionId: presentation.presentation_definition.id,
233
+ token: submissionResultMock.sessionToken.value,
234
+ sharedCredentials: ['credential_id'],
235
+ createdAt: expect.any(Date),
236
+ updatedAt: expect.any(Date),
237
+ });
238
+
239
+ expect({
240
+ disclosure: {
241
+ ...omit(['_id', 'auth0UserId', 'userDid'], savedDisclosure),
242
+ id: savedDisclosure._id.toString(),
243
+ updatedAt: savedDisclosure.updatedAt.toISOString(),
244
+ createdAt: savedDisclosure.createdAt.toISOString(),
245
+ },
246
+ }).toEqual(response.json);
247
+ });
248
+
249
+ it('should return 401 if no access token is provided', async () => {
250
+ const response = await fastify.injectJson({
251
+ method: 'POST',
252
+ url: '/disclosures/accept-presentation-request',
253
+ payload: {
254
+ link: inspectionDeepLink,
255
+ credentials: [],
256
+ },
257
+ });
258
+
259
+ expect(response.statusCode).toBe(401);
260
+
261
+ expect(response.json).toEqual(
262
+ errorResponseMatcher({
263
+ error: 'Unauthorized',
264
+ errorCode: WebWalletServerError,
265
+ message: 'Missing Authorization HTTP header.',
266
+ statusCode: 401,
267
+ })
268
+ );
269
+ });
270
+
271
+ it('should return 400 if no link is provided', async () => {
272
+ const response = await fastify.injectJson({
273
+ method: 'POST',
274
+ url: '/disclosures/accept-presentation-request',
275
+ payload: {
276
+ credentials: [
277
+ {
278
+ inputDescriptor: 'EducationDegreeGraduationV1.1',
279
+ jwtVc: 'encoded_credential',
280
+ },
281
+ ],
282
+ },
283
+ headers: {
284
+ authorization: `Bearer ${idToken}`,
285
+ },
286
+ });
287
+
288
+ expect(response.statusCode).toBe(400);
289
+
290
+ expect(response.json).toEqual(
291
+ errorResponseMatcher({
292
+ error: 'Bad Request',
293
+ errorCode: 'request_validation_failed',
294
+ message: "body must have required property 'link'",
295
+ statusCode: 400,
296
+ })
297
+ );
298
+ });
299
+
300
+ it('should return 400 if no credentials are provided', async () => {
301
+ const response = await fastify.injectJson({
302
+ method: 'POST',
303
+ url: '/disclosures/accept-presentation-request',
304
+ payload: {
305
+ link: inspectionDeepLink,
306
+ },
307
+ headers: {
308
+ authorization: `Bearer ${idToken}`,
309
+ },
310
+ });
311
+
312
+ expect(response.statusCode).toBe(400);
313
+
314
+ expect(response.json).toEqual(
315
+ errorResponseMatcher({
316
+ error: 'Bad Request',
317
+ errorCode: 'request_validation_failed',
318
+ message: "body must have required property 'credentials'",
319
+ statusCode: 400,
320
+ })
321
+ );
322
+ });
323
+
324
+ it('should return 400 if the list of credentials is empty array', async () => {
325
+ const response = await fastify.injectJson({
326
+ method: 'POST',
327
+ url: '/disclosures/accept-presentation-request',
328
+ payload: {
329
+ link: inspectionDeepLink,
330
+ credentials: [],
331
+ },
332
+ headers: {
333
+ authorization: `Bearer ${idToken}`,
334
+ },
335
+ });
336
+
337
+ expect(response.statusCode).toBe(400);
338
+
339
+ expect(response.json).toEqual(
340
+ errorResponseMatcher({
341
+ error: 'Bad Request',
342
+ errorCode: 'request_validation_failed',
343
+ message: 'body/credentials must NOT have fewer than 1 items',
344
+ statusCode: 400,
345
+ })
346
+ );
347
+ });
348
+ });
349
+
350
+ describe('GET /disclosures/get-public-share-link - get pre-configured deep link to disclosure creds to public service', () => {
351
+ it('Should return pre-configured link from app config', async () => {
352
+ const appConfig = {
353
+ verificationServiceDeepLink: 'test-deep-link://s67s7a5ca8c',
354
+ verificationServicePresentationLinkTemplate:
355
+ 'https://example.com/presentations/{linkCode}',
356
+ };
357
+
358
+ const nockAppConfig = nock(fastify.config.careerWalletUrl)
359
+ .get('/api/v0.6/careerwallet/appconfig')
360
+ .once()
361
+ .reply(200, appConfig);
362
+
363
+ const response = await fastify.injectJson({
364
+ url: '/disclosures/get-public-share-link',
365
+ method: 'GET',
366
+ headers: {
367
+ authorization: `Bearer ${idToken}`,
368
+ },
369
+ });
370
+
371
+ expect(response.statusCode).toBe(200);
372
+
373
+ expect(nockAppConfig.isDone()).toBeTruthy();
374
+
375
+ expect(response.json).toEqual({
376
+ link: appConfig.verificationServiceDeepLink,
377
+ template: appConfig.verificationServicePresentationLinkTemplate,
378
+ });
379
+ });
380
+ });
381
+ });
382
+
383
+ const jwks = {
384
+ keys: [
385
+ {
386
+ alg: 'RS512',
387
+ kid: 'KEY',
388
+ x5c: ['UNUSED'],
389
+ },
390
+ {
391
+ alg: 'RS256',
392
+ kid: 'KEY',
393
+ x5c: [
394
+ `
395
+ MIIEnjCCAoYCCQDmnGII6qzGlTANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZ1
396
+ bnVzZWQwHhcNMjEwOTE5MDcxODQ2WhcNMjExMDE5MDcxODQ2WjARMQ8wDQYDVQQD
397
+ DAZ1bnVzZWQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDY2acJ8JAH
398
+ XjK8j3sAXOokSWwvaEg65UJS0C7KdnfbLTeaeYFHBRY0v9Jkk/PJSXv9hMWw1aD3
399
+ n7NrhVwXeRXi/7VZuW/S4ek+hK+IMDvpKqzn+XeCpaMoRpAgloADeNY0qhYKxpr2
400
+ L0SmRQDwVy1r/g31ECewD2WpEiRSmXsQ2Q2uYT3V60BmbhUw31KGEr4SLXL9pzmb
401
+ arOH/5Rhqg+YFMywNY6i01S3UdOlUtAyWT/mVRAkVTsUEou9tBw61zputPdMrl7p
402
+ d4InmlfCmXNTPFh9EDczPQiAVPq8MDyEdRGP134+HM9+YgQUZjy+WsxmGEvplJIf
403
+ KrYtlWe11//oAXC3690LUYtvg49lNY4+H0/nngjnCDXkZo6f+PEvnBZfYl596VTV
404
+ Fx4FGNOqLwg4bAyE5j5jXtEGW1oKo1pxBg7Oe3MteQUDwMrONB3CbxdxDiN3YH94
405
+ 2nWGW9Le+CeA1QUhfjQqSoZRJURGYGoztVuIXOElnkrgwcJreX4b8y+Uo5kpp2By
406
+ 6UUaD/mMj9XQ+Ygp/J8DlJlqDXOIp6JUJ75aSK5ZIjRtWq/Go5RUjW9IW0ldEehh
407
+ /4j0ZWC0vR1/le2UmAE6tXhkH4sdx9JM84V+qRzjiGqQx3Wn00uwMiHHhte17t41
408
+ vk+b75wuHbfiq9R8irL6wqWeeuzvCC37NwIDAQABMA0GCSqGSIb3DQEBCwUAA4IC
409
+ AQCZOT6S5HLUp0gBtWK6Fxyzb9lWPE+AJipjJ80lS3OnaOIyVtyJexJ2BjTKWldJ
410
+ 48zkzLNIRsTEGEipNS6NkrkElfmoaNBpdbDch2WBkME3UYlFIR9GgbXPMlACQlwJ
411
+ f4qT3iIZ9zjpVMP8F63TzRRr7KEYW2PGHEtVQktMPprGEfU4Sz0OIa9RRV+BLsfh
412
+ x8he2pimJEzoEaWPgyJXV1S+tLUif8A/CEkZVRZ2vADA7WMGl2ZTdbmsTjXh4bf2
413
+ A4l4Zec+jwOjUPiEk5lLJwv1KeYos9wuUczAk7ku8wRzyZbrjwgRam9VQA5qmRzJ
414
+ PegEQwJaKMRu8PPK0L4KFN4v3ma7Ux6D719nko8mZ0kA2oUs6phsFmoWQfsbRbsD
415
+ CdUGnM2fPp6V285r9w9Y6+1nVdtJpbAPFJR3SxIpfYVfx3tI6C3BR9bIMr8uCf81
416
+ G+Ebvo4qTuY6Cg/mTpPLZ4cKpwSvB6cE+xeSHvKIRYm6QUYEReRxQ3b4aUKBSNwl
417
+ FEQufVGhGzeblNC3fjP+mMtqbyC8c1zkHc6tjJYO5yesKf8bjO71by2jgSced7nN
418
+ 5JvJawfEcabgHJ1aAFLj0tlPMrViFzu6y8/A5aZLc5UMISXAZXfB4wIEdyUUXJh4
419
+ rJKE/ZCb2+W8g29N5cv2P6nhahT3mYatMiQ0U/gfaIrA0A==
420
+ `.trim(),
421
+ ],
422
+ },
423
+ ],
424
+ };
425
+
426
+ const inspectionDeepLink =
427
+ // eslint-disable-next-line max-len
428
+ 'velocity-network-devnet://inspect?request_uri=https%3A%2F%2Fdevagent.velocitycareerlabs.io%2Fapi%2Fholder%2Fv0.6%2Forg%2Fdid%3Aion%3AEiApMLdMb4NPb8sae9-hXGHP79W1gisApVSE80USPEbtJA%2Finspect%2Fget-presentation-request%3Fid%3D6576d7de30b7cd12f669d900&inspectorDid=did%3Aion%3AEiApMLdMb4NPb8sae9-hXGHP79W1gisApVSE80USPEbtJA';
@@ -0,0 +1,169 @@
1
+ const { mongoDb } = require('@spencejs/spence-mongo-repos');
2
+ const { omit } = require('lodash/fp');
3
+ const nock = require('nock');
4
+
5
+ const buildFastify = require('../helpers/webwallet-build-fastify');
6
+ const initDisclosuresFactory = require('../factories/disclosures');
7
+
8
+ const auth0Token =
9
+ // eslint-disable-next-line max-len
10
+ 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IktFWSJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0LyIsImF1ZCI6ImZvbyIsInNjb3BlIjoicmVhZDp1c2VycyJ9.VwIIUqx9T-AxqbfL_FyNRAeOxTwiC2JpcwtrqnEWN3DdF07ijUkF1WYy8Ahfr_p4R3KnoPbiefZnIbVANCt-lt0ej32rfil2yHhQEsvFxSOjcrx6ARmPp0YAfWlN-5Sotzkxy29jaOZMEDkmRFZg3jkdC7wosPW_S6M-olC4g3HHfylpZI8O3Jdd87Qr9wD_QtUzANwnPbl2Q-9NEyxVjAZIWg_HWK9JAAaf_2IY5VwHBvyp0oeQSEHKi4hogcM59EOc4FxdR5WH45B_PenVa6W4mHFBkH8sAXxt2Zs9s2efujkfWYfyXvgL_lN7vT-TEADlAPP2L6CpWpDISOMsQWUSgGHcN_KwRh_E7qJwahR6mv4QHY6ReEoyjkmSS3swrD1l74jNs7QLAdsMywvzCMDsHabs7DYcEMGQBdP14PJ_ucLFnkivZeBDAc6sS445ocbyrpyO40XMaMorD5khRd9ej89SxR7d_v0W6Ne2Nn4XgW3pAZzu5Rdc4JvqfzLFxkp95jxy1MTAddjWISPmNOYYyXHM9SSqSpqVECOFS0f4z2zycHRqXUcOytWrvED6VGo9x7-IVCgu8vFzj0zToIWQmsDs3UoH9RnV12z0PMwGXQzca1lT_zGwJxBF3e4zJjmcJ05OMF2JgZ2_G48O3M4Dtb0jlgWbKLd0kWlIFzQ';
11
+
12
+ jest.mock('@velocitycareerlabs/vnf-nodejs-wallet-sdk', () => {
13
+ const originalModule = jest.requireActual(
14
+ '@velocitycareerlabs/vnf-nodejs-wallet-sdk'
15
+ );
16
+
17
+ return {
18
+ ...originalModule,
19
+ VCLProvider: {
20
+ getInstance: jest.fn().mockReturnValue({
21
+ initialize: jest.fn().mockResolvedValue(null),
22
+ }),
23
+ },
24
+ };
25
+ });
26
+
27
+ describe('Test Disclosures controller, get disclosures list', () => {
28
+ let fastify;
29
+ let persistDisclosures;
30
+
31
+ beforeAll(async () => {
32
+ fastify = buildFastify();
33
+
34
+ nock('https://localhost/').get('/.well-known/jwks.json').reply(200, jwks);
35
+ await fastify.ready();
36
+
37
+ await mongoDb().collection('disclosures').deleteMany({});
38
+
39
+ ({ persistDisclosures } = initDisclosuresFactory(fastify));
40
+ });
41
+
42
+ afterEach(async () => {
43
+ nock.cleanAll();
44
+ await mongoDb().collection('disclosures').deleteMany({});
45
+ });
46
+
47
+ afterAll(async () => {
48
+ nock.restore();
49
+ await fastify.close();
50
+ });
51
+
52
+ describe('GET /disclosures - get list of disclosures for current user', () => {
53
+ it('should return all disclosures for current user only', async () => {
54
+ const [currentUserDisclosure1, currentUserDisclosure2] =
55
+ await Promise.all([
56
+ persistDisclosures(),
57
+ persistDisclosures({
58
+ jti: '8b67c34b-5920-4527-a86f-qwds234rvwf',
59
+ submissionId: 'a46e7063-8d2d-4e21-b9f0-e9e8ac359341',
60
+ }),
61
+ persistDisclosures({
62
+ auth0UserId: 'anotherUserId',
63
+ userDid: 'did:test-user:2',
64
+ }),
65
+ ]);
66
+
67
+ const response = await fastify.injectJson({
68
+ method: 'GET',
69
+ url: '/disclosures',
70
+ headers: {
71
+ authorization: `Bearer ${auth0Token}`,
72
+ },
73
+ });
74
+
75
+ expect(response.statusCode).toBe(200);
76
+ expect(response.json.disclosures.length).toBe(2);
77
+ expect(response.json).toEqual({
78
+ disclosures: expect.arrayContaining(
79
+ [currentUserDisclosure2, currentUserDisclosure1].map(
80
+ (disclosure) => ({
81
+ ...omit(['_id', 'auth0UserId', 'userDid'])(disclosure),
82
+ id: expect.any(String),
83
+ })
84
+ )
85
+ ),
86
+ });
87
+ });
88
+
89
+ it('should return empty array of disclosures if there are no items in DB for current user Id', async () => {
90
+ await Promise.all([
91
+ persistDisclosures({
92
+ auth0UserId: 'anotherUserId1',
93
+ userDid: 'did:test-user:2',
94
+ }),
95
+ persistDisclosures({
96
+ auth0UserId: 'anotherUserId2',
97
+ userDid: 'did:test-user:2',
98
+ }),
99
+ ]);
100
+
101
+ const response = await fastify.injectJson({
102
+ method: 'GET',
103
+ url: '/disclosures',
104
+ headers: {
105
+ authorization: `Bearer ${auth0Token}`,
106
+ },
107
+ });
108
+
109
+ expect(response.statusCode).toBe(200);
110
+
111
+ expect(response.json).toEqual({ disclosures: [] });
112
+ });
113
+
114
+ it('should return error 401 if there is incorrect token', async () => {
115
+ const response = await fastify.injectJson({
116
+ method: 'GET',
117
+ url: '/disclosures',
118
+ headers: {
119
+ authorization: 'Bearer randomIncorrectToken',
120
+ },
121
+ });
122
+
123
+ expect(response.statusCode).toBe(401);
124
+ });
125
+ });
126
+ });
127
+
128
+ const jwks = {
129
+ keys: [
130
+ {
131
+ alg: 'RS512',
132
+ kid: 'KEY',
133
+ x5c: ['UNUSED'],
134
+ },
135
+ {
136
+ alg: 'RS256',
137
+ kid: 'KEY',
138
+ x5c: [
139
+ `
140
+ MIIEnjCCAoYCCQDmnGII6qzGlTANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZ1
141
+ bnVzZWQwHhcNMjEwOTE5MDcxODQ2WhcNMjExMDE5MDcxODQ2WjARMQ8wDQYDVQQD
142
+ DAZ1bnVzZWQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDY2acJ8JAH
143
+ XjK8j3sAXOokSWwvaEg65UJS0C7KdnfbLTeaeYFHBRY0v9Jkk/PJSXv9hMWw1aD3
144
+ n7NrhVwXeRXi/7VZuW/S4ek+hK+IMDvpKqzn+XeCpaMoRpAgloADeNY0qhYKxpr2
145
+ L0SmRQDwVy1r/g31ECewD2WpEiRSmXsQ2Q2uYT3V60BmbhUw31KGEr4SLXL9pzmb
146
+ arOH/5Rhqg+YFMywNY6i01S3UdOlUtAyWT/mVRAkVTsUEou9tBw61zputPdMrl7p
147
+ d4InmlfCmXNTPFh9EDczPQiAVPq8MDyEdRGP134+HM9+YgQUZjy+WsxmGEvplJIf
148
+ KrYtlWe11//oAXC3690LUYtvg49lNY4+H0/nngjnCDXkZo6f+PEvnBZfYl596VTV
149
+ Fx4FGNOqLwg4bAyE5j5jXtEGW1oKo1pxBg7Oe3MteQUDwMrONB3CbxdxDiN3YH94
150
+ 2nWGW9Le+CeA1QUhfjQqSoZRJURGYGoztVuIXOElnkrgwcJreX4b8y+Uo5kpp2By
151
+ 6UUaD/mMj9XQ+Ygp/J8DlJlqDXOIp6JUJ75aSK5ZIjRtWq/Go5RUjW9IW0ldEehh
152
+ /4j0ZWC0vR1/le2UmAE6tXhkH4sdx9JM84V+qRzjiGqQx3Wn00uwMiHHhte17t41
153
+ vk+b75wuHbfiq9R8irL6wqWeeuzvCC37NwIDAQABMA0GCSqGSIb3DQEBCwUAA4IC
154
+ AQCZOT6S5HLUp0gBtWK6Fxyzb9lWPE+AJipjJ80lS3OnaOIyVtyJexJ2BjTKWldJ
155
+ 48zkzLNIRsTEGEipNS6NkrkElfmoaNBpdbDch2WBkME3UYlFIR9GgbXPMlACQlwJ
156
+ f4qT3iIZ9zjpVMP8F63TzRRr7KEYW2PGHEtVQktMPprGEfU4Sz0OIa9RRV+BLsfh
157
+ x8he2pimJEzoEaWPgyJXV1S+tLUif8A/CEkZVRZ2vADA7WMGl2ZTdbmsTjXh4bf2
158
+ A4l4Zec+jwOjUPiEk5lLJwv1KeYos9wuUczAk7ku8wRzyZbrjwgRam9VQA5qmRzJ
159
+ PegEQwJaKMRu8PPK0L4KFN4v3ma7Ux6D719nko8mZ0kA2oUs6phsFmoWQfsbRbsD
160
+ CdUGnM2fPp6V285r9w9Y6+1nVdtJpbAPFJR3SxIpfYVfx3tI6C3BR9bIMr8uCf81
161
+ G+Ebvo4qTuY6Cg/mTpPLZ4cKpwSvB6cE+xeSHvKIRYm6QUYEReRxQ3b4aUKBSNwl
162
+ FEQufVGhGzeblNC3fjP+mMtqbyC8c1zkHc6tjJYO5yesKf8bjO71by2jgSced7nN
163
+ 5JvJawfEcabgHJ1aAFLj0tlPMrViFzu6y8/A5aZLc5UMISXAZXfB4wIEdyUUXJh4
164
+ rJKE/ZCb2+W8g29N5cv2P6nhahT3mYatMiQ0U/gfaIrA0A==
165
+ `.trim(),
166
+ ],
167
+ },
168
+ ],
169
+ };
@@ -0,0 +1,20 @@
1
+ /* eslint-disable max-len */
2
+ const getCredentialManifestMock = {
3
+ jwt: {
4
+ signedJwt: {
5
+ header:
6
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6aW9uOkVpQWVoV21wWDVtSEJ1YzkzU0loUFhGOGJzRXg2OEc2bVBjZElhTE5HYm96UEEjZXhjaGFuZ2Uta2V5LTEifQ',
7
+ payload:
8
+ 'eyJleGNoYW5nZV9pZCI6IjY1OTU0NmI0NzYwNTlkMmNmNzFiYTU0YiIsIm1ldGFkYXRhIjp7ImNsaWVudF9uYW1lIjoiVmVsb2NpdHkgQ2FyZWVyIExhYnMiLCJsb2dvX3VyaSI6Imh0dHBzOi8vbWVkaWEtZXhwMS5saWNkbi5jb20vZG1zL2ltYWdlL0M0RTBCQVFHYjJoQmFJZlRMTXcvY29tcGFueS1sb2dvXzIwMF8yMDAvMC8xNTc5MDgxNTY4OTAyP2U9MjE0NzQ4MzY0NyZ2PWJldGEmdD1NT2pJTS1lc0wxZmduOHNxLVNiLW1fRnBrTVExbktvS0RvVWZPYnNnaGdBIiwidG9zX3VyaSI6Imh0dHBzOi8vd3d3LnZlbG9jaXR5ZXhwZXJpZW5jZWNlbnRlci5jb20vdGVybXMtYW5kLWNvbmRpdGlvbnMtdm5mIiwibWF4X3JldGVudGlvbl9wZXJpb2QiOiIybSIsInByb2dyZXNzX3VyaSI6Imh0dHBzOi8vZGV2dmVyaWZhZ2VudC52ZWxvY2l0eWNhcmVlcmxhYnMuaW8vYXBpL2hvbGRlci92MC42L29yZy9kaWQ6aW9uOkVpQWVoV21wWDVtSEJ1YzkzU0loUFhGOGJzRXg2OEc2bVBjZElhTE5HYm96UEEvZ2V0LWV4Y2hhbmdlLXByb2dyZXNzIiwic3VibWl0X3ByZXNlbnRhdGlvbl91cmkiOiJodHRwczovL2RldnZlcmlmYWdlbnQudmVsb2NpdHljYXJlZXJsYWJzLmlvL2FwaS9ob2xkZXIvdjAuNi9vcmcvZGlkOmlvbjpFaUFlaFdtcFg1bUhCdWM5M1NJaFBYRjhic0V4NjhHNm1QY2RJYUxOR2JvelBBL2lzc3VlL3N1Ym1pdC1pZGVudGlmaWNhdGlvbiIsImNoZWNrX29mZmVyc191cmkiOiJodHRwczovL2RldnZlcmlmYWdlbnQudmVsb2NpdHljYXJlZXJsYWJzLmlvL2FwaS9ob2xkZXIvdjAuNi9vcmcvZGlkOmlvbjpFaUFlaFdtcFg1bUhCdWM5M1NJaFBYRjhic0V4NjhHNm1QY2RJYUxOR2JvelBBL2lzc3VlL2NyZWRlbnRpYWwtb2ZmZXJzIiwiZmluYWxpemVfb2ZmZXJzX3VyaSI6Imh0dHBzOi8vZGV2dmVyaWZhZ2VudC52ZWxvY2l0eWNhcmVlcmxhYnMuaW8vYXBpL2hvbGRlci92MC42L29yZy9kaWQ6aW9uOkVpQWVoV21wWDVtSEJ1YzkzU0loUFhGOGJzRXg2OEc2bVBjZElhTE5HYm96UEEvaXNzdWUvZmluYWxpemUtb2ZmZXJzIn0sInByZXNlbnRhdGlvbl9kZWZpbml0aW9uIjp7ImlkIjoiNjU5NTQ2YjQ3NjA1OWQyY2Y3MWJhNTRiLjYzNGU1NjIwZmUyNThlZjQ1ODBkM2M2MyIsInB1cnBvc2UiOiJDcmVkZW50aWFsIElzc3VhbmNlIiwibmFtZSI6IlNoYXJlIHlvdXIgSWQsIEVtYWlsIGFuZCBQaG9uZSBOdW1iZXIgdG8gZmFjaWxpdGF0ZSB0aGUgc2VhcmNoIGZvciB5b3VyIGNhcmVlciBjcmVkZW50aWFscyIsImZvcm1hdCI6eyJqd3RfdnAiOnsiYWxnIjpbInNlY3AyNTZrMSJdfX0sImlucHV0X2Rlc2NyaXB0b3JzIjpbeyJpZCI6IlBob25lVjEuMCIsIm5hbWUiOiJQaG9uZSIsInNjaGVtYSI6W3sidXJpIjoiaHR0cHM6Ly9kZXZsaWIudmVsb2NpdHluZXR3b3JrLmZvdW5kYXRpb24vc2NoZW1hcy9waG9uZS12MS4wLnNjaGVtYS5qc29uIn1dLCJncm91cCI6WyJBIl19LHsiaWQiOiJFbWFpbFYxLjAiLCJuYW1lIjoiRW1haWwiLCJzY2hlbWEiOlt7InVyaSI6Imh0dHBzOi8vZGV2bGliLnZlbG9jaXR5bmV0d29yay5mb3VuZGF0aW9uL3NjaGVtYXMvZW1haWwtdjEuMC5zY2hlbWEuanNvbiJ9XSwiZ3JvdXAiOlsiQSJdfSx7ImlkIjoiRHJpdmVyc0xpY2Vuc2VWMS4wIiwibmFtZSI6IkRyaXZlcidzIGxpY2Vuc2UiLCJzY2hlbWEiOlt7InVyaSI6Imh0dHBzOi8vZGV2bGliLnZlbG9jaXR5bmV0d29yay5mb3VuZGF0aW9uL3NjaGVtYXMvZHJpdmVycy1saWNlbnNlLXYxLjAuc2NoZW1hLmpzb24ifV0sImdyb3VwIjpbIkEiXX0seyJpZCI6IlBhc3Nwb3J0VjEuMCIsIm5hbWUiOiJQYXNzcG9ydCIsInNjaGVtYSI6W3sidXJpIjoiaHR0cHM6Ly9kZXZsaWIudmVsb2NpdHluZXR3b3JrLmZvdW5kYXRpb24vc2NoZW1hcy9wYXNzcG9ydC12MS4wLnNjaGVtYS5qc29uIn1dLCJncm91cCI6WyJBIl19XSwic3VibWlzc2lvbl9yZXF1aXJlbWVudHMiOlt7InJ1bGUiOiJhbGwiLCJmcm9tIjoiQSIsIm1pbiI6NH1dfSwib3V0cHV0X2Rlc2NyaXB0b3JzIjpbXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmlvbjpFaUFlaFdtcFg1bUhCdWM5M1NJaFBYRjhic0V4NjhHNm1QY2RJYUxOR2JvelBBIn0sIm5iZiI6MTcwNDI4MTc4MCwiaXNzIjoiZGlkOmlvbjpFaUFlaFdtcFg1bUhCdWM5M1NJaFBYRjhic0V4NjhHNm1QY2RJYUxOR2JvelBBIiwiZXhwIjoxNzA0ODg2NTgwLCJpYXQiOjE3MDQyODE3ODB9',
9
+ signature:
10
+ 'U-rMyXUYebl9ZNeLCFejYUrT5g4OJR2rfJ0s8Z3atnbGsavB3fUe-KDIQ8Gdg99Bn_XpnjcjXZ-BPw2sH9smUw',
11
+ },
12
+ encodedJwt:
13
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6aW9uOkVpQWVoV21wWDVtSEJ1YzkzU0loUFhGOGJzRXg2OEc2bVBjZElhTE5HYm96UEEjZXhjaGFuZ2Uta2V5LTEifQ.eyJleGNoYW5nZV9pZCI6IjY1OTU0NmI0NzYwNTlkMmNmNzFiYTU0YiIsIm1ldGFkYXRhIjp7ImNsaWVudF9uYW1lIjoiVmVsb2NpdHkgQ2FyZWVyIExhYnMiLCJsb2dvX3VyaSI6Imh0dHBzOi8vbWVkaWEtZXhwMS5saWNkbi5jb20vZG1zL2ltYWdlL0M0RTBCQVFHYjJoQmFJZlRMTXcvY29tcGFueS1sb2dvXzIwMF8yMDAvMC8xNTc5MDgxNTY4OTAyP2U9MjE0NzQ4MzY0NyZ2PWJldGEmdD1NT2pJTS1lc0wxZmduOHNxLVNiLW1fRnBrTVExbktvS0RvVWZPYnNnaGdBIiwidG9zX3VyaSI6Imh0dHBzOi8vd3d3LnZlbG9jaXR5ZXhwZXJpZW5jZWNlbnRlci5jb20vdGVybXMtYW5kLWNvbmRpdGlvbnMtdm5mIiwibWF4X3JldGVudGlvbl9wZXJpb2QiOiIybSIsInByb2dyZXNzX3VyaSI6Imh0dHBzOi8vZGV2dmVyaWZhZ2VudC52ZWxvY2l0eWNhcmVlcmxhYnMuaW8vYXBpL2hvbGRlci92MC42L29yZy9kaWQ6aW9uOkVpQWVoV21wWDVtSEJ1YzkzU0loUFhGOGJzRXg2OEc2bVBjZElhTE5HYm96UEEvZ2V0LWV4Y2hhbmdlLXByb2dyZXNzIiwic3VibWl0X3ByZXNlbnRhdGlvbl91cmkiOiJodHRwczovL2RldnZlcmlmYWdlbnQudmVsb2NpdHljYXJlZXJsYWJzLmlvL2FwaS9ob2xkZXIvdjAuNi9vcmcvZGlkOmlvbjpFaUFlaFdtcFg1bUhCdWM5M1NJaFBYRjhic0V4NjhHNm1QY2RJYUxOR2JvelBBL2lzc3VlL3N1Ym1pdC1pZGVudGlmaWNhdGlvbiIsImNoZWNrX29mZmVyc191cmkiOiJodHRwczovL2RldnZlcmlmYWdlbnQudmVsb2NpdHljYXJlZXJsYWJzLmlvL2FwaS9ob2xkZXIvdjAuNi9vcmcvZGlkOmlvbjpFaUFlaFdtcFg1bUhCdWM5M1NJaFBYRjhic0V4NjhHNm1QY2RJYUxOR2JvelBBL2lzc3VlL2NyZWRlbnRpYWwtb2ZmZXJzIiwiZmluYWxpemVfb2ZmZXJzX3VyaSI6Imh0dHBzOi8vZGV2dmVyaWZhZ2VudC52ZWxvY2l0eWNhcmVlcmxhYnMuaW8vYXBpL2hvbGRlci92MC42L29yZy9kaWQ6aW9uOkVpQWVoV21wWDVtSEJ1YzkzU0loUFhGOGJzRXg2OEc2bVBjZElhTE5HYm96UEEvaXNzdWUvZmluYWxpemUtb2ZmZXJzIn0sInByZXNlbnRhdGlvbl9kZWZpbml0aW9uIjp7ImlkIjoiNjU5NTQ2YjQ3NjA1OWQyY2Y3MWJhNTRiLjYzNGU1NjIwZmUyNThlZjQ1ODBkM2M2MyIsInB1cnBvc2UiOiJDcmVkZW50aWFsIElzc3VhbmNlIiwibmFtZSI6IlNoYXJlIHlvdXIgSWQsIEVtYWlsIGFuZCBQaG9uZSBOdW1iZXIgdG8gZmFjaWxpdGF0ZSB0aGUgc2VhcmNoIGZvciB5b3VyIGNhcmVlciBjcmVkZW50aWFscyIsImZvcm1hdCI6eyJqd3RfdnAiOnsiYWxnIjpbInNlY3AyNTZrMSJdfX0sImlucHV0X2Rlc2NyaXB0b3JzIjpbeyJpZCI6IlBob25lVjEuMCIsIm5hbWUiOiJQaG9uZSIsInNjaGVtYSI6W3sidXJpIjoiaHR0cHM6Ly9kZXZsaWIudmVsb2NpdHluZXR3b3JrLmZvdW5kYXRpb24vc2NoZW1hcy9waG9uZS12MS4wLnNjaGVtYS5qc29uIn1dLCJncm91cCI6WyJBIl19LHsiaWQiOiJFbWFpbFYxLjAiLCJuYW1lIjoiRW1haWwiLCJzY2hlbWEiOlt7InVyaSI6Imh0dHBzOi8vZGV2bGliLnZlbG9jaXR5bmV0d29yay5mb3VuZGF0aW9uL3NjaGVtYXMvZW1haWwtdjEuMC5zY2hlbWEuanNvbiJ9XSwiZ3JvdXAiOlsiQSJdfSx7ImlkIjoiRHJpdmVyc0xpY2Vuc2VWMS4wIiwibmFtZSI6IkRyaXZlcidzIGxpY2Vuc2UiLCJzY2hlbWEiOlt7InVyaSI6Imh0dHBzOi8vZGV2bGliLnZlbG9jaXR5bmV0d29yay5mb3VuZGF0aW9uL3NjaGVtYXMvZHJpdmVycy1saWNlbnNlLXYxLjAuc2NoZW1hLmpzb24ifV0sImdyb3VwIjpbIkEiXX0seyJpZCI6IlBhc3Nwb3J0VjEuMCIsIm5hbWUiOiJQYXNzcG9ydCIsInNjaGVtYSI6W3sidXJpIjoiaHR0cHM6Ly9kZXZsaWIudmVsb2NpdHluZXR3b3JrLmZvdW5kYXRpb24vc2NoZW1hcy9wYXNzcG9ydC12MS4wLnNjaGVtYS5qc29uIn1dLCJncm91cCI6WyJBIl19XSwic3VibWlzc2lvbl9yZXF1aXJlbWVudHMiOlt7InJ1bGUiOiJhbGwiLCJmcm9tIjoiQSIsIm1pbiI6NH1dfSwib3V0cHV0X2Rlc2NyaXB0b3JzIjpbXSwiaXNzdWVyIjp7ImlkIjoiZGlkOmlvbjpFaUFlaFdtcFg1bUhCdWM5M1NJaFBYRjhic0V4NjhHNm1QY2RJYUxOR2JvelBBIn0sIm5iZiI6MTcwNDI4MTc4MCwiaXNzIjoiZGlkOmlvbjpFaUFlaFdtcFg1bUhCdWM5M1NJaFBYRjhic0V4NjhHNm1QY2RJYUxOR2JvelBBIiwiZXhwIjoxNzA0ODg2NTgwLCJpYXQiOjE3MDQyODE3ODB9.U-rMyXUYebl9ZNeLCFejYUrT5g4OJR2rfJ0s8Z3atnbGsavB3fUe-KDIQ8Gdg99Bn_XpnjcjXZ-BPw2sH9smUw',
14
+ },
15
+ vendorOriginContext: '3ozF14srt3drS_9lL3p1e',
16
+ };
17
+
18
+ module.exports = {
19
+ getCredentialManifestMock,
20
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ ...require('./presentation-submission'),
3
+ ...require('./presentation-request'),
4
+ ...require('./get-credential-manifest'),
5
+ ...require('./submission-result'),
6
+ };
@@ -0,0 +1,32 @@
1
+ /* eslint-disable max-len */
2
+ const {
3
+ VCLJwt,
4
+ VCLVerifiedProfile,
5
+ VCLDeepLink,
6
+ VCLPresentationRequest,
7
+ } = require('@velocitycareerlabs/vnf-nodejs-wallet-sdk');
8
+ const { DidJwkMocks } = require('../../mocks/didjwk');
9
+
10
+ const EncodedJwt =
11
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6aW9uOkVpQXBNTGRNYjROUGI4c2FlOS1oWEdIUDc5VzFnaXNBcFZTRTgwVVNQRWJ0SkEjZXhjaGFuZ2Uta2V5LTEifQ.eyJleGNoYW5nZV9pZCI6IjY1Nzg4NjM5NzcwNzkwYTBmZGZmN2M4ZSIsIm1ldGFkYXRhIjp7ImNsaWVudF9uYW1lIjoiVW5pdmVyc2l0eSBvZiBNYXNzYWNodXNldHRzIEFtaGVyc3QiLCJsb2dvX3VyaSI6Imh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvNC80Zi9VTWFzc19TZWFsX01lZGl1bV9QTVNfMjAyLnBuZyIsInRvc191cmkiOiJodHRwczovL3d3dy52ZWxvY2l0eWV4cGVyaWVuY2VjZW50ZXIuY29tL3Rlcm1zLWFuZC1jb25kaXRpb25zLXZuZiIsIm1heF9yZXRlbnRpb25fcGVyaW9kIjoiNm0iLCJwcm9ncmVzc191cmkiOiJodHRwczovL2RldmFnZW50LnZlbG9jaXR5Y2FyZWVybGFicy5pby9hcGkvaG9sZGVyL3YwLjYvb3JnL2RpZDppb246RWlBcE1MZE1iNE5QYjhzYWU5LWhYR0hQNzlXMWdpc0FwVlNFODBVU1BFYnRKQS9nZXQtZXhjaGFuZ2UtcHJvZ3Jlc3MiLCJzdWJtaXRfcHJlc2VudGF0aW9uX3VyaSI6Imh0dHBzOi8vZGV2YWdlbnQudmVsb2NpdHljYXJlZXJsYWJzLmlvL2FwaS9ob2xkZXIvdjAuNi9vcmcvZGlkOmlvbjpFaUFwTUxkTWI0TlBiOHNhZTktaFhHSFA3OVcxZ2lzQXBWU0U4MFVTUEVidEpBL2luc3BlY3Qvc3VibWl0LXByZXNlbnRhdGlvbiJ9LCJwcmVzZW50YXRpb25fZGVmaW5pdGlvbiI6eyJpZCI6IjY1Nzg4NjM5NzcwNzkwYTBmZGZmN2M4ZS42NTc2ZDdkZTMwYjdjZDEyZjY2OWQ5MDAiLCJwdXJwb3NlIjoiSm9iIEFwcGxpY2F0aW9uIiwiZm9ybWF0Ijp7Imp3dF92cCI6eyJhbGciOlsic2VjcDI1NmsxIl19fSwiaW5wdXRfZGVzY3JpcHRvcnMiOlt7ImlkIjoiQXNzZXNzbWVudFYxLjEiLCJuYW1lIjoiQXNzZXNzbWVudCIsInNjaGVtYSI6W3sidXJpIjoiaHR0cHM6Ly9kZXZsaWIudmVsb2NpdHluZXR3b3JrLmZvdW5kYXRpb24vc2NoZW1hcy9hc3Nlc3NtZW50LXYxLjEuc2NoZW1hLmpzb24ifV0sImdyb3VwIjpbIkEiXX0seyJpZCI6IkNlcnRpZmljYXRpb25WMS4xIiwibmFtZSI6IkNlcnRpZmljYXRpb24iLCJzY2hlbWEiOlt7InVyaSI6Imh0dHBzOi8vZGV2bGliLnZlbG9jaXR5bmV0d29yay5mb3VuZGF0aW9uL3NjaGVtYXMvY2VydGlmaWNhdGlvbi12MS4xLnNjaGVtYS5qc29uIn1dLCJncm91cCI6WyJBIl19LHsiaWQiOiJFZHVjYXRpb25EZWdyZWVHcmFkdWF0aW9uVjEuMSIsIm5hbWUiOiJFZHVjYXRpb24gZGVncmVlIGdyYWR1YXRpb24iLCJzY2hlbWEiOlt7InVyaSI6Imh0dHBzOi8vZGV2bGliLnZlbG9jaXR5bmV0d29yay5mb3VuZGF0aW9uL3NjaGVtYXMvZWR1Y2F0aW9uLWRlZ3JlZS1ncmFkdWF0aW9uLXYxLjEuc2NoZW1hLmpzb24ifV0sImdyb3VwIjpbIkEiXX1dLCJzdWJtaXNzaW9uX3JlcXVpcmVtZW50cyI6W3sicnVsZSI6InBpY2siLCJmcm9tIjoiQSIsIm1pbiI6MX1dfSwibmJmIjoxNzAyMzk3NDk3LCJpc3MiOiJkaWQ6aW9uOkVpQXBNTGRNYjROUGI4c2FlOS1oWEdIUDc5VzFnaXNBcFZTRTgwVVNQRWJ0SkEiLCJleHAiOjE3MDMwMDIyOTcsImlhdCI6MTcwMjM5NzQ5N30.DuNydjzxXQ2Q0tUZl8sgjmGF_9KyRY3z8WfAekozSe9eFLKgQNoigRLRwukAX-GAJOEBuZjrV8zYc7pMuP5OUA';
12
+ const Jwt = VCLJwt.fromEncodedJwt(EncodedJwt);
13
+ const VerifiableProfile = new VCLVerifiedProfile({});
14
+ const DeepLinkStr = `{
15
+ "value": "velocity-network-devnet://inspect?request_uri=https%3A%2F%2Fdevagent.velocitycareerlabs.io%2Fapi%2Fholder%2Fv0.6%2Forg%2Fdid%3Aion%3AEiApMLdMb4NPb8sae9-hXGHP79W1gisApVSE80USPEbtJA%2Finspect%2Fget-presentation-request%3Fid%3D6576d7de30b7cd12f669d900&inspectorDid=did%3Aion%3AEiApMLdMb4NPb8sae9-hXGHP79W1gisApVSE80USPEbtJA",
16
+ "did": "did:ion:EiApMLdMb4NPb8sae9-hXGHP79W1gisApVSE80USPEbtJA",
17
+ "requestUri": "https://devagent.velocitycareerlabs.io/api/holder/v0.6/org/did:ion:EiApMLdMb4NPb8sae9-hXGHP79W1gisApVSE80USPEbtJA/inspect/get-presentation-request?id=6576d7de30b7cd12f669d900&inspectorDid=did%3Aion%3AEiApMLdMb4NPb8sae9-hXGHP79W1gisApVSE80USPEbtJA"
18
+ }`;
19
+ const DeepLink = new VCLDeepLink(DeepLinkStr);
20
+
21
+ const presentationRequestMock = new VCLPresentationRequest(
22
+ Jwt,
23
+ VerifiableProfile,
24
+ DeepLink,
25
+ null,
26
+ DidJwkMocks.DidJwk,
27
+ null
28
+ );
29
+
30
+ module.exports = {
31
+ presentationRequestMock,
32
+ };