@sphereon/ssi-sdk.data-store 0.11.1-unstable.64

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 (100) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +67 -0
  3. package/dist/contact/AbstractContactStore.d.ts +15 -0
  4. package/dist/contact/AbstractContactStore.d.ts.map +1 -0
  5. package/dist/contact/AbstractContactStore.js +7 -0
  6. package/dist/contact/AbstractContactStore.js.map +1 -0
  7. package/dist/contact/ContactStore.d.ts +30 -0
  8. package/dist/contact/ContactStore.d.ts.map +1 -0
  9. package/dist/contact/ContactStore.js +281 -0
  10. package/dist/contact/ContactStore.js.map +1 -0
  11. package/dist/entities/contact/BaseConfigEntity.d.ts +5 -0
  12. package/dist/entities/contact/BaseConfigEntity.d.ts.map +1 -0
  13. package/dist/entities/contact/BaseConfigEntity.js +26 -0
  14. package/dist/entities/contact/BaseConfigEntity.js.map +1 -0
  15. package/dist/entities/contact/ConnectionEntity.d.ts +12 -0
  16. package/dist/entities/contact/ConnectionEntity.d.ts.map +1 -0
  17. package/dist/entities/contact/ConnectionEntity.js +66 -0
  18. package/dist/entities/contact/ConnectionEntity.js.map +1 -0
  19. package/dist/entities/contact/ContactEntity.d.ts +16 -0
  20. package/dist/entities/contact/ContactEntity.d.ts.map +1 -0
  21. package/dist/entities/contact/ContactEntity.js +108 -0
  22. package/dist/entities/contact/ContactEntity.js.map +1 -0
  23. package/dist/entities/contact/CorrelationIdentifierEntity.d.ts +12 -0
  24. package/dist/entities/contact/CorrelationIdentifierEntity.d.ts.map +1 -0
  25. package/dist/entities/contact/CorrelationIdentifierEntity.js +76 -0
  26. package/dist/entities/contact/CorrelationIdentifierEntity.js.map +1 -0
  27. package/dist/entities/contact/DidAuthConfigEntity.d.ts +11 -0
  28. package/dist/entities/contact/DidAuthConfigEntity.d.ts.map +1 -0
  29. package/dist/entities/contact/DidAuthConfigEntity.js +49 -0
  30. package/dist/entities/contact/DidAuthConfigEntity.js.map +1 -0
  31. package/dist/entities/contact/IdentityEntity.d.ts +22 -0
  32. package/dist/entities/contact/IdentityEntity.d.ts.map +1 -0
  33. package/dist/entities/contact/IdentityEntity.js +137 -0
  34. package/dist/entities/contact/IdentityEntity.js.map +1 -0
  35. package/dist/entities/contact/IdentityMetadataItemEntity.d.ts +12 -0
  36. package/dist/entities/contact/IdentityMetadataItemEntity.d.ts.map +1 -0
  37. package/dist/entities/contact/IdentityMetadataItemEntity.js +73 -0
  38. package/dist/entities/contact/IdentityMetadataItemEntity.js.map +1 -0
  39. package/dist/entities/contact/OpenIdConfigEntity.d.ts +15 -0
  40. package/dist/entities/contact/OpenIdConfigEntity.d.ts.map +1 -0
  41. package/dist/entities/contact/OpenIdConfigEntity.js +70 -0
  42. package/dist/entities/contact/OpenIdConfigEntity.js.map +1 -0
  43. package/dist/index.d.ts +16 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +59 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/migrations/generic/1-CreateContacts.d.ts +7 -0
  48. package/dist/migrations/generic/1-CreateContacts.d.ts.map +1 -0
  49. package/dist/migrations/generic/1-CreateContacts.js +72 -0
  50. package/dist/migrations/generic/1-CreateContacts.js.map +1 -0
  51. package/dist/migrations/generic/index.d.ts +10 -0
  52. package/dist/migrations/generic/index.d.ts.map +1 -0
  53. package/dist/migrations/generic/index.js +13 -0
  54. package/dist/migrations/generic/index.js.map +1 -0
  55. package/dist/migrations/index.d.ts +2 -0
  56. package/dist/migrations/index.d.ts.map +1 -0
  57. package/dist/migrations/index.js +6 -0
  58. package/dist/migrations/index.js.map +1 -0
  59. package/dist/migrations/internal-migrations-ormconfig.d.ts +6 -0
  60. package/dist/migrations/internal-migrations-ormconfig.d.ts.map +1 -0
  61. package/dist/migrations/internal-migrations-ormconfig.js +29 -0
  62. package/dist/migrations/internal-migrations-ormconfig.js.map +1 -0
  63. package/dist/migrations/postgres/1659463079428-CreateContacts.d.ts +7 -0
  64. package/dist/migrations/postgres/1659463079428-CreateContacts.d.ts.map +1 -0
  65. package/dist/migrations/postgres/1659463079428-CreateContacts.js +55 -0
  66. package/dist/migrations/postgres/1659463079428-CreateContacts.js.map +1 -0
  67. package/dist/migrations/sqlite/1659463069549-CreateContacts.d.ts +7 -0
  68. package/dist/migrations/sqlite/1659463069549-CreateContacts.d.ts.map +1 -0
  69. package/dist/migrations/sqlite/1659463069549-CreateContacts.js +79 -0
  70. package/dist/migrations/sqlite/1659463069549-CreateContacts.js.map +1 -0
  71. package/dist/types/IAbstractContactStore.d.ts +41 -0
  72. package/dist/types/IAbstractContactStore.d.ts.map +1 -0
  73. package/dist/types/IAbstractContactStore.js +3 -0
  74. package/dist/types/IAbstractContactStore.js.map +1 -0
  75. package/dist/types/contact.d.ts +91 -0
  76. package/dist/types/contact.d.ts.map +1 -0
  77. package/dist/types/contact.js +21 -0
  78. package/dist/types/contact.js.map +1 -0
  79. package/package.json +45 -0
  80. package/src/__tests__/contact.entities.test.ts +911 -0
  81. package/src/__tests__/contact.store.test.ts +743 -0
  82. package/src/contact/AbstractContactStore.ts +26 -0
  83. package/src/contact/ContactStore.ts +373 -0
  84. package/src/entities/contact/BaseConfigEntity.ts +8 -0
  85. package/src/entities/contact/ConnectionEntity.ts +48 -0
  86. package/src/entities/contact/ContactEntity.ts +76 -0
  87. package/src/entities/contact/CorrelationIdentifierEntity.ts +41 -0
  88. package/src/entities/contact/DidAuthConfigEntity.ts +31 -0
  89. package/src/entities/contact/IdentityEntity.ts +106 -0
  90. package/src/entities/contact/IdentityMetadataItemEntity.ts +39 -0
  91. package/src/entities/contact/OpenIdConfigEntity.ts +48 -0
  92. package/src/index.ts +45 -0
  93. package/src/migrations/generic/1-CreateContacts.ts +54 -0
  94. package/src/migrations/generic/index.ts +10 -0
  95. package/src/migrations/index.ts +1 -0
  96. package/src/migrations/internal-migrations-ormconfig.ts +28 -0
  97. package/src/migrations/postgres/1659463079428-CreateContacts.ts +61 -0
  98. package/src/migrations/sqlite/1659463069549-CreateContacts.ts +111 -0
  99. package/src/types/IAbstractContactStore.ts +51 -0
  100. package/src/types/contact.ts +101 -0
@@ -0,0 +1,743 @@
1
+ import { DataSource } from 'typeorm'
2
+
3
+ import { ContactStore } from '../contact/ContactStore'
4
+ import { CorrelationIdentifierEnum, DataStoreContactEntities, DataStoreMigrations, IdentityRoleEnum } from '../index'
5
+
6
+ describe('Database entities test', () => {
7
+ let dbConnection: DataSource
8
+ let contactStore: ContactStore
9
+
10
+ beforeEach(async () => {
11
+ dbConnection = await new DataSource({
12
+ type: 'sqlite',
13
+ database: ':memory:',
14
+ //logging: 'all',
15
+ migrationsRun: false,
16
+ migrations: DataStoreMigrations,
17
+ synchronize: false,
18
+ entities: DataStoreContactEntities,
19
+ }).initialize()
20
+ await dbConnection.runMigrations()
21
+ expect(await dbConnection.showMigrations()).toBeFalsy()
22
+ contactStore = new ContactStore(dbConnection)
23
+ })
24
+
25
+ afterEach(async () => {
26
+ await (await dbConnection).destroy()
27
+ })
28
+
29
+ it('should get contact by id', async () => {
30
+ const contact = {
31
+ name: 'test_name',
32
+ alias: 'test_alias',
33
+ uri: 'example.com',
34
+ }
35
+ const savedContact = await contactStore.addContact(contact)
36
+ expect(savedContact).toBeDefined()
37
+
38
+ const result = await contactStore.getContact({ contactId: savedContact.id })
39
+
40
+ expect(result).toBeDefined()
41
+ })
42
+
43
+ it('should throw error when getting contact with unknown id', async () => {
44
+ const contactId = 'unknownContactId'
45
+
46
+ await expect(contactStore.getContact({ contactId })).rejects.toThrow(`No contact found for id: ${contactId}`)
47
+ })
48
+
49
+ it('should get all contacts', async () => {
50
+ const contact1 = {
51
+ name: 'test_name1',
52
+ alias: 'test_alias1',
53
+ uri: 'example.com1',
54
+ }
55
+ const savedContact1 = await contactStore.addContact(contact1)
56
+ expect(savedContact1).toBeDefined()
57
+
58
+ const contact2 = {
59
+ name: 'test_name2',
60
+ alias: 'test_alias2',
61
+ uri: 'example.com2',
62
+ }
63
+ const savedContact2 = await contactStore.addContact(contact2)
64
+ expect(savedContact2).toBeDefined()
65
+
66
+ const result = await contactStore.getContacts()
67
+
68
+ expect(result.length).toEqual(2)
69
+ })
70
+
71
+ it('should get contacts by filter', async () => {
72
+ const contact = {
73
+ name: 'test_name',
74
+ alias: 'test_alias',
75
+ uri: 'example.com',
76
+ }
77
+ const savedContact = await contactStore.addContact(contact)
78
+ expect(savedContact).toBeDefined()
79
+
80
+ const args = {
81
+ filter: [{ name: 'test_name' }, { alias: 'test_alias' }, { uri: 'example.com' }],
82
+ }
83
+ const result = await contactStore.getContacts(args)
84
+
85
+ expect(result.length).toEqual(1)
86
+ })
87
+
88
+ it('should get whole contacts by filter', async () => {
89
+ const contact = {
90
+ name: 'test_name',
91
+ alias: 'test_alias',
92
+ uri: 'example.com',
93
+ identities: [
94
+ {
95
+ alias: 'test_alias1',
96
+ roles: [IdentityRoleEnum.ISSUER],
97
+ identifier: {
98
+ type: CorrelationIdentifierEnum.DID,
99
+ correlationId: 'example_did1',
100
+ },
101
+ },
102
+ {
103
+ alias: 'test_alias2',
104
+ roles: [IdentityRoleEnum.VERIFIER],
105
+ identifier: {
106
+ type: CorrelationIdentifierEnum.DID,
107
+ correlationId: 'example_did2',
108
+ },
109
+ },
110
+ {
111
+ alias: 'test_alias3',
112
+ roles: [IdentityRoleEnum.HOLDER],
113
+ identifier: {
114
+ type: CorrelationIdentifierEnum.DID,
115
+ correlationId: 'example_did3',
116
+ },
117
+ },
118
+ ],
119
+ }
120
+ const savedContact = await contactStore.addContact(contact)
121
+ expect(savedContact).toBeDefined()
122
+
123
+ const args = {
124
+ filter: [
125
+ {
126
+ identities: {
127
+ identifier: {
128
+ correlationId: 'example_did1',
129
+ },
130
+ },
131
+ },
132
+ ],
133
+ }
134
+ const result = await contactStore.getContacts(args)
135
+
136
+ expect(result[0].identities.length).toEqual(3)
137
+ })
138
+
139
+ it('should get contacts by name', async () => {
140
+ const contact = {
141
+ name: 'test_name',
142
+ alias: 'test_alias',
143
+ uri: 'example.com',
144
+ }
145
+ const savedContact = await contactStore.addContact(contact)
146
+ expect(savedContact).toBeDefined()
147
+
148
+ const args = {
149
+ filter: [{ name: 'test_name' }],
150
+ }
151
+ const result = await contactStore.getContacts(args)
152
+
153
+ expect(result.length).toEqual(1)
154
+ })
155
+
156
+ it('should get contacts by alias', async () => {
157
+ const contact = {
158
+ name: 'test_name',
159
+ alias: 'test_alias',
160
+ uri: 'example.com',
161
+ }
162
+ const savedContact = await contactStore.addContact(contact)
163
+ expect(savedContact).toBeDefined()
164
+
165
+ const args = {
166
+ filter: [{ alias: 'test_alias' }],
167
+ }
168
+ const result = await contactStore.getContacts(args)
169
+
170
+ expect(result.length).toEqual(1)
171
+ })
172
+
173
+ it('should get contacts by uri', async () => {
174
+ const contact = {
175
+ name: 'test_name',
176
+ alias: 'test_alias',
177
+ uri: 'example.com',
178
+ }
179
+ const savedContact = await contactStore.addContact(contact)
180
+ expect(savedContact).toBeDefined()
181
+
182
+ const args = {
183
+ filter: [{ uri: 'example.com' }],
184
+ }
185
+ const result = await contactStore.getContacts(args)
186
+
187
+ expect(result.length).toEqual(1)
188
+ })
189
+
190
+ it('should return no contacts if filter does not match', async () => {
191
+ const args = {
192
+ filter: [{ name: 'no_match_contact' }, { alias: 'no_match_contact_alias' }, { uri: 'no_match_example.com' }],
193
+ }
194
+ const result = await contactStore.getContacts(args)
195
+
196
+ expect(result.length).toEqual(0)
197
+ })
198
+
199
+ it('should add contact without identities', async () => {
200
+ const contact = {
201
+ name: 'test_name',
202
+ alias: 'test_alias',
203
+ uri: 'example.com',
204
+ }
205
+
206
+ const result = await contactStore.addContact(contact)
207
+
208
+ expect(result.name).toEqual(contact.name)
209
+ expect(result.alias).toEqual(contact.alias)
210
+ expect(result.uri).toEqual(contact.uri)
211
+ })
212
+
213
+ it('should add contact with identities', async () => {
214
+ const contact = {
215
+ name: 'test_name',
216
+ alias: 'test_alias',
217
+ uri: 'example.com',
218
+ identities: [
219
+ {
220
+ alias: 'test_alias1',
221
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
222
+ identifier: {
223
+ type: CorrelationIdentifierEnum.DID,
224
+ correlationId: 'example_did1',
225
+ },
226
+ },
227
+ {
228
+ alias: 'test_alias2',
229
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
230
+ identifier: {
231
+ type: CorrelationIdentifierEnum.DID,
232
+ correlationId: 'example_did2',
233
+ },
234
+ },
235
+ ],
236
+ }
237
+
238
+ const result = await contactStore.addContact(contact)
239
+
240
+ expect(result.name).toEqual(contact.name)
241
+ expect(result.alias).toEqual(contact.alias)
242
+ expect(result.uri).toEqual(contact.uri)
243
+ expect(result.identities.length).toEqual(2)
244
+ })
245
+
246
+ it('should throw error when adding contact with invalid identity', async () => {
247
+ const contact = {
248
+ name: 'test_name',
249
+ alias: 'test_alias',
250
+ uri: 'example.com',
251
+ identities: [
252
+ {
253
+ alias: 'test_alias1',
254
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
255
+ identifier: {
256
+ type: CorrelationIdentifierEnum.DID,
257
+ correlationId: 'example_did1',
258
+ },
259
+ },
260
+ {
261
+ alias: 'test_alias2',
262
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
263
+ identifier: {
264
+ type: CorrelationIdentifierEnum.DID,
265
+ correlationId: 'example_did2',
266
+ },
267
+ },
268
+ ],
269
+ }
270
+
271
+ const result = await contactStore.addContact(contact)
272
+
273
+ expect(result.name).toEqual(contact.name)
274
+ expect(result.alias).toEqual(contact.alias)
275
+ expect(result.uri).toEqual(contact.uri)
276
+ expect(result.identities.length).toEqual(2)
277
+ })
278
+
279
+ it('should throw error when adding contact with duplicate name', async () => {
280
+ const name = 'test_name'
281
+ const contact1 = {
282
+ name,
283
+ alias: 'test_alias',
284
+ uri: 'example.com',
285
+ }
286
+ const savedContact1 = await contactStore.addContact(contact1)
287
+ expect(savedContact1).toBeDefined()
288
+
289
+ const alias = 'test_alias2'
290
+ const contact2 = {
291
+ name,
292
+ alias,
293
+ uri: 'example.com',
294
+ }
295
+
296
+ await expect(contactStore.addContact(contact2)).rejects.toThrow(`Duplicate names or aliases are not allowed. Name: ${name}, Alias: ${alias}`)
297
+ })
298
+
299
+ it('should throw error when adding contact with duplicate alias', async () => {
300
+ const alias = 'test_alias'
301
+ const contact1 = {
302
+ name: 'test_name',
303
+ alias,
304
+ uri: 'example.com',
305
+ }
306
+ const savedContact1 = await contactStore.addContact(contact1)
307
+ expect(savedContact1).toBeDefined()
308
+
309
+ const name = 'test_name2'
310
+ const contact2 = {
311
+ name,
312
+ alias,
313
+ uri: 'example.com',
314
+ }
315
+
316
+ await expect(contactStore.addContact(contact2)).rejects.toThrow(`Duplicate names or aliases are not allowed. Name: ${name}, Alias: ${alias}`)
317
+ })
318
+
319
+ it('should update contact by id', async () => {
320
+ const contact = {
321
+ name: 'test_name',
322
+ alias: 'test_alias',
323
+ uri: 'example.com',
324
+ }
325
+ const savedContact = await contactStore.addContact(contact)
326
+ expect(savedContact).toBeDefined()
327
+
328
+ const identity1 = {
329
+ alias: 'test_alias1',
330
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
331
+ identifier: {
332
+ type: CorrelationIdentifierEnum.DID,
333
+ correlationId: 'example_did1',
334
+ },
335
+ }
336
+ const savedIdentity1 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity1 })
337
+ expect(savedIdentity1).toBeDefined()
338
+
339
+ const identity2 = {
340
+ alias: 'test_alias2',
341
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
342
+ identifier: {
343
+ type: CorrelationIdentifierEnum.DID,
344
+ correlationId: 'example_did2',
345
+ },
346
+ }
347
+ const savedIdentity2 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity2 })
348
+ expect(savedIdentity2).toBeDefined()
349
+
350
+ const contactName = 'updated_name'
351
+ const updatedContact = {
352
+ ...savedContact,
353
+ name: contactName,
354
+ }
355
+
356
+ await contactStore.updateContact({ contact: updatedContact })
357
+ const result = await contactStore.getContact({ contactId: savedContact.id })
358
+
359
+ expect(result.name).toEqual(contactName)
360
+ expect(result.identities.length).toEqual(2)
361
+ })
362
+
363
+ it('should throw error when updating contact with unknown id', async () => {
364
+ const contact = {
365
+ name: 'test_name',
366
+ alias: 'test_alias',
367
+ uri: 'example.com',
368
+ }
369
+ const savedContact = await contactStore.addContact(contact)
370
+ expect(savedContact).toBeDefined()
371
+
372
+ const contactId = 'unknownContactId'
373
+ const updatedContact = {
374
+ ...savedContact,
375
+ id: contactId,
376
+ name: 'new_name',
377
+ }
378
+ await expect(contactStore.updateContact({ contact: updatedContact })).rejects.toThrow(`No contact found for id: ${contactId}`)
379
+ })
380
+
381
+ it('should get identity by id', async () => {
382
+ const contact = {
383
+ name: 'test_name',
384
+ alias: 'test_alias',
385
+ uri: 'example.com',
386
+ }
387
+ const savedContact = await contactStore.addContact(contact)
388
+ expect(savedContact).toBeDefined()
389
+
390
+ const identity = {
391
+ alias: 'test_alias',
392
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
393
+ identifier: {
394
+ type: CorrelationIdentifierEnum.DID,
395
+ correlationId: 'example_did',
396
+ },
397
+ }
398
+ const savedIdentity = await contactStore.addIdentity({ contactId: savedContact.id, identity })
399
+ expect(savedIdentity).toBeDefined()
400
+
401
+ const result = await contactStore.getIdentity({ identityId: savedIdentity.id })
402
+
403
+ expect(result).toBeDefined()
404
+ })
405
+
406
+ it('should get holderDID identity by id', async () => {
407
+ const contact = {
408
+ name: 'test_name',
409
+ alias: 'test_alias',
410
+ uri: 'example.com',
411
+ }
412
+ const savedContact = await contactStore.addContact(contact)
413
+ expect(savedContact).toBeDefined()
414
+
415
+ const identity = {
416
+ alias: 'test_alias',
417
+ roles: [IdentityRoleEnum.HOLDER],
418
+ identifier: {
419
+ type: CorrelationIdentifierEnum.DID,
420
+ correlationId: 'example_did',
421
+ },
422
+ }
423
+ const savedIdentity = await contactStore.addIdentity({ contactId: savedContact.id, identity })
424
+ expect(savedIdentity).toBeDefined()
425
+
426
+ const result = await contactStore.getIdentity({ identityId: savedIdentity.id })
427
+
428
+ expect(result).toBeDefined()
429
+ })
430
+
431
+ it('should throw error when getting identity with unknown id', async () => {
432
+ const identityId = 'unknownIdentityId'
433
+
434
+ await expect(contactStore.getIdentity({ identityId })).rejects.toThrow(`No identity found for id: ${identityId}`)
435
+ })
436
+
437
+ it('should get all identities for contact', async () => {
438
+ const contact = {
439
+ name: 'test_name',
440
+ alias: 'test_alias',
441
+ uri: 'example.com',
442
+ }
443
+ const savedContact = await contactStore.addContact(contact)
444
+ expect(savedContact).toBeDefined()
445
+
446
+ const identity1 = {
447
+ alias: 'test_alias1',
448
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
449
+ identifier: {
450
+ type: CorrelationIdentifierEnum.DID,
451
+ correlationId: 'example_did1',
452
+ },
453
+ }
454
+ const savedIdentity1 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity1 })
455
+ expect(savedIdentity1).toBeDefined()
456
+
457
+ const identity2 = {
458
+ alias: 'test_alias2',
459
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
460
+ identifier: {
461
+ type: CorrelationIdentifierEnum.DID,
462
+ correlationId: 'example_did2',
463
+ },
464
+ }
465
+ const savedIdentity2 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity2 })
466
+ expect(savedIdentity2).toBeDefined()
467
+
468
+ const args = {
469
+ filter: [{ contactId: savedContact.id }],
470
+ }
471
+
472
+ const result = await contactStore.getIdentities(args)
473
+
474
+ expect(result.length).toEqual(2)
475
+ })
476
+
477
+ it('should get all identities', async () => {
478
+ const contact = {
479
+ name: 'test_name',
480
+ alias: 'test_alias',
481
+ uri: 'example.com',
482
+ }
483
+ const savedContact = await contactStore.addContact(contact)
484
+ expect(savedContact).toBeDefined()
485
+
486
+ const identity1 = {
487
+ alias: 'test_alias1',
488
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
489
+ identifier: {
490
+ type: CorrelationIdentifierEnum.DID,
491
+ correlationId: 'example_did1',
492
+ },
493
+ }
494
+ const savedIdentity1 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity1 })
495
+ expect(savedIdentity1).toBeDefined()
496
+
497
+ const identity2 = {
498
+ alias: 'test_alias2',
499
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
500
+ identifier: {
501
+ type: CorrelationIdentifierEnum.DID,
502
+ correlationId: 'example_did2',
503
+ },
504
+ }
505
+ const savedIdentity2 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity2 })
506
+ expect(savedIdentity2).toBeDefined()
507
+
508
+ const result = await contactStore.getIdentities()
509
+
510
+ expect(result.length).toEqual(2)
511
+ })
512
+
513
+ it('should get identities by filter', async () => {
514
+ const contact = {
515
+ name: 'test_name',
516
+ alias: 'test_alias',
517
+ uri: 'example.com',
518
+ }
519
+ const savedContact = await contactStore.addContact(contact)
520
+ expect(savedContact).toBeDefined()
521
+
522
+ const alias = 'test_alias1'
523
+ const identity1 = {
524
+ alias,
525
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
526
+ identifier: {
527
+ type: CorrelationIdentifierEnum.DID,
528
+ correlationId: 'example_did1',
529
+ },
530
+ }
531
+ const savedIdentity1 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity1 })
532
+ expect(savedIdentity1).toBeDefined()
533
+
534
+ const identity2 = {
535
+ alias: 'test_alias2',
536
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
537
+ identifier: {
538
+ type: CorrelationIdentifierEnum.DID,
539
+ correlationId: 'example_did2',
540
+ },
541
+ }
542
+ const savedIdentity2 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity2 })
543
+ expect(savedIdentity2).toBeDefined()
544
+
545
+ const args = {
546
+ filter: [{ alias }],
547
+ }
548
+
549
+ const result = await contactStore.getIdentities(args)
550
+
551
+ expect(result.length).toEqual(1)
552
+ })
553
+
554
+ it('should get whole identities by filter', async () => {
555
+ const contact = {
556
+ name: 'test_name',
557
+ alias: 'test_alias',
558
+ uri: 'example.com',
559
+ }
560
+ const savedContact = await contactStore.addContact(contact)
561
+ expect(savedContact).toBeDefined()
562
+
563
+ const alias = 'test_alias1'
564
+ const identity1 = {
565
+ alias,
566
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
567
+ identifier: {
568
+ type: CorrelationIdentifierEnum.DID,
569
+ correlationId: 'example_did1',
570
+ },
571
+ metadata: [
572
+ {
573
+ label: 'label1',
574
+ value: 'example_value',
575
+ },
576
+ {
577
+ label: 'label2',
578
+ value: 'example_value',
579
+ },
580
+ ],
581
+ }
582
+ const savedIdentity1 = await contactStore.addIdentity({ contactId: savedContact.id, identity: identity1 })
583
+ expect(savedIdentity1).toBeDefined()
584
+
585
+ const args = {
586
+ filter: [{ metadata: { label: 'label1' } }],
587
+ }
588
+
589
+ const result = await contactStore.getIdentities(args)
590
+
591
+ expect(result[0]).toBeDefined()
592
+ expect(result[0].metadata!.length).toEqual(2)
593
+ })
594
+
595
+ it('should add identity to contact', async () => {
596
+ const contact = {
597
+ name: 'test_name',
598
+ alias: 'test_alias',
599
+ uri: 'example.com',
600
+ }
601
+ const savedContact = await contactStore.addContact(contact)
602
+ expect(savedContact).toBeDefined()
603
+
604
+ const identity = {
605
+ alias: 'test_alias',
606
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
607
+ identifier: {
608
+ type: CorrelationIdentifierEnum.DID,
609
+ correlationId: 'example_did',
610
+ },
611
+ }
612
+ const savedIdentity = await contactStore.addIdentity({ contactId: savedContact.id, identity })
613
+ expect(savedIdentity).toBeDefined()
614
+
615
+ const result = await contactStore.getContact({ contactId: savedContact.id })
616
+ expect(result.identities.length).toEqual(1)
617
+ })
618
+
619
+ it('should throw error when removing identity with unknown id', async () => {
620
+ const identityId = 'unknownIdentityId'
621
+
622
+ await expect(contactStore.removeIdentity({ identityId })).rejects.toThrow(`No identity found for id: ${identityId}`)
623
+ })
624
+
625
+ it('should throw error when adding identity with invalid identifier', async () => {
626
+ const contact = {
627
+ name: 'test_name',
628
+ alias: 'test_alias',
629
+ uri: 'example.com',
630
+ }
631
+ const savedContact = await contactStore.addContact(contact)
632
+ expect(savedContact).toBeDefined()
633
+
634
+ const correlationId = 'missing_connection_example'
635
+ const identity = {
636
+ alias: correlationId,
637
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
638
+ identifier: {
639
+ type: CorrelationIdentifierEnum.URL,
640
+ correlationId,
641
+ },
642
+ }
643
+
644
+ await expect(contactStore.addIdentity({ contactId: savedContact.id, identity })).rejects.toThrow(
645
+ `Identity with correlation type url should contain a connection`
646
+ )
647
+ })
648
+
649
+ it('should throw error when updating identity with invalid identifier', async () => {
650
+ const contact = {
651
+ name: 'test_name',
652
+ alias: 'test_alias',
653
+ uri: 'example.com',
654
+ }
655
+ const savedContact = await contactStore.addContact(contact)
656
+ expect(savedContact).toBeDefined()
657
+
658
+ const correlationId = 'missing_connection_example'
659
+ const identity = {
660
+ alias: correlationId,
661
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER, IdentityRoleEnum.HOLDER],
662
+ identifier: {
663
+ type: CorrelationIdentifierEnum.DID,
664
+ correlationId,
665
+ },
666
+ }
667
+ const storedIdentity = await contactStore.addIdentity({ contactId: savedContact.id, identity })
668
+ storedIdentity.identifier = { ...storedIdentity.identifier, type: CorrelationIdentifierEnum.URL }
669
+
670
+ await expect(contactStore.updateIdentity({ identity: storedIdentity })).rejects.toThrow(
671
+ `Identity with correlation type url should contain a connection`
672
+ )
673
+ })
674
+
675
+ it('should update identity by id', async () => {
676
+ const contact = {
677
+ name: 'test_name',
678
+ alias: 'test_alias',
679
+ uri: 'example.com',
680
+ }
681
+ const savedContact = await contactStore.addContact(contact)
682
+ expect(savedContact).toBeDefined()
683
+
684
+ const identity = {
685
+ alias: 'example_did',
686
+ roles: [IdentityRoleEnum.ISSUER, IdentityRoleEnum.VERIFIER],
687
+ identifier: {
688
+ type: CorrelationIdentifierEnum.DID,
689
+ correlationId: 'example_did',
690
+ },
691
+ }
692
+ const storedIdentity = await contactStore.addIdentity({ contactId: savedContact.id, identity })
693
+ const correlationId = 'new_update_example_did'
694
+ storedIdentity.identifier = { ...storedIdentity.identifier, correlationId }
695
+
696
+ await contactStore.updateIdentity({ identity: storedIdentity })
697
+ const result = await contactStore.getIdentity({ identityId: storedIdentity.id })
698
+
699
+ expect(result).not.toBeNull()
700
+ expect(result.identifier.correlationId).toEqual(correlationId)
701
+ })
702
+
703
+ it('should get aggregate of identity roles on contact', async () => {
704
+ const contact = {
705
+ name: 'test_name',
706
+ alias: 'test_alias',
707
+ uri: 'example.com',
708
+ identities: [
709
+ {
710
+ alias: 'test_alias1',
711
+ roles: [IdentityRoleEnum.VERIFIER],
712
+ identifier: {
713
+ type: CorrelationIdentifierEnum.DID,
714
+ correlationId: 'example_did1',
715
+ },
716
+ },
717
+ {
718
+ alias: 'test_alias2',
719
+ roles: [IdentityRoleEnum.ISSUER],
720
+ identifier: {
721
+ type: CorrelationIdentifierEnum.DID,
722
+ correlationId: 'example_did2',
723
+ },
724
+ },
725
+ {
726
+ alias: 'test_alias3',
727
+ roles: [IdentityRoleEnum.HOLDER],
728
+ identifier: {
729
+ type: CorrelationIdentifierEnum.DID,
730
+ correlationId: 'example_did3',
731
+ },
732
+ },
733
+ ],
734
+ }
735
+
736
+ const savedContact = await contactStore.addContact(contact)
737
+ const result = await contactStore.getContact({ contactId: savedContact.id })
738
+
739
+ expect(result.roles).toBeDefined()
740
+ expect(result.roles.length).toEqual(3)
741
+ expect(result.roles).toEqual([IdentityRoleEnum.VERIFIER, IdentityRoleEnum.ISSUER, IdentityRoleEnum.HOLDER])
742
+ })
743
+ })