@icure/api 8.0.7 → 8.0.9

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 (259) hide show
  1. package/icc-api/model/models.d.ts +1 -0
  2. package/icc-api/model/models.js +1 -0
  3. package/icc-api/model/models.js.map +1 -1
  4. package/icc-x-api/crypto/ExchangeDataManager.js +3 -2
  5. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  6. package/icc-x-api/crypto/KeyRecovery.js +5 -4
  7. package/icc-x-api/crypto/KeyRecovery.js.map +1 -1
  8. package/icc-x-api/crypto/RSA.d.ts +4 -1
  9. package/icc-x-api/crypto/RSA.js +6 -1
  10. package/icc-x-api/crypto/RSA.js.map +1 -1
  11. package/icc-x-api/crypto/SecureDelegationsManager.js +2 -1
  12. package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
  13. package/icc-x-api/crypto/TransferKeysManager.js +4 -3
  14. package/icc-x-api/crypto/TransferKeysManager.js.map +1 -1
  15. package/icc-x-api/crypto/UserEncryptionKeysManager.js +2 -1
  16. package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
  17. package/icc-x-api/crypto/utils.d.ts +1 -4
  18. package/icc-x-api/crypto/utils.js +6 -8
  19. package/icc-x-api/crypto/utils.js.map +1 -1
  20. package/icc-x-api/icc-accesslog-x-api.js +16 -14
  21. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  22. package/icc-x-api/icc-calendar-item-x-api.d.ts +2 -2
  23. package/icc-x-api/icc-calendar-item-x-api.js +17 -17
  24. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  25. package/icc-x-api/icc-classification-x-api.js +12 -11
  26. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  27. package/icc-x-api/icc-contact-x-api.d.ts +2 -2
  28. package/icc-x-api/icc-contact-x-api.js +23 -20
  29. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  30. package/icc-x-api/icc-document-x-api.js +17 -16
  31. package/icc-x-api/icc-document-x-api.js.map +1 -1
  32. package/icc-x-api/icc-form-x-api.js +13 -12
  33. package/icc-x-api/icc-form-x-api.js.map +1 -1
  34. package/icc-x-api/icc-helement-x-api.js +18 -16
  35. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  36. package/icc-x-api/icc-invoice-x-api.js +12 -11
  37. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  38. package/icc-x-api/icc-maintenance-task-x-api.js +11 -11
  39. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  40. package/icc-x-api/icc-message-x-api.js +14 -14
  41. package/icc-x-api/icc-message-x-api.js.map +1 -1
  42. package/icc-x-api/icc-patient-x-api.js +28 -27
  43. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  44. package/icc-x-api/icc-receipt-x-api.js +11 -10
  45. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  46. package/icc-x-api/icc-recovery-x-api.js +3 -2
  47. package/icc-x-api/icc-recovery-x-api.js.map +1 -1
  48. package/icc-x-api/icc-time-table-x-api.js +9 -8
  49. package/icc-x-api/icc-time-table-x-api.js.map +1 -1
  50. package/icc-x-api/icc-topic-x-api.js +13 -13
  51. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  52. package/icc-x-api/utils/EntityWithDelegationTypeName.d.ts +17 -1
  53. package/icc-x-api/utils/EntityWithDelegationTypeName.js +33 -15
  54. package/icc-x-api/utils/EntityWithDelegationTypeName.js.map +1 -1
  55. package/icc-x-api/utils/index.d.ts +1 -0
  56. package/icc-x-api/utils/index.js +1 -0
  57. package/icc-x-api/utils/index.js.map +1 -1
  58. package/package.json +1 -1
  59. package/test/icc-api/api/IccAnonymousAccessApi.d.ts +1 -0
  60. package/test/icc-api/api/IccAnonymousAccessApi.js +58 -0
  61. package/test/icc-api/api/IccAnonymousAccessApi.js.map +1 -0
  62. package/test/icc-api/api/IccDocumentApi.d.ts +1 -0
  63. package/test/icc-api/api/IccDocumentApi.js +208 -0
  64. package/test/icc-api/api/IccDocumentApi.js.map +1 -0
  65. package/test/icc-api/api/IccGroupApi.d.ts +1 -0
  66. package/test/icc-api/api/IccGroupApi.js +50 -0
  67. package/test/icc-api/api/IccGroupApi.js.map +1 -0
  68. package/test/icc-api/api/IccRecoveryDataApi.d.ts +1 -0
  69. package/test/icc-api/api/IccRecoveryDataApi.js +95 -0
  70. package/test/icc-api/api/IccRecoveryDataApi.js.map +1 -0
  71. package/test/icc-api/api/IccRoleApi.d.ts +1 -0
  72. package/test/icc-api/api/IccRoleApi.js +34 -0
  73. package/test/icc-api/api/IccRoleApi.js.map +1 -0
  74. package/test/icc-api/api/IccUserApi.d.ts +1 -0
  75. package/test/icc-api/api/IccUserApi.js +96 -0
  76. package/test/icc-api/api/IccUserApi.js.map +1 -0
  77. package/test/icc-api/e2e/IccCalendarItemApi.d.ts +1 -0
  78. package/test/icc-api/e2e/IccCalendarItemApi.js +46 -0
  79. package/test/icc-api/e2e/IccCalendarItemApi.js.map +1 -0
  80. package/test/icc-api/model/modelHelpersTest.d.ts +1 -0
  81. package/test/icc-api/model/modelHelpersTest.js +45 -0
  82. package/test/icc-api/model/modelHelpersTest.js.map +1 -0
  83. package/test/icc-x-api/auth/group-switch-test.d.ts +1 -0
  84. package/test/icc-x-api/auth/group-switch-test.js +81 -0
  85. package/test/icc-x-api/auth/group-switch-test.js.map +1 -0
  86. package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +2 -0
  87. package/test/icc-x-api/auth/jwt-concurrency-test.js +113 -0
  88. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -0
  89. package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +1 -0
  90. package/test/icc-x-api/auth/smart-auth-provider-test.js +224 -0
  91. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -0
  92. package/test/icc-x-api/autofix-anonymity-test.d.ts +1 -0
  93. package/test/icc-x-api/autofix-anonymity-test.js +108 -0
  94. package/test/icc-x-api/autofix-anonymity-test.js.map +1 -0
  95. package/test/icc-x-api/confidential-entities-test.d.ts +1 -0
  96. package/test/icc-x-api/confidential-entities-test.js +110 -0
  97. package/test/icc-x-api/confidential-entities-test.js.map +1 -0
  98. package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +1 -0
  99. package/test/icc-x-api/crud/comprehensive-crud-test.js +276 -0
  100. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -0
  101. package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +16 -0
  102. package/test/icc-x-api/crud/entities-crud-test-interface.js +422 -0
  103. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -0
  104. package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +1 -0
  105. package/test/icc-x-api/crypto/anonymous-delegations-test.js +588 -0
  106. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -0
  107. package/test/icc-x-api/crypto/concurrency.d.ts +1 -0
  108. package/test/icc-x-api/crypto/concurrency.js +35 -0
  109. package/test/icc-x-api/crypto/concurrency.js.map +1 -0
  110. package/test/icc-x-api/crypto/crypto-utils.d.ts +1 -0
  111. package/test/icc-x-api/crypto/crypto-utils.js +80 -0
  112. package/test/icc-x-api/crypto/crypto-utils.js.map +1 -0
  113. package/test/icc-x-api/crypto/cryptoTest.d.ts +2 -0
  114. package/test/icc-x-api/crypto/cryptoTest.js +302 -0
  115. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -0
  116. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +1 -0
  117. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +166 -0
  118. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -0
  119. package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +1 -0
  120. package/test/icc-x-api/crypto/exchange-data-manager-test.js +690 -0
  121. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -0
  122. package/test/icc-x-api/crypto/full-crypto-test.d.ts +1 -0
  123. package/test/icc-x-api/crypto/full-crypto-test.js +457 -0
  124. package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -0
  125. package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +1 -0
  126. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +266 -0
  127. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -0
  128. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.d.ts +1 -0
  129. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js +393 -0
  130. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js.map +1 -0
  131. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.d.ts +1 -0
  132. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js +213 -0
  133. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js.map +1 -0
  134. package/test/icc-x-api/crypto/shamir.d.ts +2 -0
  135. package/test/icc-x-api/crypto/shamir.js +166 -0
  136. package/test/icc-x-api/crypto/shamir.js.map +1 -0
  137. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +1 -0
  138. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +71 -0
  139. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +1 -0
  140. package/test/icc-x-api/crypto/signature-keys-manager-test.d.ts +1 -0
  141. package/test/icc-x-api/crypto/signature-keys-manager-test.js +44 -0
  142. package/test/icc-x-api/crypto/signature-keys-manager-test.js.map +1 -0
  143. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +1 -0
  144. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +246 -0
  145. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +1 -0
  146. package/test/icc-x-api/entity-with-attachments-api-test.d.ts +1 -0
  147. package/test/icc-x-api/entity-with-attachments-api-test.js +142 -0
  148. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -0
  149. package/test/icc-x-api/filters/filters.d.ts +1 -0
  150. package/test/icc-x-api/filters/filters.js +49 -0
  151. package/test/icc-x-api/filters/filters.js.map +1 -0
  152. package/test/icc-x-api/icc-accesslog-x-api.d.ts +1 -0
  153. package/test/icc-x-api/icc-accesslog-x-api.js +106 -0
  154. package/test/icc-x-api/icc-accesslog-x-api.js.map +1 -0
  155. package/test/icc-x-api/icc-auth-api.d.ts +1 -0
  156. package/test/icc-x-api/icc-auth-api.js +47 -0
  157. package/test/icc-x-api/icc-auth-api.js.map +1 -0
  158. package/test/icc-x-api/icc-calendar-item-x-api.d.ts +1 -0
  159. package/test/icc-x-api/icc-calendar-item-x-api.js +150 -0
  160. package/test/icc-x-api/icc-calendar-item-x-api.js.map +1 -0
  161. package/test/icc-x-api/icc-contact-x-api.d.ts +1 -0
  162. package/test/icc-x-api/icc-contact-x-api.js +279 -0
  163. package/test/icc-x-api/icc-contact-x-api.js.map +1 -0
  164. package/test/icc-x-api/icc-form-x-api.d.ts +1 -0
  165. package/test/icc-x-api/icc-form-x-api.js +98 -0
  166. package/test/icc-x-api/icc-form-x-api.js.map +1 -0
  167. package/test/icc-x-api/icc-helement-x-api-test.d.ts +1 -0
  168. package/test/icc-x-api/icc-helement-x-api-test.js +153 -0
  169. package/test/icc-x-api/icc-helement-x-api-test.js.map +1 -0
  170. package/test/icc-x-api/icc-invoice-x-api.d.ts +1 -0
  171. package/test/icc-x-api/icc-invoice-x-api.js +99 -0
  172. package/test/icc-x-api/icc-invoice-x-api.js.map +1 -0
  173. package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +1 -0
  174. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +221 -0
  175. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +1 -0
  176. package/test/icc-x-api/icc-message-x-api.d.ts +1 -0
  177. package/test/icc-x-api/icc-message-x-api.js +328 -0
  178. package/test/icc-x-api/icc-message-x-api.js.map +1 -0
  179. package/test/icc-x-api/icc-patient-x-api-test.d.ts +1 -0
  180. package/test/icc-x-api/icc-patient-x-api-test.js +158 -0
  181. package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -0
  182. package/test/icc-x-api/icc-recovery-x-api.d.ts +1 -0
  183. package/test/icc-x-api/icc-recovery-x-api.js +170 -0
  184. package/test/icc-x-api/icc-recovery-x-api.js.map +1 -0
  185. package/test/icc-x-api/icc-time-table-x-api.d.ts +1 -0
  186. package/test/icc-x-api/icc-time-table-x-api.js +100 -0
  187. package/test/icc-x-api/icc-time-table-x-api.js.map +1 -0
  188. package/test/icc-x-api/icc-topic-x-api.d.ts +1 -0
  189. package/test/icc-x-api/icc-topic-x-api.js +269 -0
  190. package/test/icc-x-api/icc-topic-x-api.js.map +1 -0
  191. package/test/icc-x-api/icc-user-x-api-test.d.ts +1 -0
  192. package/test/icc-x-api/icc-user-x-api-test.js +99 -0
  193. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -0
  194. package/test/icc-x-api/patient-user.d.ts +2 -0
  195. package/test/icc-x-api/patient-user.js +104 -0
  196. package/test/icc-x-api/patient-user.js.map +1 -0
  197. package/test/icc-x-api/storage/storage.d.ts +1 -0
  198. package/test/icc-x-api/storage/storage.js +48 -0
  199. package/test/icc-x-api/storage/storage.js.map +1 -0
  200. package/test/icc-x-api/test-api-no-parent.d.ts +1 -0
  201. package/test/icc-x-api/test-api-no-parent.js +79 -0
  202. package/test/icc-x-api/test-api-no-parent.js.map +1 -0
  203. package/test/icc-x-api/test-legacy-data-support.d.ts +1 -0
  204. package/test/icc-x-api/test-legacy-data-support.js +376 -0
  205. package/test/icc-x-api/test-legacy-data-support.js.map +1 -0
  206. package/test/icc-x-api/utils/graph-test.d.ts +1 -0
  207. package/test/icc-x-api/utils/graph-test.js +54 -0
  208. package/test/icc-x-api/utils/graph-test.js.map +1 -0
  209. package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +1 -0
  210. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +364 -0
  211. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -0
  212. package/test/support/CSM-185.d.ts +1 -0
  213. package/test/support/CSM-185.js +124 -0
  214. package/test/support/CSM-185.js.map +1 -0
  215. package/test/support/CSM-243.d.ts +1 -0
  216. package/test/support/CSM-243.js +120 -0
  217. package/test/support/CSM-243.js.map +1 -0
  218. package/test/support/CSM-87.d.ts +0 -0
  219. package/test/support/CSM-87.js +21 -0
  220. package/test/support/CSM-87.js.map +1 -0
  221. package/test/support/CSM-93.d.ts +1 -0
  222. package/test/support/CSM-93.js +112 -0
  223. package/test/support/CSM-93.js.map +1 -0
  224. package/test/utils/FakeDataOwnerApi.d.ts +32 -0
  225. package/test/utils/FakeDataOwnerApi.js +136 -0
  226. package/test/utils/FakeDataOwnerApi.js.map +1 -0
  227. package/test/utils/FakeEncryptionKeysManager.d.ts +35 -0
  228. package/test/utils/FakeEncryptionKeysManager.js +87 -0
  229. package/test/utils/FakeEncryptionKeysManager.js.map +1 -0
  230. package/test/utils/FakeExchangeDataApi.d.ts +30 -0
  231. package/test/utils/FakeExchangeDataApi.js +74 -0
  232. package/test/utils/FakeExchangeDataApi.js.map +1 -0
  233. package/test/utils/FakeExchangeDataManager.d.ts +40 -0
  234. package/test/utils/FakeExchangeDataManager.js +89 -0
  235. package/test/utils/FakeExchangeDataManager.js.map +1 -0
  236. package/test/utils/FakeExchangeDataMapManager.d.ts +12 -0
  237. package/test/utils/FakeExchangeDataMapManager.js +38 -0
  238. package/test/utils/FakeExchangeDataMapManager.js.map +1 -0
  239. package/test/utils/FakeGenericApi.d.ts +16 -0
  240. package/test/utils/FakeGenericApi.js +65 -0
  241. package/test/utils/FakeGenericApi.js.map +1 -0
  242. package/test/utils/FakeSignatureKeysManager.d.ts +16 -0
  243. package/test/utils/FakeSignatureKeysManager.js +54 -0
  244. package/test/utils/FakeSignatureKeysManager.js.map +1 -0
  245. package/test/utils/TestApi.d.ts +3 -0
  246. package/test/utils/TestApi.js +30 -0
  247. package/test/utils/TestApi.js.map +1 -0
  248. package/test/utils/TestCollectionUtils.d.ts +1 -0
  249. package/test/utils/TestCollectionUtils.js +109 -0
  250. package/test/utils/TestCollectionUtils.js.map +1 -0
  251. package/test/utils/TestCryptoStrategies.d.ts +42 -0
  252. package/test/utils/TestCryptoStrategies.js +80 -0
  253. package/test/utils/TestCryptoStrategies.js.map +1 -0
  254. package/test/utils/TestStorage.d.ts +23 -0
  255. package/test/utils/TestStorage.js +61 -0
  256. package/test/utils/TestStorage.js.map +1 -0
  257. package/test/utils/test_utils.d.ts +76 -0
  258. package/test/utils/test_utils.js +419 -0
  259. package/test/utils/test_utils.js.map +1 -0
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const test_utils_1 = require("../utils/test_utils");
13
+ const mocha_1 = require("mocha");
14
+ const types_1 = require("@icure/test-setup/types");
15
+ const icc_x_api_1 = require("../../icc-x-api");
16
+ const crypto_1 = require("crypto");
17
+ const User_1 = require("../../icc-api/model/User");
18
+ const chai_1 = require("chai");
19
+ const chaiAsPromised = require("chai-as-promised");
20
+ const TestStorage_1 = require("../utils/TestStorage");
21
+ const DataOwnerTypeEnum_1 = require("../../icc-api/model/DataOwnerTypeEnum");
22
+ const SecureDelegation_1 = require("../../icc-api/model/SecureDelegation");
23
+ var AccessLevelEnum = SecureDelegation_1.SecureDelegation.AccessLevelEnum;
24
+ const icc_recovery_x_api_1 = require("../../icc-x-api/icc-recovery-x-api");
25
+ (0, chai_1.use)(chaiAsPromised);
26
+ (0, test_utils_1.setLocalStorage)(fetch);
27
+ let env;
28
+ describe('Recovery api use scenarios', () => {
29
+ (0, mocha_1.before)(function () {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ this.timeout(600000);
32
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
33
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
34
+ });
35
+ });
36
+ it('An hcp should be able to share data with an uninitialized patient data owner and the patient should be able to recover the exchange data with the provided recovery key.', function () {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ const hcp = yield (0, test_utils_1.createNewHcpApi)(env);
39
+ const patientId = (0, crypto_1.randomUUID)();
40
+ const patientMail = (0, test_utils_1.getTempEmail)();
41
+ const patientPassword = (0, crypto_1.randomUUID)();
42
+ const patient = yield hcp.api.patientApi.createPatientWithUser(hcp.user, yield hcp.api.patientApi.newInstance(hcp.user, {
43
+ id: patientId,
44
+ firstName: 'John',
45
+ lastName: 'Doe',
46
+ }));
47
+ const patientUser = yield hcp.api.userApi.createUser(new User_1.User({
48
+ id: (0, crypto_1.randomUUID)(),
49
+ login: patientMail,
50
+ passwordHash: patientPassword,
51
+ patientId: patientId,
52
+ }));
53
+ const healthData = yield hcp.api.healthcareElementApi.createHealthElementWithUser(hcp.user, yield hcp.api.healthcareElementApi.newInstance(hcp.user, patient, {
54
+ descr: 'Health data',
55
+ }));
56
+ yield (0, chai_1.expect)(hcp.api.healthcareElementApi.shareWith(patientId, healthData)).to.be.rejected;
57
+ (0, chai_1.expect)(yield hcp.api.patientApi.forceInitialiseExchangeDataToNewlyInvitedPatient(patientId)).to.be.true;
58
+ const recoveryKey = yield hcp.api.recoveryApi.createExchangeDataRecoveryInfo(patientId);
59
+ const sharedHealthData = yield hcp.api.healthcareElementApi.shareWith(patientId, healthData);
60
+ const patientApi = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: patientMail, password: patientPassword }, {
61
+ dataOwnerRequiresAnonymousDelegation(dataOwner) {
62
+ return dataOwner.type == DataOwnerTypeEnum_1.DataOwnerTypeEnum.Patient;
63
+ },
64
+ generateNewKeyForDataOwner() {
65
+ return Promise.resolve(true);
66
+ },
67
+ recoverAndVerifySelfHierarchyKeys(keysData) {
68
+ return Promise.resolve(Object.fromEntries(keysData.map((x) => [x.dataOwner.dataOwner.id, { recoveredKeys: {}, keyAuthenticity: {} }])));
69
+ },
70
+ verifyDelegatePublicKeys(_, publicKeys) {
71
+ return Promise.resolve(publicKeys);
72
+ },
73
+ }, crypto_1.webcrypto, fetch, {
74
+ storage: new TestStorage_1.TestStorage(),
75
+ keyStorage: new TestStorage_1.TestKeyStorage(),
76
+ });
77
+ if (!(0, test_utils_1.isLiteTest)())
78
+ yield (0, chai_1.expect)(patientApi.healthcareElementApi.getHealthElementWithUser(patientUser, sharedHealthData.id)).to.be.rejected;
79
+ (0, chai_1.expect)(yield patientApi.recoveryApi.recoverExchangeData(recoveryKey + 'aa')).to.equal(icc_recovery_x_api_1.RecoveryDataUseFailureReason.Missing); // User put in the wrong key
80
+ (0, chai_1.expect)(yield patientApi.recoveryApi.recoverExchangeData(recoveryKey)).to.be.null;
81
+ (0, chai_1.expect)(yield patientApi.recoveryApi.recoverExchangeData(recoveryKey)).to.equal(icc_recovery_x_api_1.RecoveryDataUseFailureReason.Missing); // After use it is automatically deleted
82
+ (0, chai_1.expect)(yield patientApi.healthcareElementApi.getHealthElementWithUser(patientUser, sharedHealthData.id)).to.be.deep.equal(sharedHealthData);
83
+ yield hcp.api.cryptoApi.forceReload();
84
+ const healthData2 = yield hcp.api.healthcareElementApi.createHealthElementWithUser(hcp.user, yield hcp.api.healthcareElementApi.newInstance(hcp.user, patient, {
85
+ descr: 'Health data 2',
86
+ }, {
87
+ additionalDelegates: { [patientId]: AccessLevelEnum.WRITE },
88
+ }));
89
+ (0, chai_1.expect)(yield patientApi.healthcareElementApi.getHealthElementWithUser(patientUser, healthData2.id)).to.be.deep.equal(healthData2);
90
+ (0, chai_1.expect)(yield hcp.api.cryptoApi.exchangeData.base.getExchangeDataByDelegatorDelegatePair(hcp.credentials.dataOwnerId, patientId)).to.have.length(1);
91
+ });
92
+ });
93
+ it('A user should be able to create keypair recovery data and use the recovery key to get back the keys.', function () {
94
+ return __awaiter(this, void 0, void 0, function* () {
95
+ const hcp = yield (0, test_utils_1.createNewHcpApi)(env);
96
+ const patient = yield hcp.api.patientApi.createPatientWithUser(hcp.user, yield hcp.api.patientApi.newInstance(hcp.user, {
97
+ firstName: 'John',
98
+ lastName: 'Doe',
99
+ note: 'Encrypted content',
100
+ }));
101
+ (0, chai_1.expect)(patient.note).to.equal('Encrypted content');
102
+ const recoveryKey = yield hcp.api.recoveryApi.createRecoveryInfoForAvailableKeyPairs();
103
+ let recoverAndVerifiedCalled = false;
104
+ const recoveredApi = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: hcp.credentials.user, password: hcp.credentials.password }, {
105
+ dataOwnerRequiresAnonymousDelegation(dataOwner) {
106
+ return dataOwner.type == DataOwnerTypeEnum_1.DataOwnerTypeEnum.Patient;
107
+ },
108
+ generateNewKeyForDataOwner() {
109
+ return Promise.resolve(false);
110
+ },
111
+ recoverAndVerifySelfHierarchyKeys(keysData, _, keyRecoverer) {
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ recoverAndVerifiedCalled = true;
114
+ const recovered = yield keyRecoverer.recoverWithRecoveryKey(recoveryKey, true);
115
+ if ('success' in recovered) {
116
+ (0, chai_1.expect)(Object.entries(recovered.success)).to.have.length(1);
117
+ const recoveredForSelf = recovered.success[hcp.credentials.dataOwnerId];
118
+ (0, chai_1.expect)(Object.entries(recoveredForSelf)).to.have.length(1);
119
+ (0, chai_1.expect)(yield keyRecoverer.recoverWithRecoveryKey(recoveryKey, true)).to.deep.equal({ failure: icc_recovery_x_api_1.RecoveryDataUseFailureReason.Missing });
120
+ const res = {};
121
+ for (const keyData of keysData) {
122
+ if (keyData.dataOwner.dataOwner.id == hcp.credentials.dataOwnerId) {
123
+ res[keyData.dataOwner.dataOwner.id] = {
124
+ recoveredKeys: recoveredForSelf,
125
+ keyAuthenticity: {},
126
+ };
127
+ }
128
+ else {
129
+ res[keyData.dataOwner.dataOwner.id] = {
130
+ recoveredKeys: {},
131
+ keyAuthenticity: {},
132
+ };
133
+ }
134
+ }
135
+ return res;
136
+ }
137
+ else {
138
+ chai_1.assert.fail('Could not recover keys with recovery key');
139
+ }
140
+ });
141
+ },
142
+ verifyDelegatePublicKeys(_, publicKeys) {
143
+ return Promise.resolve(publicKeys);
144
+ },
145
+ }, crypto_1.webcrypto, fetch, {
146
+ storage: new TestStorage_1.TestStorage(),
147
+ keyStorage: new TestStorage_1.TestKeyStorage(),
148
+ });
149
+ (0, chai_1.expect)(recoverAndVerifiedCalled).to.be.true;
150
+ (0, chai_1.expect)(recoveredApi.dataOwnerApi.getHexPublicKeysOf(yield recoveredApi.healthcarePartyApi.getCurrentHealthcareParty())).to.have.length(1);
151
+ (0, chai_1.expect)(yield recoveredApi.patientApi.getPatientWithUser(hcp.user, patient.id)).to.be.deep.equal(patient);
152
+ });
153
+ });
154
+ it('Recovery data should expire after the lifetime has elapsed', function () {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ const hcp = yield (0, test_utils_1.createNewHcpApi)(env);
157
+ const recoveryKey = yield hcp.api.recoveryApi.createRecoveryInfoForAvailableKeyPairs({ lifetimeSeconds: 5 });
158
+ yield (0, icc_x_api_1.sleep)(1000);
159
+ const recovered1 = yield hcp.api.recoveryApi.recoverKeyPairs(recoveryKey, false);
160
+ (0, chai_1.expect)(recovered1).to.have.keys('success');
161
+ yield (0, icc_x_api_1.sleep)(1000);
162
+ const recovered2 = yield hcp.api.recoveryApi.recoverKeyPairs(recoveryKey, false);
163
+ (0, chai_1.expect)(recovered2).to.have.keys('success');
164
+ yield (0, icc_x_api_1.sleep)(3000);
165
+ const recovered3 = yield hcp.api.recoveryApi.recoverKeyPairs(recoveryKey, false);
166
+ (0, chai_1.expect)(recovered3).to.deep.equal({ failure: icc_recovery_x_api_1.RecoveryDataUseFailureReason.Missing });
167
+ });
168
+ });
169
+ });
170
+ //# sourceMappingURL=icc-recovery-x-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icc-recovery-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-recovery-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, getTempEmail, isLiteTest, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before } from 'mocha'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { CryptoPrimitives, IcureApi, KeyPair, sleep } from '../../icc-x-api'\nimport { randomUUID, webcrypto } from 'crypto'\nimport { User } from '../../icc-api/model/User'\nimport { assert, expect, use as chaiUse } from 'chai'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { TestKeyStorage, TestStorage } from '../utils/TestStorage'\nimport { CryptoActorStubWithType } from '../../icc-api/model/CryptoActorStub'\nimport { DataOwnerTypeEnum } from '../../icc-api/model/DataOwnerTypeEnum'\nimport { DataOwnerWithType } from '../../icc-api/model/DataOwnerWithType'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\nimport { RecoveryDataUseFailureReason } from '../../icc-x-api/icc-recovery-x-api'\nimport { KeyPairRecoverer } from '../../icc-x-api/crypto/KeyPairRecoverer'\nimport { delay } from 'lodash'\n\nchaiUse(chaiAsPromised)\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribe('Recovery api use scenarios', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('An hcp should be able to share data with an uninitialized patient data owner and the patient should be able to recover the exchange data with the provided recovery key.', async function () {\n const hcp = await createNewHcpApi(env)\n const patientId = randomUUID()\n const patientMail = getTempEmail()\n const patientPassword = randomUUID()\n const patient = await hcp.api.patientApi.createPatientWithUser(\n hcp.user,\n await hcp.api.patientApi.newInstance(hcp.user, {\n id: patientId,\n firstName: 'John',\n lastName: 'Doe',\n })\n )\n const patientUser = await hcp.api.userApi.createUser(\n new User({\n id: randomUUID(),\n login: patientMail,\n passwordHash: patientPassword,\n patientId: patientId,\n })\n )\n const healthData = await hcp.api.healthcareElementApi.createHealthElementWithUser(\n hcp.user,\n await hcp.api.healthcareElementApi.newInstance(hcp.user, patient, {\n descr: 'Health data',\n })\n )\n await expect(hcp.api.healthcareElementApi.shareWith(patientId, healthData)).to.be.rejected\n expect(await hcp.api.patientApi.forceInitialiseExchangeDataToNewlyInvitedPatient(patientId)).to.be.true\n const recoveryKey = await hcp.api.recoveryApi.createExchangeDataRecoveryInfo(patientId)\n const sharedHealthData = await hcp.api.healthcareElementApi.shareWith(patientId, healthData)\n const patientApi = await IcureApi.initialise(\n env.iCureUrl,\n { username: patientMail, password: patientPassword },\n {\n dataOwnerRequiresAnonymousDelegation(dataOwner: CryptoActorStubWithType): boolean {\n return dataOwner.type == DataOwnerTypeEnum.Patient\n },\n generateNewKeyForDataOwner(): Promise<boolean> {\n return Promise.resolve(true)\n },\n recoverAndVerifySelfHierarchyKeys(\n keysData: {\n dataOwner: DataOwnerWithType\n unknownKeys: string[]\n unavailableKeys: string[]\n }[]\n ): Promise<{\n [p: string]: { recoveredKeys: { [p: string]: KeyPair<CryptoKey> }; keyAuthenticity: { [p: string]: boolean } }\n }> {\n return Promise.resolve(Object.fromEntries(keysData.map((x) => [x.dataOwner.dataOwner.id, { recoveredKeys: {}, keyAuthenticity: {} }])))\n },\n verifyDelegatePublicKeys(_: any, publicKeys: string[]): Promise<string[]> {\n return Promise.resolve(publicKeys)\n },\n },\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n if (!isLiteTest()) await expect(patientApi.healthcareElementApi.getHealthElementWithUser(patientUser, sharedHealthData.id!)).to.be.rejected\n expect(await patientApi.recoveryApi.recoverExchangeData(recoveryKey + 'aa')).to.equal(RecoveryDataUseFailureReason.Missing) // User put in the wrong key\n expect(await patientApi.recoveryApi.recoverExchangeData(recoveryKey)).to.be.null\n expect(await patientApi.recoveryApi.recoverExchangeData(recoveryKey)).to.equal(RecoveryDataUseFailureReason.Missing) // After use it is automatically deleted\n expect(await patientApi.healthcareElementApi.getHealthElementWithUser(patientUser, sharedHealthData.id!)).to.be.deep.equal(sharedHealthData)\n await hcp.api.cryptoApi.forceReload()\n const healthData2 = await hcp.api.healthcareElementApi.createHealthElementWithUser(\n hcp.user,\n await hcp.api.healthcareElementApi.newInstance(\n hcp.user,\n patient,\n {\n descr: 'Health data 2',\n },\n {\n additionalDelegates: { [patientId]: AccessLevelEnum.WRITE },\n }\n )\n )\n expect(await patientApi.healthcareElementApi.getHealthElementWithUser(patientUser, healthData2.id!)).to.be.deep.equal(healthData2)\n expect(await hcp.api.cryptoApi.exchangeData.base.getExchangeDataByDelegatorDelegatePair(hcp.credentials.dataOwnerId, patientId)).to.have.length(1)\n })\n\n it('A user should be able to create keypair recovery data and use the recovery key to get back the keys.', async function () {\n const hcp = await createNewHcpApi(env)\n const patient = await hcp.api.patientApi.createPatientWithUser(\n hcp.user,\n await hcp.api.patientApi.newInstance(hcp.user, {\n firstName: 'John',\n lastName: 'Doe',\n note: 'Encrypted content',\n })\n )\n expect(patient.note).to.equal('Encrypted content')\n const recoveryKey = await hcp.api.recoveryApi.createRecoveryInfoForAvailableKeyPairs()\n let recoverAndVerifiedCalled = false\n const recoveredApi = await IcureApi.initialise(\n env.iCureUrl,\n { username: hcp.credentials.user, password: hcp.credentials.password },\n {\n dataOwnerRequiresAnonymousDelegation(dataOwner: CryptoActorStubWithType): boolean {\n return dataOwner.type == DataOwnerTypeEnum.Patient\n },\n generateNewKeyForDataOwner(): Promise<boolean> {\n return Promise.resolve(false)\n },\n async recoverAndVerifySelfHierarchyKeys(\n keysData: {\n dataOwner: DataOwnerWithType\n unknownKeys: string[]\n unavailableKeys: string[]\n }[],\n _: any,\n keyRecoverer: KeyPairRecoverer\n ): Promise<{\n [p: string]: { recoveredKeys: { [p: string]: KeyPair<CryptoKey> }; keyAuthenticity: { [p: string]: boolean } }\n }> {\n recoverAndVerifiedCalled = true\n const recovered = await keyRecoverer.recoverWithRecoveryKey(recoveryKey, true)\n if ('success' in recovered) {\n expect(Object.entries(recovered.success)).to.have.length(1)\n const recoveredForSelf = recovered.success[hcp.credentials.dataOwnerId]\n expect(Object.entries(recoveredForSelf)).to.have.length(1)\n expect(await keyRecoverer.recoverWithRecoveryKey(recoveryKey, true)).to.deep.equal({ failure: RecoveryDataUseFailureReason.Missing })\n const res: {\n [p: string]: { recoveredKeys: { [p: string]: KeyPair<CryptoKey> }; keyAuthenticity: { [p: string]: boolean } }\n } = {}\n for (const keyData of keysData) {\n if (keyData.dataOwner.dataOwner.id == hcp.credentials.dataOwnerId) {\n res[keyData.dataOwner.dataOwner.id] = {\n recoveredKeys: recoveredForSelf,\n keyAuthenticity: {},\n }\n } else {\n res[keyData.dataOwner.dataOwner.id!] = {\n recoveredKeys: {},\n keyAuthenticity: {},\n }\n }\n }\n return res\n } else {\n assert.fail('Could not recover keys with recovery key')\n }\n },\n verifyDelegatePublicKeys(_: any, publicKeys: string[]): Promise<string[]> {\n return Promise.resolve(publicKeys)\n },\n },\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n expect(recoverAndVerifiedCalled).to.be.true\n expect(recoveredApi.dataOwnerApi.getHexPublicKeysOf(await recoveredApi.healthcarePartyApi.getCurrentHealthcareParty())).to.have.length(1)\n expect(await recoveredApi.patientApi.getPatientWithUser(hcp.user, patient.id!)).to.be.deep.equal(patient)\n })\n\n it('Recovery data should expire after the lifetime has elapsed', async function () {\n const hcp = await createNewHcpApi(env)\n const recoveryKey = await hcp.api.recoveryApi.createRecoveryInfoForAvailableKeyPairs({ lifetimeSeconds: 5 })\n await sleep(1000)\n const recovered1 = await hcp.api.recoveryApi.recoverKeyPairs(recoveryKey, false)\n expect(recovered1).to.have.keys('success')\n await sleep(1000)\n const recovered2 = await hcp.api.recoveryApi.recoverKeyPairs(recoveryKey, false)\n expect(recovered2).to.have.keys('success')\n await sleep(3000)\n const recovered3 = await hcp.api.recoveryApi.recoverKeyPairs(recoveryKey, false)\n expect(recovered3).to.deep.equal({ failure: RecoveryDataUseFailureReason.Missing })\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("isomorphic-fetch");
13
+ const mocha_1 = require("mocha");
14
+ const test_utils_1 = require("../utils/test_utils");
15
+ const icc_x_api_1 = require("../../icc-x-api");
16
+ var initApi = test_utils_1.TestUtils.initApi;
17
+ const crypto_1 = require("crypto");
18
+ const TimeTable_1 = require("../../icc-api/model/TimeTable");
19
+ const Code_1 = require("../../icc-api/model/Code");
20
+ const TimeTableItem_1 = require("../../icc-api/model/TimeTableItem");
21
+ const TimeTableHour_1 = require("../../icc-api/model/TimeTableHour");
22
+ const chai_1 = require("chai");
23
+ const types_1 = require("@icure/test-setup/types");
24
+ (0, test_utils_1.setLocalStorage)(fetch);
25
+ let env;
26
+ function instanceTimeTableFor(timeTableApi, user) {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ return timeTableApi.newInstance(user, new TimeTable_1.TimeTable({
29
+ id: (0, crypto_1.randomUUID)(),
30
+ tags: [
31
+ new Code_1.Code({
32
+ id: 'ICURE|MY-CODE|1',
33
+ code: 'MY-CODE',
34
+ type: 'ICURE',
35
+ version: '1',
36
+ }),
37
+ ],
38
+ name: 'Main TimeTable',
39
+ startTime: 20221101000,
40
+ endTime: 20221128000,
41
+ items: [
42
+ new TimeTableItem_1.TimeTableItem({
43
+ id: (0, crypto_1.randomUUID)(),
44
+ rrule: 'RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=10',
45
+ days: ['monday', 'tuesday', 'thursday'],
46
+ hours: [
47
+ new TimeTableHour_1.TimeTableHour({
48
+ startHour: 1000,
49
+ endHour: 1800,
50
+ }),
51
+ ],
52
+ }),
53
+ ],
54
+ }));
55
+ });
56
+ }
57
+ describe('icc-x-time-table-api Tests', () => {
58
+ (0, mocha_1.before)(function () {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ this.timeout(600000);
61
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
62
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
63
+ });
64
+ });
65
+ it('Create TimeTable Success', () => __awaiter(void 0, void 0, void 0, function* () {
66
+ // Given
67
+ const { userApi: userApiForHcp, timetableApi: timeTableApiForHcp, cryptoApi } = yield initApi(env, test_utils_1.hcp1Username);
68
+ const hcpUser = yield userApiForHcp.getCurrentUser();
69
+ const baseTimeTable = yield instanceTimeTableFor(timeTableApiForHcp, hcpUser);
70
+ // When
71
+ const createdTimeTable = yield timeTableApiForHcp.createTimeTable(baseTimeTable);
72
+ // Then
73
+ (0, chai_1.expect)(createdTimeTable.id).to.equals(baseTimeTable.id);
74
+ (0, chai_1.expect)(createdTimeTable.name).to.equals(baseTimeTable.name);
75
+ (0, chai_1.expect)(createdTimeTable.startTime).to.equals(baseTimeTable.startTime);
76
+ (0, chai_1.expect)(createdTimeTable.items.length).to.equals(1);
77
+ (0, chai_1.expect)(yield cryptoApi.xapi.encryptionKeysOf({ entity: createdTimeTable, type: icc_x_api_1.EntityWithDelegationTypeName.TimeTable }, undefined)).to.have.length(1);
78
+ (0, chai_1.expect)(yield cryptoApi.xapi.secretIdsOf({ entity: createdTimeTable, type: icc_x_api_1.EntityWithDelegationTypeName.TimeTable }, undefined)).to.have.length(0);
79
+ (0, chai_1.expect)(yield cryptoApi.xapi.owningEntityIdsOf({ entity: createdTimeTable, type: icc_x_api_1.EntityWithDelegationTypeName.TimeTable }, undefined)).to.have.length(0);
80
+ }));
81
+ it('Share with should work as expected', () => __awaiter(void 0, void 0, void 0, function* () {
82
+ const api1 = yield initApi(env, test_utils_1.hcp1Username);
83
+ const user1 = yield api1.userApi.getCurrentUser();
84
+ const api2 = yield initApi(env, test_utils_1.hcp2Username);
85
+ const user2 = yield api2.userApi.getCurrentUser();
86
+ const entity = (yield api1.timetableApi.createTimeTable(yield api1.timetableApi.newInstance(user1, {})));
87
+ yield api2.timetableApi
88
+ .getTimeTable(entity.id)
89
+ .then(() => {
90
+ throw new Error('Should not be able to get the entity');
91
+ })
92
+ .catch(() => {
93
+ /* expected */
94
+ });
95
+ yield api1.timetableApi.shareWith(user2.healthcarePartyId, entity);
96
+ const retrieved = yield api2.timetableApi.getTimeTable(entity.id);
97
+ (0, chai_1.expect)(retrieved.id).to.equal(entity.id);
98
+ }));
99
+ });
100
+ //# sourceMappingURL=icc-time-table-x-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icc-time-table-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-time-table-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\n\nimport { before } from 'mocha'\nimport { getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { EntityWithDelegationTypeName, IccTimeTableXApi } from '../../icc-x-api'\nimport initApi = TestUtils.initApi\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { TimeTable } from '../../icc-api/model/TimeTable'\nimport { Code } from '../../icc-api/model/Code'\nimport { TimeTableItem } from '../../icc-api/model/TimeTableItem'\nimport { TimeTableHour } from '../../icc-api/model/TimeTableHour'\nimport { expect } from 'chai'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\nasync function instanceTimeTableFor(timeTableApi: IccTimeTableXApi, user: User): Promise<TimeTable> {\n return timeTableApi.newInstance(\n user,\n new TimeTable({\n id: randomUUID(),\n tags: [\n new Code({\n id: 'ICURE|MY-CODE|1',\n code: 'MY-CODE',\n type: 'ICURE',\n version: '1',\n }),\n ],\n name: 'Main TimeTable',\n startTime: 20221101000,\n endTime: 20221128000,\n items: [\n new TimeTableItem({\n id: randomUUID(),\n rrule: 'RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=10',\n days: ['monday', 'tuesday', 'thursday'],\n hours: [\n new TimeTableHour({\n startHour: 1000,\n endHour: 1800,\n }),\n ],\n }),\n ],\n })\n )\n}\n\ndescribe('icc-x-time-table-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('Create TimeTable Success', async () => {\n // Given\n const { userApi: userApiForHcp, timetableApi: timeTableApiForHcp, cryptoApi } = await initApi(env, hcp1Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const baseTimeTable = await instanceTimeTableFor(timeTableApiForHcp, hcpUser)\n\n // When\n const createdTimeTable = await timeTableApiForHcp.createTimeTable(baseTimeTable)\n\n // Then\n expect(createdTimeTable.id).to.equals(baseTimeTable.id)\n expect(createdTimeTable.name).to.equals(baseTimeTable.name)\n expect(createdTimeTable.startTime).to.equals(baseTimeTable.startTime)\n expect(createdTimeTable.items!.length).to.equals(1)\n expect(\n await cryptoApi.xapi.encryptionKeysOf({ entity: createdTimeTable, type: EntityWithDelegationTypeName.TimeTable }, undefined)\n ).to.have.length(1)\n expect(await cryptoApi.xapi.secretIdsOf({ entity: createdTimeTable, type: EntityWithDelegationTypeName.TimeTable }, undefined)).to.have.length(0)\n expect(\n await cryptoApi.xapi.owningEntityIdsOf({ entity: createdTimeTable, type: EntityWithDelegationTypeName.TimeTable }, undefined)\n ).to.have.length(0)\n })\n\n it('Share with should work as expected', async () => {\n const api1 = await initApi(env!, hcp1Username)\n const user1 = await api1.userApi.getCurrentUser()\n const api2 = await initApi(env!, hcp2Username)\n const user2 = await api2.userApi.getCurrentUser()\n const entity = (await api1.timetableApi.createTimeTable(await api1.timetableApi.newInstance(user1, {})))!\n await api2.timetableApi\n .getTimeTable(entity.id!)\n .then(() => {\n throw new Error('Should not be able to get the entity')\n })\n .catch(() => {\n /* expected */\n })\n await api1.timetableApi.shareWith(user2.healthcarePartyId!, entity)\n const retrieved = await api2.timetableApi.getTimeTable(entity.id!)\n expect(retrieved.id).to.equal(entity.id)\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("isomorphic-fetch");
13
+ const test_utils_1 = require("../utils/test_utils");
14
+ const mocha_1 = require("mocha");
15
+ const icc_x_api_1 = require("../../icc-x-api");
16
+ const Patient_1 = require("../../icc-api/model/Patient");
17
+ const crypto_1 = require("crypto");
18
+ const chai_1 = require("chai");
19
+ const types_1 = require("@icure/test-setup/types");
20
+ const Topic_1 = require("../../icc-api/model/Topic");
21
+ const SecureDelegation_1 = require("../../icc-api/model/SecureDelegation");
22
+ var initApi = test_utils_1.TestUtils.initApi;
23
+ const FilterChainTopic_1 = require("../../icc-api/model/FilterChainTopic");
24
+ const TopicByHcPartyFilter_1 = require("../../icc-x-api/filters/TopicByHcPartyFilter");
25
+ const TopicByParticipantFilter_1 = require("../../icc-x-api/filters/TopicByParticipantFilter");
26
+ const icc_api_1 = require("../../icc-api");
27
+ (0, test_utils_1.setLocalStorage)(fetch);
28
+ let env;
29
+ (0, test_utils_1.describeNoLite)('icc-topic-x-api Tests', () => {
30
+ (0, mocha_1.before)(function () {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ this.timeout(600000);
33
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
34
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
35
+ });
36
+ });
37
+ function createTopic(topicApi, hcpUser, patient, ...additionalUser) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ return topicApi.createTopic(yield topicApi.newInstance(hcpUser, patient, new Topic_1.Topic({
40
+ id: (0, crypto_1.randomUUID)(),
41
+ description: 'Topic description',
42
+ activeParticipants: Object.assign(Object.assign({}, Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId, u.role]))), { [hcpUser.healthcarePartyId]: Topic_1.TopicRole.OWNER }),
43
+ }), {
44
+ additionalDelegates: Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId, SecureDelegation_1.SecureDelegation.AccessLevelEnum.WRITE])),
45
+ }));
46
+ });
47
+ }
48
+ function createPatient(patientApiForHcp, hcpUser) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ return patientApiForHcp.createPatientWithUser(hcpUser, yield patientApiForHcp.newInstance(hcpUser, new Patient_1.Patient({
51
+ id: (0, crypto_1.randomUUID)(),
52
+ firstName: 'John',
53
+ lastName: 'Snow',
54
+ note: 'Winter is coming',
55
+ })));
56
+ });
57
+ }
58
+ (0, mocha_1.it)('An HCP should be able to create a topic with participants', () => __awaiter(void 0, void 0, void 0, function* () {
59
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
60
+ const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
61
+ const hcpUser = yield userApiForHcp.getCurrentUser();
62
+ const hcpUser2 = yield userApiForHcp2.getCurrentUser();
63
+ const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
64
+ const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
65
+ const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
66
+ (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
67
+ const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
68
+ (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
69
+ })).timeout(10000);
70
+ (0, mocha_1.it)('An HCP should be able to create an encrypted topic', () => __awaiter(void 0, void 0, void 0, function* () {
71
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
72
+ const baseTopicApi = new icc_api_1.IccTopicApi(env.iCureUrl, topicApiForHcp._headers, topicApiForHcp.authenticationProvider, topicApiForHcp.fetchImpl);
73
+ const hcpUser = yield userApiForHcp.getCurrentUser();
74
+ const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
75
+ const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient);
76
+ const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
77
+ (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
78
+ (0, chai_1.expect)(retrievedByHcp.description).to.not.be.undefined;
79
+ const notDecryptedTopic = yield baseTopicApi.getTopic(createdTopic.id);
80
+ (0, chai_1.expect)(notDecryptedTopic).to.not.deep.equal(createdTopic);
81
+ (0, chai_1.expect)(notDecryptedTopic.description).to.be.undefined;
82
+ (0, chai_1.expect)(notDecryptedTopic.encryptedSelf).to.not.be.undefined;
83
+ })).timeout(10000);
84
+ (0, mocha_1.it)('An HCP should be able to create a topic with no participants and add participants later', () => __awaiter(void 0, void 0, void 0, function* () {
85
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
86
+ const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
87
+ const hcpUser = yield userApiForHcp.getCurrentUser();
88
+ const hcpUser2 = yield userApiForHcp2.getCurrentUser();
89
+ const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
90
+ const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient);
91
+ const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
92
+ (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
93
+ try {
94
+ yield topicApiForHcp2.getTopic(createdTopic.id);
95
+ chai_1.expect.fail('Should not be able to get topic');
96
+ }
97
+ catch (e) {
98
+ (0, chai_1.expect)(e.statusCode).to.equal(403);
99
+ }
100
+ yield topicApiForHcp.addParticipantWithTopic({ dataOwnerId: hcpUser2.healthcarePartyId, topicRole: Topic_1.TopicRole.PARTICIPANT }, createdTopic);
101
+ const retrievedByHcpAfterAddParticipant = yield topicApiForHcp.getTopic(createdTopic.id);
102
+ const retrievedByHcp2AfterAddParticipant = yield topicApiForHcp2.getTopic(createdTopic.id);
103
+ (0, chai_1.expect)(retrievedByHcp2AfterAddParticipant).to.deep.equal(retrievedByHcpAfterAddParticipant);
104
+ (0, chai_1.expect)(retrievedByHcpAfterAddParticipant.id).to.equal(createdTopic.id);
105
+ (0, chai_1.expect)(retrievedByHcp2AfterAddParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId, hcpUser2.healthcarePartyId);
106
+ (0, chai_1.expect)(retrievedByHcp2AfterAddParticipant.activeParticipants[hcpUser2.healthcarePartyId]).to.equal(Topic_1.TopicRole.PARTICIPANT);
107
+ (0, chai_1.expect)(retrievedByHcp2AfterAddParticipant.activeParticipants[hcpUser.healthcarePartyId]).to.equal(Topic_1.TopicRole.OWNER);
108
+ })).timeout(10000);
109
+ (0, mocha_1.it)('A participant should not be able to remove another participant', () => __awaiter(void 0, void 0, void 0, function* () {
110
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
111
+ const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
112
+ const hcpUser = yield userApiForHcp.getCurrentUser();
113
+ const hcpUser2 = yield userApiForHcp2.getCurrentUser();
114
+ const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
115
+ const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
116
+ const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
117
+ (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
118
+ const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
119
+ (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
120
+ try {
121
+ yield topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser.healthcarePartyId }, createdTopic.id);
122
+ chai_1.expect.fail('Should not be able to remove participant');
123
+ }
124
+ catch (e) {
125
+ (0, chai_1.expect)(e.statusCode).to.equal(403);
126
+ }
127
+ })).timeout(10000);
128
+ (0, mocha_1.it)('A participant should be able to remove himself but still able to get topic', () => __awaiter(void 0, void 0, void 0, function* () {
129
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
130
+ const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
131
+ const hcpUser = yield userApiForHcp.getCurrentUser();
132
+ const hcpUser2 = yield userApiForHcp2.getCurrentUser();
133
+ const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
134
+ const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
135
+ const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
136
+ (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
137
+ const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
138
+ (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
139
+ yield topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId }, createdTopic.id);
140
+ const retrievedByHcpAfterRemoveParticipant = yield topicApiForHcp.getTopic(createdTopic.id);
141
+ const retrievedByHcp2AfterRemoveParticipant = yield topicApiForHcp2.getTopic(createdTopic.id);
142
+ (0, chai_1.expect)(retrievedByHcpAfterRemoveParticipant).to.deep.equal(retrievedByHcp2AfterRemoveParticipant);
143
+ })).timeout(10000);
144
+ (0, mocha_1.it)('An owner should be able to remove a participant', () => __awaiter(void 0, void 0, void 0, function* () {
145
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
146
+ const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
147
+ const hcpUser = yield userApiForHcp.getCurrentUser();
148
+ const hcpUser2 = yield userApiForHcp2.getCurrentUser();
149
+ const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
150
+ const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
151
+ const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
152
+ (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
153
+ const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
154
+ (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
155
+ const topicWithRemovedParticipant = yield topicApiForHcp.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId }, createdTopic.id);
156
+ (0, chai_1.expect)(topicWithRemovedParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId);
157
+ const retrievedByHcp2AfterRemoveParticipant = yield topicApiForHcp2.getTopic(createdTopic.id);
158
+ (0, chai_1.expect)(retrievedByHcp2AfterRemoveParticipant).to.deep.equal(topicWithRemovedParticipant);
159
+ })).timeout(10000);
160
+ (0, mocha_1.it)('A participant should be able to filter topics using TopicByHcPartyFilter', () => __awaiter(void 0, void 0, void 0, function* () {
161
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
162
+ const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
163
+ const hcpUser = yield userApiForHcp.getCurrentUser();
164
+ const hcpUser2 = yield userApiForHcp2.getCurrentUser();
165
+ const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
166
+ const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
167
+ const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
168
+ (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
169
+ const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
170
+ (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
171
+ const filterChain = (hcpId) => new FilterChainTopic_1.FilterChainTopic({
172
+ filter: new TopicByHcPartyFilter_1.TopicByHcPartyFilter({
173
+ hcpId,
174
+ }),
175
+ });
176
+ const filterResultForHcp = yield topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId));
177
+ (0, chai_1.expect)(filterResultForHcp.rows.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic);
178
+ const filterResultForHcp2 = yield topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId));
179
+ (0, chai_1.expect)(filterResultForHcp2.rows.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic);
180
+ })).timeout(60000);
181
+ (0, mocha_1.it)('A participant should be able to filter topics using TopicByParticipantFilter', () => __awaiter(void 0, void 0, void 0, function* () {
182
+ var _a, _b;
183
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
184
+ const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
185
+ const hcpUser = yield userApiForHcp.getCurrentUser();
186
+ const hcpUser2 = yield userApiForHcp2.getCurrentUser();
187
+ const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
188
+ const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
189
+ const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
190
+ (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
191
+ const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
192
+ (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
193
+ const filterChain = (hcpId) => new FilterChainTopic_1.FilterChainTopic({
194
+ filter: new TopicByParticipantFilter_1.TopicByParticipantFilter({
195
+ participantId: hcpId,
196
+ }),
197
+ });
198
+ const filterResultForHcp = yield topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId));
199
+ (0, chai_1.expect)((_a = filterResultForHcp.rows) === null || _a === void 0 ? void 0 : _a.map((t) => t.id)).to.includes(createdTopic.id);
200
+ const filterResultForHcp2 = yield topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId));
201
+ (0, chai_1.expect)((_b = filterResultForHcp2.rows) === null || _b === void 0 ? void 0 : _b.map((t) => t.id)).to.includes(createdTopic.id);
202
+ })).timeout(10000);
203
+ function doXOnYAndSubscribe(connectionPromise, x, statusListener, eventReceivedPromiseReject, eventReceivedPromise) {
204
+ return __awaiter(this, void 0, void 0, function* () {
205
+ const connection = (yield connectionPromise)
206
+ .onClosed(() => __awaiter(this, void 0, void 0, function* () {
207
+ statusListener('CLOSED');
208
+ yield (0, icc_x_api_1.sleep)(3000);
209
+ }))
210
+ .onConnected(() => __awaiter(this, void 0, void 0, function* () {
211
+ statusListener('CONNECTED');
212
+ yield (0, icc_x_api_1.sleep)(2000);
213
+ yield x();
214
+ }));
215
+ const timeout = setTimeout(eventReceivedPromiseReject, 20000);
216
+ yield eventReceivedPromise.then(() => clearTimeout(timeout)).catch(() => { });
217
+ connection.close();
218
+ yield (0, icc_x_api_1.sleep)(3000);
219
+ });
220
+ }
221
+ const subscribeAndCreateTopic = (options, eventTypes) => __awaiter(void 0, void 0, void 0, function* () {
222
+ const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
223
+ const loggedUser = yield userApiForHcp.getCurrentUser();
224
+ const connectionPromise = (options, eventListener) => __awaiter(void 0, void 0, void 0, function* () {
225
+ return topicApiForHcp.subscribeToTopicEvents(eventTypes, new TopicByHcPartyFilter_1.TopicByHcPartyFilter({
226
+ hcpId: loggedUser.healthcarePartyId,
227
+ }), eventListener, options);
228
+ });
229
+ const events = [];
230
+ const statuses = [];
231
+ let eventReceivedPromiseResolve;
232
+ let eventReceivedPromiseReject;
233
+ const eventReceivedPromise = new Promise((res, rej) => {
234
+ eventReceivedPromiseResolve = res;
235
+ eventReceivedPromiseReject = rej;
236
+ });
237
+ yield doXOnYAndSubscribe(connectionPromise(options, (healthcareElement) => __awaiter(void 0, void 0, void 0, function* () {
238
+ events.push(healthcareElement);
239
+ eventReceivedPromiseResolve();
240
+ })), () => __awaiter(void 0, void 0, void 0, function* () {
241
+ const user = yield userApiForHcp.getCurrentUser();
242
+ const patient = yield patientApiForHcp.createPatientWithUser(user, yield patientApiForHcp.newInstance(user, new Patient_1.Patient({
243
+ firstName: 'John',
244
+ lastName: 'Snow',
245
+ note: 'Winter is coming',
246
+ })));
247
+ const topic = yield topicApiForHcp.createTopic(yield topicApiForHcp.newInstance(loggedUser, patient, new Topic_1.Topic({
248
+ description: 'Topic description',
249
+ })));
250
+ }), (status) => {
251
+ statuses.push(status);
252
+ }, eventReceivedPromiseReject, eventReceivedPromise);
253
+ events === null || events === void 0 ? void 0 : events.forEach((event) => console.log(`Event : ${event}`));
254
+ statuses === null || statuses === void 0 ? void 0 : statuses.forEach((status) => console.log(`Status : ${status}`));
255
+ (0, chai_1.expect)(statuses).to.have.length(2);
256
+ (0, chai_1.expect)(events).to.have.length(1);
257
+ (0, chai_1.expect)(events.every((event) => event instanceof Topic_1.Topic)).to.be.true;
258
+ });
259
+ (0, mocha_1.it)('CREATE Topic without options', () => __awaiter(void 0, void 0, void 0, function* () {
260
+ yield subscribeAndCreateTopic({}, ['CREATE']);
261
+ })).timeout(60000);
262
+ (0, mocha_1.it)('CREATE Topic with options', () => __awaiter(void 0, void 0, void 0, function* () {
263
+ yield subscribeAndCreateTopic({
264
+ connectionRetryIntervalMs: 10000,
265
+ connectionMaxRetry: 5,
266
+ }, ['CREATE']);
267
+ })).timeout(60000);
268
+ });
269
+ //# sourceMappingURL=icc-topic-x-api.js.map