@icure/api 8.2.2 → 8.2.4
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.
- package/icc-api/api/IccAuthApi.js +1 -1
- package/icc-api/api/IccAuthApi.js.map +1 -1
- package/icc-api/api/IccDocumentApi.js.map +1 -1
- package/icc-api/api/IccFormApi.js.map +1 -1
- package/icc-api/api/IccReceiptApi.js.map +1 -1
- package/icc-api/api/IccRestApiPath.js +1 -2
- package/icc-api/api/IccRestApiPath.js.map +1 -1
- package/icc-api/api/XHR.js +17 -8
- package/icc-api/api/XHR.js.map +1 -1
- package/icc-api/model/Address.js +1 -1
- package/icc-api/model/Address.js.map +1 -1
- package/icc-api/model/Amp.js +1 -1
- package/icc-api/model/Amp.js.map +1 -1
- package/icc-api/model/AmpComponent.js +1 -1
- package/icc-api/model/AmpComponent.js.map +1 -1
- package/icc-api/model/Ampp.js +1 -1
- package/icc-api/model/Ampp.js.map +1 -1
- package/icc-api/model/AmppComponent.js +1 -1
- package/icc-api/model/AmppComponent.js.map +1 -1
- package/icc-api/model/CareTeamMember.js +1 -1
- package/icc-api/model/CareTeamMember.js.map +1 -1
- package/icc-api/model/CareTeamMembership.js +1 -1
- package/icc-api/model/CareTeamMembership.js.map +1 -1
- package/icc-api/model/Code.js +1 -1
- package/icc-api/model/Code.js.map +1 -1
- package/icc-api/model/Contact.js.map +1 -1
- package/icc-api/model/Content.js.map +1 -1
- package/icc-api/model/DataOwnerTypeEnum.js +1 -1
- package/icc-api/model/DataOwnerTypeEnum.js.map +1 -1
- package/icc-api/model/DataOwnerWithType.js +1 -1
- package/icc-api/model/DataOwnerWithType.js.map +1 -1
- package/icc-api/model/DatabaseSynchronization.js +1 -1
- package/icc-api/model/DatabaseSynchronization.js.map +1 -1
- package/icc-api/model/Dmpp.js +1 -1
- package/icc-api/model/Dmpp.js.map +1 -1
- package/icc-api/model/Document.js +1 -1
- package/icc-api/model/Document.js.map +1 -1
- package/icc-api/model/DocumentTemplate.d.ts +1 -1
- package/icc-api/model/DocumentTemplate.js +1 -1
- package/icc-api/model/DocumentTemplate.js.map +1 -1
- package/icc-api/model/Editor.js +1 -1
- package/icc-api/model/Editor.js.map +1 -1
- package/icc-api/model/EfactInvoice.js +1 -1
- package/icc-api/model/EfactInvoice.js.map +1 -1
- package/icc-api/model/EmailOrSmsMessage.js +1 -1
- package/icc-api/model/EmailOrSmsMessage.js.map +1 -1
- package/icc-api/model/FlatRateTarification.js +1 -1
- package/icc-api/model/FlatRateTarification.js.map +1 -1
- package/icc-api/model/Formula.js +1 -1
- package/icc-api/model/Formula.js.map +1 -1
- package/icc-api/model/FrontEndMigration.js +1 -1
- package/icc-api/model/FrontEndMigration.js.map +1 -1
- package/icc-api/model/HealthElement.js +1 -1
- package/icc-api/model/HealthElement.js.map +1 -1
- package/icc-api/model/HealthcareParty.js +1 -1
- package/icc-api/model/HealthcareParty.js.map +1 -1
- package/icc-api/model/HealthcarePartyHistoryStatus.js +1 -1
- package/icc-api/model/HealthcarePartyHistoryStatus.js.map +1 -1
- package/icc-api/model/Ingredient.js +1 -1
- package/icc-api/model/Ingredient.js.map +1 -1
- package/icc-api/model/Invoice.js +1 -1
- package/icc-api/model/Invoice.js.map +1 -1
- package/icc-api/model/InvoiceItem.js +1 -1
- package/icc-api/model/InvoiceItem.js.map +1 -1
- package/icc-api/model/InvoicingCode.js +1 -1
- package/icc-api/model/InvoicingCode.js.map +1 -1
- package/icc-api/model/MaintenanceTask.js +1 -1
- package/icc-api/model/MaintenanceTask.js.map +1 -1
- package/icc-api/model/Measure.js.map +1 -1
- package/icc-api/model/MedicalHouseContract.js +1 -1
- package/icc-api/model/MedicalHouseContract.js.map +1 -1
- package/icc-api/model/ModelHelper.js +9 -10
- package/icc-api/model/ModelHelper.js.map +1 -1
- package/icc-api/model/Partnership.js +1 -1
- package/icc-api/model/Partnership.js.map +1 -1
- package/icc-api/model/Patient.js +1 -1
- package/icc-api/model/Patient.js.map +1 -1
- package/icc-api/model/PatientByHcPartyGenderEducationProfession.js +1 -1
- package/icc-api/model/PatientByHcPartyGenderEducationProfession.js.map +1 -1
- package/icc-api/model/PatientHealthCareParty.js +1 -1
- package/icc-api/model/PatientHealthCareParty.js.map +1 -1
- package/icc-api/model/Payment.js +1 -1
- package/icc-api/model/Payment.js.map +1 -1
- package/icc-api/model/PermissionCriterion.js +1 -1
- package/icc-api/model/PermissionCriterion.js.map +1 -1
- package/icc-api/model/PermissionItem.js +1 -1
- package/icc-api/model/PermissionItem.js.map +1 -1
- package/icc-api/model/PersonName.js +1 -1
- package/icc-api/model/PersonName.js.map +1 -1
- package/icc-api/model/PropertyTypeStub.js +1 -1
- package/icc-api/model/PropertyTypeStub.js.map +1 -1
- package/icc-api/model/Reimbursement.js +1 -1
- package/icc-api/model/Reimbursement.js.map +1 -1
- package/icc-api/model/RoleSourceEnum.js +1 -1
- package/icc-api/model/RoleSourceEnum.js.map +1 -1
- package/icc-api/model/SecureDelegation.js +1 -1
- package/icc-api/model/SecureDelegation.js.map +1 -1
- package/icc-api/model/Service.js.map +1 -1
- package/icc-api/model/StandardSubstance.js +1 -1
- package/icc-api/model/StandardSubstance.js.map +1 -1
- package/icc-api/model/SumehrValidity.js +1 -1
- package/icc-api/model/SumehrValidity.js.map +1 -1
- package/icc-api/model/Tarification.js +1 -1
- package/icc-api/model/Tarification.js.map +1 -1
- package/icc-api/model/Telecom.js +1 -1
- package/icc-api/model/Telecom.js.map +1 -1
- package/icc-api/model/Topic.js +1 -1
- package/icc-api/model/Topic.js.map +1 -1
- package/icc-api/model/TypedValueObject.js +1 -1
- package/icc-api/model/TypedValueObject.js.map +1 -1
- package/icc-api/model/User.js +1 -1
- package/icc-api/model/User.js.map +1 -1
- package/icc-api/model/UserTypeEnum.js +1 -1
- package/icc-api/model/UserTypeEnum.js.map +1 -1
- package/icc-api/model/VirtualIngredient.js +1 -1
- package/icc-api/model/VirtualIngredient.js.map +1 -1
- package/icc-api/model/internal/RecoveryData.js +1 -1
- package/icc-api/model/internal/RecoveryData.js.map +1 -1
- package/icc-api/model/requests/EntityBulkShareResult.js.map +1 -1
- package/icc-api/model/requests/EntityShareOrMetadataUpdateRequest.js.map +1 -1
- package/icc-api/model/requests/EntityShareRequest.js +1 -1
- package/icc-api/model/requests/EntityShareRequest.js.map +1 -1
- package/icc-api/model/requests/EntitySharedMetadataUpdateRequest.js +1 -1
- package/icc-api/model/requests/EntitySharedMetadataUpdateRequest.js.map +1 -1
- package/icc-x-api/auth/AuthenticationProvider.js.map +1 -1
- package/icc-x-api/auth/BasicAuthService.js.map +1 -1
- package/icc-x-api/auth/EnsembleAuthService.js.map +1 -1
- package/icc-x-api/auth/JwtAuthService.js.map +1 -1
- package/icc-x-api/auth/JwtBridgedAuthService.d.ts +1 -1
- package/icc-x-api/auth/JwtBridgedAuthService.js +1 -1
- package/icc-x-api/auth/JwtBridgedAuthService.js.map +1 -1
- package/icc-x-api/auth/JwtUtils.js +3 -4
- package/icc-x-api/auth/JwtUtils.js.map +1 -1
- package/icc-x-api/auth/NoAuthService.js.map +1 -1
- package/icc-x-api/auth/SmartAuthProvider.d.ts +1 -1
- package/icc-x-api/auth/SmartAuthProvider.js +1 -1
- package/icc-x-api/auth/SmartAuthProvider.js.map +1 -1
- package/icc-x-api/crypto/AES.js.map +1 -1
- package/icc-x-api/crypto/AccessControlKeysHeadersProvider.js.map +1 -1
- package/icc-x-api/crypto/AccessControlSecretUtils.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeDataManager.js +10 -10
- package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeKeysManager.js +4 -4
- package/icc-x-api/crypto/BaseExchangeKeysManager.js.map +1 -1
- package/icc-x-api/crypto/CryptoStrategies.d.ts +5 -7
- package/icc-x-api/crypto/CryptoStrategies.js.map +1 -1
- package/icc-x-api/crypto/DelegationsDeAnonymization.js +1 -1
- package/icc-x-api/crypto/DelegationsDeAnonymization.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataManager.js +7 -9
- package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataMapManager.js.map +1 -1
- package/icc-x-api/crypto/ExchangeKeysManager.js +1 -1
- package/icc-x-api/crypto/ExchangeKeysManager.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +11 -10
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
- package/icc-x-api/crypto/HMACUtils.js.map +1 -1
- package/icc-x-api/crypto/KeyRecovery.js +5 -5
- package/icc-x-api/crypto/KeyRecovery.js.map +1 -1
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js +3 -3
- package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js.map +1 -1
- package/icc-x-api/crypto/RSA.js +4 -4
- package/icc-x-api/crypto/RSA.js.map +1 -1
- package/icc-x-api/crypto/RecoveryDataEncryption.js +1 -1
- package/icc-x-api/crypto/RecoveryDataEncryption.js.map +1 -1
- package/icc-x-api/crypto/SecretIdUseOption.js +1 -1
- package/icc-x-api/crypto/SecretIdUseOption.js.map +1 -1
- package/icc-x-api/crypto/SecureDelegationsEncryption.js +4 -4
- package/icc-x-api/crypto/SecureDelegationsEncryption.js.map +1 -1
- package/icc-x-api/crypto/SecureDelegationsManager.js +1 -1
- package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
- package/icc-x-api/crypto/SecurityMetadataDecryptor.d.ts +1 -1
- package/icc-x-api/crypto/SecurityMetadataDecryptor.js +9 -9
- package/icc-x-api/crypto/SecurityMetadataDecryptor.js.map +1 -1
- package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
- package/icc-x-api/crypto/ShareMetadataBehaviour.js +1 -1
- package/icc-x-api/crypto/ShareMetadataBehaviour.js.map +1 -1
- package/icc-x-api/crypto/TransferKeysManager.js +1 -1
- package/icc-x-api/crypto/TransferKeysManager.js.map +1 -1
- package/icc-x-api/crypto/UserEncryptionKeysManager.js +2 -2
- package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
- package/icc-x-api/crypto/shamir.d.ts +2 -2
- package/icc-x-api/crypto/shamir.js +4 -4
- package/icc-x-api/crypto/shamir.js.map +1 -1
- package/icc-x-api/crypto/utils.js +14 -15
- package/icc-x-api/crypto/utils.js.map +1 -1
- package/icc-x-api/icc-accesslog-x-api.js +10 -10
- package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
- package/icc-x-api/icc-bekmehr-x-api.js.map +1 -1
- package/icc-x-api/icc-calendar-item-x-api.js +7 -7
- package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
- package/icc-x-api/icc-classification-x-api.js +5 -5
- package/icc-x-api/icc-classification-x-api.js.map +1 -1
- package/icc-x-api/icc-code-x-api.js.map +1 -1
- package/icc-x-api/icc-contact-x-api.js +12 -12
- package/icc-x-api/icc-contact-x-api.js.map +1 -1
- package/icc-x-api/icc-data-owner-x-api.js.map +1 -1
- package/icc-x-api/icc-device-x-api.js +2 -2
- package/icc-x-api/icc-device-x-api.js.map +1 -1
- package/icc-x-api/icc-doctemplate-x-api.js.map +1 -1
- package/icc-x-api/icc-document-x-api.js +15 -15
- package/icc-x-api/icc-document-x-api.js.map +1 -1
- package/icc-x-api/icc-form-x-api.js +7 -7
- package/icc-x-api/icc-form-x-api.js.map +1 -1
- package/icc-x-api/icc-hcparty-x-api.js +4 -4
- package/icc-x-api/icc-hcparty-x-api.js.map +1 -1
- package/icc-x-api/icc-helement-x-api.js +10 -10
- package/icc-x-api/icc-helement-x-api.js.map +1 -1
- package/icc-x-api/icc-icure-maintenance-x-api.js.map +1 -1
- package/icc-x-api/icc-invoice-x-api.js +7 -7
- package/icc-x-api/icc-invoice-x-api.js.map +1 -1
- package/icc-x-api/icc-maintenance-task-x-api.js +7 -7
- package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
- package/icc-x-api/icc-message-x-api.js +8 -8
- package/icc-x-api/icc-message-x-api.js.map +1 -1
- package/icc-x-api/icc-patient-x-api.js +11 -11
- package/icc-x-api/icc-patient-x-api.js.map +1 -1
- package/icc-x-api/icc-receipt-x-api.js +10 -10
- package/icc-x-api/icc-receipt-x-api.js.map +1 -1
- package/icc-x-api/icc-recovery-x-api.js +4 -4
- package/icc-x-api/icc-recovery-x-api.js.map +1 -1
- package/icc-x-api/icc-time-table-x-api.js +5 -5
- package/icc-x-api/icc-time-table-x-api.js.map +1 -1
- package/icc-x-api/icc-topic-x-api.js +9 -9
- package/icc-x-api/icc-topic-x-api.js.map +1 -1
- package/icc-x-api/icc-user-x-api.js +4 -4
- package/icc-x-api/icc-user-x-api.js.map +1 -1
- package/icc-x-api/index.js +22 -22
- package/icc-x-api/index.js.map +1 -1
- package/icc-x-api/maintenance/KeyPairUpdateRequest.js +2 -2
- package/icc-x-api/maintenance/KeyPairUpdateRequest.js.map +1 -1
- package/icc-x-api/storage/IcureStorageFacade.js +1 -1
- package/icc-x-api/storage/IcureStorageFacade.js.map +1 -1
- package/icc-x-api/storage/LocalStorageImpl.js +1 -1
- package/icc-x-api/storage/LocalStorageImpl.js.map +1 -1
- package/icc-x-api/utils/EntityWithDelegationTypeName.js +4 -4
- package/icc-x-api/utils/EntityWithDelegationTypeName.js.map +1 -1
- package/icc-x-api/utils/asn1-packer.js +2 -3
- package/icc-x-api/utils/asn1-packer.js.map +1 -1
- package/icc-x-api/utils/asn1-parser.js +1 -2
- package/icc-x-api/utils/asn1-parser.js.map +1 -1
- package/icc-x-api/utils/binary-utils.js +11 -11
- package/icc-x-api/utils/binary-utils.js.map +1 -1
- package/icc-x-api/utils/code-util.js +1 -2
- package/icc-x-api/utils/code-util.js.map +1 -1
- package/icc-x-api/utils/collection-utils.js +5 -6
- package/icc-x-api/utils/collection-utils.js.map +1 -1
- package/icc-x-api/utils/crypto-utils.d.ts +1 -1
- package/icc-x-api/utils/crypto-utils.js +17 -18
- package/icc-x-api/utils/crypto-utils.js.map +1 -1
- package/icc-x-api/utils/formatting-util.js +21 -21
- package/icc-x-api/utils/formatting-util.js.map +1 -1
- package/icc-x-api/utils/functional-util.js +3 -4
- package/icc-x-api/utils/functional-util.js.map +1 -1
- package/icc-x-api/utils/graph-utils.js +3 -4
- package/icc-x-api/utils/graph-utils.js.map +1 -1
- package/icc-x-api/utils/hcp-util.js +4 -4
- package/icc-x-api/utils/hcp-util.js.map +1 -1
- package/icc-x-api/utils/insurability-util.js +6 -7
- package/icc-x-api/utils/insurability-util.js.map +1 -1
- package/icc-x-api/utils/lru-temporised-async-cache.js.map +1 -1
- package/icc-x-api/utils/net-utils.js +3 -4
- package/icc-x-api/utils/net-utils.js.map +1 -1
- package/icc-x-api/utils/person-util.js +3 -4
- package/icc-x-api/utils/person-util.js.map +1 -1
- package/icc-x-api/utils/proxy-utils.js.map +1 -1
- package/icc-x-api/utils/simple-lru-cache.js.map +1 -1
- package/icc-x-api/utils/uuid-encoder.js +2 -2
- package/icc-x-api/utils/uuid-encoder.js.map +1 -1
- package/icc-x-api/utils/websocket.d.ts +0 -1
- package/icc-x-api/utils/websocket.js +3 -3
- package/icc-x-api/utils/websocket.js.map +1 -1
- package/package.json +3 -3
- package/test/icc-api/api/IccAgendaApi.js.map +1 -1
- package/test/icc-api/api/IccCalendarItemApi.js.map +1 -1
- package/test/icc-api/api/IccCalendarItemTypeApi.js +2 -2
- package/test/icc-api/api/IccCalendarItemTypeApi.js.map +1 -1
- package/test/icc-api/api/IccDocumentApi.js.map +1 -1
- package/test/icc-api/api/IccKeywordApi.js.map +1 -1
- package/test/icc-api/api/IccMedicalLocationApi.js.map +1 -1
- package/test/icc-api/api/IccPlaceApi.js.map +1 -1
- package/test/icc-api/api/IccUserApi.js +6 -6
- package/test/icc-x-api/auth/group-switch-test.js.map +1 -1
- package/test/icc-x-api/auth/jwt-concurrency-test.js +1 -2
- package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -1
- package/test/icc-x-api/auth/jwt-provider-test.js.map +1 -1
- package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -1
- package/test/icc-x-api/autofix-anonymity-test.js.map +1 -1
- package/test/icc-x-api/confidential-entities-test.js +1 -1
- package/test/icc-x-api/confidential-entities-test.js.map +1 -1
- package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -1
- package/test/icc-x-api/crud/entities-crud-test-interface.js +24 -24
- package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -1
- package/test/icc-x-api/crypto/anonymous-delegations-test.js +2 -2
- package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -1
- package/test/icc-x-api/crypto/cryptoTest.js.map +1 -1
- package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -1
- package/test/icc-x-api/crypto/exchange-data-manager-test.js +4 -4
- package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -1
- package/test/icc-x-api/crypto/full-crypto-test.js +5 -5
- package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -1
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +7 -7
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -1
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js +2 -2
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -1
- package/test/icc-x-api/crypto/shamir.js.map +1 -1
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js +3 -3
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +1 -1
- package/test/icc-x-api/entity-with-attachments-api-test.js +2 -2
- package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -1
- package/test/icc-x-api/icc-maintenance-task-x-api-test.js +4 -4
- package/test/icc-x-api/icc-message-x-api.js +1 -1
- package/test/icc-x-api/icc-message-x-api.js.map +1 -1
- package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -1
- package/test/icc-x-api/icc-recovery-x-api.js.map +1 -1
- package/test/icc-x-api/icc-topic-x-api.js.map +1 -1
- package/test/icc-x-api/icc-user-x-api-test.js.map +1 -1
- package/test/icc-x-api/patient-user.js.map +1 -1
- package/test/icc-x-api/test-legacy-data-support.js.map +1 -1
- package/test/icc-x-api/utils/graph-test.js.map +1 -1
- package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -1
- package/test/support/CSM-243.js +2 -2
- package/test/support/CSM-243.js.map +1 -1
- package/test/support/CSM-93.js +1 -1
- package/test/support/CSM-93.js.map +1 -1
- package/test/utils/FakeDataOwnerApi.js.map +1 -1
- package/test/utils/FakeEncryptionKeysManager.js +2 -2
- package/test/utils/FakeEncryptionKeysManager.js.map +1 -1
- package/test/utils/FakeExchangeDataApi.js.map +1 -1
- package/test/utils/FakeExchangeDataManager.js.map +1 -1
- package/test/utils/FakeGenericApi.js.map +1 -1
- package/test/utils/TestApi.js +2 -2
- package/test/utils/TestApi.js.map +1 -1
- package/test/utils/TestCryptoStrategies.js.map +1 -1
- package/test/utils/TestStorage.js +2 -2
- package/test/utils/TestStorage.js.map +1 -1
- package/test/utils/test_utils.js +22 -22
- package/test/utils/test_utils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icc-message-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-message-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { describeNoLite, getEnvironmentInitializer, hcp1Username, hcp2Username, hcp3Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before, it, describe } from 'mocha'\nimport { IccMessageXApi, IccPatientXApi, sleep, SubscriptionOptions } from '../../icc-x-api'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { IccTopicXApi } from '../../icc-x-api/icc-topic-x-api'\nimport { Topic, TopicRole } from '../../icc-api/model/Topic'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport { XHR } from '../../icc-api/api/XHR'\nimport { Message } from '../../icc-api/model/Message'\nimport initApi = TestUtils.initApi\nimport XHRError = XHR.XHRError\nimport { FilterChainMessage } from '../../icc-api/model/FilterChainMessage'\nimport { MessageByHcPartyFilter } from '../../icc-x-api/filters/MessageByHcPartyFilter'\nimport { MessageByHcPartyTransportGuidFilter } from '../../icc-x-api/filters/MessageByHcPartyTransportGuidFilter'\nimport { LatestMessageByHcPartyTransportGuidFilter } from '../../icc-x-api/filters/LatestMessageByHcPartyTransportGuidFilter'\nimport { Connection } from '../../icc-api/model/Connection'\nimport { expect, use as chaiUse } from 'chai'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { IccMessageApi } from '../../icc-api'\n\nchaiUse(chaiAsPromised)\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribeNoLite('icc-message-x-api Topic-based tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function createMessage(messageApi: IccMessageXApi, hcpUser: User, patient: Patient | null, topic: Topic) {\n return messageApi.encryptAndCreateMessageInTopic(\n await messageApi.newInstanceWithPatient(\n hcpUser,\n patient,\n new Message({\n id: randomUUID(),\n subject: 'Message Subject',\n sent: new Date().getTime(),\n transportGuid: topic.id,\n readStatus: Object.fromEntries(\n Object.keys(topic.activeParticipants ?? {})\n .filter((p) => p != hcpUser.healthcarePartyId)\n .map((hcpId) => [hcpId, { read: false }])\n ),\n fromHealthcarePartyId: hcpUser.healthcarePartyId,\n }),\n {\n additionalDelegates: Object.fromEntries(\n Object.keys(topic.activeParticipants ?? {})\n .filter((hcpId) => hcpId != hcpUser.healthcarePartyId)\n .map((hcpId) => [hcpId, SecureDelegation.AccessLevelEnum.READ])\n ),\n }\n )\n )\n }\n\n async function createTopic(topicApi: IccTopicXApi, hcpUser: User, patient: Patient, ...additionalUser: { user: User; role: TopicRole }[]) {\n return topicApi.createTopic(\n await topicApi.newInstance(\n hcpUser,\n patient,\n new Topic({\n id: randomUUID(),\n description: 'Topic description',\n activeParticipants: {\n ...Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, u.role])),\n [hcpUser.healthcarePartyId!]: TopicRole.OWNER,\n },\n }),\n {\n additionalDelegates: Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, SecureDelegation.AccessLevelEnum.WRITE])),\n }\n )\n )\n }\n\n async function createPatient(patientApiForHcp: IccPatientXApi, hcpUser: User) {\n return patientApiForHcp.createPatientWithUser(\n hcpUser,\n await patientApiForHcp.newInstance(\n hcpUser,\n new Patient({\n id: randomUUID(),\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n }\n\n it('An HCP should be able to publish a message on a topic and a participant can read it', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n const message2 = await messageApiForHcp2.getAndDecryptMessage(createdMessage.id!)\n\n expect(message).to.deep.equal(createdMessage)\n expect(message).to.deep.equal(message2)\n })\n\n it('An HCP should be able to publish an encrypted message on a topic', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username, {\n encryptedFieldsConfig: {\n message: ['subject'],\n },\n })\n\n const baseMessageApi = new IccMessageApi(\n env!.iCureUrl,\n messageApiForHcp._headers,\n messageApiForHcp.authenticationProvider,\n messageApiForHcp.fetchImpl\n )\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n expect(message).to.deep.equal(createdMessage)\n expect(message.subject).to.not.be.undefined\n\n const notDecryptedMessage = await baseMessageApi.getMessage(createdMessage.id!)\n expect(notDecryptedMessage).to.not.deep.equal(createdMessage)\n expect(notDecryptedMessage.subject).to.be.undefined\n })\n\n it('An HCP should be able to publish a message on a topic and a non-participant cannot read it', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const { messageApi: messageApiForHcp3 } = await initApi(env!, hcp3Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n expect(message).to.not.be.null\n\n await messageApiForHcp3.getAndDecryptMessage(createdMessage.id!).then(\n () => expect.fail('Should not be able to read the message'),\n (e) => {\n expect(e).to.be.instanceOf(XHR.XHRError)\n expect((e as XHRError).statusCode).to.equal(403)\n }\n )\n })\n\n it('An HCP should be able to publish a message on a topic and a participant could query it through MessageByHcPartyFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n\n const filterChain = (hcpId: string) =>\n new FilterChainMessage({\n filter: new MessageByHcPartyFilter({\n hcpId: hcpId,\n }),\n })\n\n const filterResultForHcp = await messageApiForHcp.filterMessagesBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows).to.have.length.greaterThanOrEqual(1)\n expect(filterResultForHcp.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows).to.have.length.greaterThanOrEqual(1)\n expect(filterResultForHcp2.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n }).timeout(60_000)\n\n it('An HCP should be able to publish a message on a topic and a non-participant should not be able to query it through MessageByHcPartyFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const { messageApi: messageApiForHcp3, userApi: userApiForHcp3 } = await initApi(env!, hcp3Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n const hcpUser3 = await userApiForHcp3.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n\n const filterChain = (hcpId: string) =>\n new FilterChainMessage({\n filter: new MessageByHcPartyFilter({\n hcpId: hcpId,\n }),\n })\n\n const filterResultForHcp = await messageApiForHcp.filterMessagesBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows).to.have.length.greaterThanOrEqual(1)\n expect(filterResultForHcp.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows).to.have.length.greaterThanOrEqual(1)\n expect(filterResultForHcp2.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp3 = await messageApiForHcp3.filterMessagesBy(filterChain(hcpUser3.healthcarePartyId!))\n expect(filterResultForHcp3.rows!.find((m) => m.id === message.id)).to.be.undefined\n })\n\n it('An HCP should be able to publish a message on a topic and a participant could query it through MessageByHcPartyTransportGuidFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n\n const filterChain = (hcpId: string, transportGuid: string) =>\n new FilterChainMessage({\n filter: new MessageByHcPartyTransportGuidFilter({\n healthcarePartyId: hcpId,\n transportGuid: transportGuid,\n }),\n })\n\n const filterResultForHcp = await messageApiForHcp.filterMessagesBy(filterChain(hcpUser.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp.rows).to.have.length(1)\n expect(filterResultForHcp.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp2.rows).to.have.length(1)\n expect(filterResultForHcp2.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n })\n\n it('An HCP should be able to publish a message on a topic and a non-participant should not be able to query it through MessageByHcPartyTransportGuidFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const { userApi: userApiForHcp3, messageApi: messageApiForHcp3 } = await initApi(env!, hcp3Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n const hcpUser3 = await userApiForHcp3.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n\n const filterChain = (hcpId: string, transportGuid: string) =>\n new FilterChainMessage({\n filter: new MessageByHcPartyTransportGuidFilter({\n healthcarePartyId: hcpId,\n transportGuid: transportGuid,\n }),\n })\n\n const filterResultForHcp = await messageApiForHcp.filterMessagesBy(filterChain(hcpUser.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp.rows).to.have.length(1)\n expect(filterResultForHcp.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp2.rows).to.have.length(1)\n expect(filterResultForHcp2.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp3 = await messageApiForHcp3.filterMessagesBy(filterChain(hcpUser3.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp3.rows!.find((m) => m.id === message.id)).to.be.undefined\n })\n\n it('An HCP should be able to publish a message on a topic and a participant should be able to query it through LatestMessageByHcPartyTransportGuidFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n let latestMessage: Message | null = null\n for (let i = 0; i < 5; i++) {\n // Creating 5 messages\n latestMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n }\n\n const filterChain = (hcpId: string, transportGuid: string) =>\n new FilterChainMessage({\n filter: new LatestMessageByHcPartyTransportGuidFilter({\n healthcarePartyId: hcpId,\n transportGuid: transportGuid,\n }),\n })\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!, latestMessage!.transportGuid!))\n expect(filterResultForHcp2.rows).to.have.length(1) // Only one message should be returned\n expect(filterResultForHcp2.rows![0]).to.deep.equal(latestMessage) // It should be the latest message\n })\n\n async function doXOnYAndSubscribe<Y>(\n connectionPromise: Promise<Connection>,\n x: () => Promise<Y>,\n statusListener: (status: string) => void,\n eventReceivedPromiseReject: (reason?: any) => void,\n eventReceivedPromise: Promise<void>\n ) {\n const connection = (await connectionPromise)\n .onClosed(async () => {\n statusListener('CLOSED')\n await sleep(3_000)\n })\n .onConnected(async () => {\n statusListener('CONNECTED')\n await sleep(2_000)\n await x()\n })\n\n const timeout = setTimeout(eventReceivedPromiseReject, 20_000)\n await eventReceivedPromise.then(() => clearTimeout(timeout)).catch(() => {})\n\n connection.close()\n\n await sleep(3_000)\n }\n\n const subscribeAndCreateMessage = async (options: SubscriptionOptions, eventTypes: ('CREATE' | 'DELETE' | 'UPDATE')[]) => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp2Username)\n\n const loggedUser = await userApiForHcp.getCurrentUser()\n const connectionPromise = async (options: {}, eventListener: (healthcareElement: Message) => Promise<void>) =>\n messageApiForHcp.subscribeToMessageEvents(\n eventTypes,\n new MessageByHcPartyFilter({\n hcpId: loggedUser!.healthcarePartyId!,\n }),\n eventListener,\n options\n )\n\n const events: Message[] = []\n const statuses: string[] = []\n\n let eventReceivedPromiseResolve!: (value: void | PromiseLike<void>) => void\n let eventReceivedPromiseReject!: (reason?: any) => void\n const eventReceivedPromise = new Promise<void>((res, rej) => {\n eventReceivedPromiseResolve = res\n eventReceivedPromiseReject = rej\n })\n\n await doXOnYAndSubscribe(\n connectionPromise(options, async (healthcareElement) => {\n events.push(healthcareElement)\n eventReceivedPromiseResolve()\n }),\n async () => {\n const user = await userApiForHcp.getCurrentUser()\n\n const patient = await patientApiForHcp.createPatientWithUser(\n user,\n await patientApiForHcp.newInstance(\n user,\n new Patient({\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n\n const topic = await topicApiForHcp.createTopic(\n await topicApiForHcp.newInstance(\n loggedUser,\n patient,\n new Topic({\n description: 'Topic description',\n activeParticipants: {\n [loggedUser.healthcarePartyId!]: TopicRole.OWNER,\n },\n })\n )\n )\n\n const createdMessage = await messageApiForHcp.encryptAndCreateMessageInTopic(\n await messageApiForHcp.newInstanceWithPatient(\n loggedUser,\n null,\n new Message({\n id: randomUUID(),\n subject: 'Message Subject',\n sent: new Date().getTime(),\n transportGuid: topic.id,\n readStatus: Object.fromEntries(\n Object.keys(topic.activeParticipants ?? {})\n .filter((hcpId) => hcpId != loggedUser.healthcarePartyId)\n .map((hcpId) => [hcpId, { read: false }])\n ),\n fromHealthcarePartyId: loggedUser.healthcarePartyId,\n }),\n {\n additionalDelegates: {},\n }\n )\n )\n },\n (status) => {\n statuses.push(status)\n },\n eventReceivedPromiseReject,\n eventReceivedPromise\n )\n\n events?.forEach((event) => console.log(`Event : ${event}`))\n statuses?.forEach((status) => console.log(`Status : ${status}`))\n\n expect(statuses).to.have.length(2)\n expect(events).to.have.length(1)\n expect(events.every((event) => event instanceof Message)).to.be.true\n }\n\n it('CREATE Message without options', async () => {\n await subscribeAndCreateMessage({}, ['CREATE'])\n }).timeout(60000)\n\n it('CREATE Message with options', async () => {\n await subscribeAndCreateMessage(\n {\n connectionRetryIntervalMs: 10_000,\n connectionMaxRetry: 5,\n },\n ['CREATE']\n )\n }).timeout(60000)\n})?.timeout(60_000)\n"]}
|
|
1
|
+
{"version":3,"file":"icc-message-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-message-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { describeNoLite, getEnvironmentInitializer, hcp1Username, hcp2Username, hcp3Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before, it, describe } from 'mocha'\nimport { IccMessageXApi, IccPatientXApi, sleep, SubscriptionOptions } from '../../icc-x-api'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { IccTopicXApi } from '../../icc-x-api/icc-topic-x-api'\nimport { Topic, TopicRole } from '../../icc-api/model/Topic'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport { XHR } from '../../icc-api/api/XHR'\nimport { Message } from '../../icc-api/model/Message'\nimport initApi = TestUtils.initApi\nimport XHRError = XHR.XHRError\nimport { FilterChainMessage } from '../../icc-api/model/FilterChainMessage'\nimport { MessageByHcPartyFilter } from '../../icc-x-api/filters/MessageByHcPartyFilter'\nimport { MessageByHcPartyTransportGuidFilter } from '../../icc-x-api/filters/MessageByHcPartyTransportGuidFilter'\nimport { LatestMessageByHcPartyTransportGuidFilter } from '../../icc-x-api/filters/LatestMessageByHcPartyTransportGuidFilter'\nimport { Connection } from '../../icc-api/model/Connection'\nimport { expect, use as chaiUse } from 'chai'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { IccMessageApi } from '../../icc-api'\n\nchaiUse(chaiAsPromised)\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribeNoLite('icc-message-x-api Topic-based tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function createMessage(messageApi: IccMessageXApi, hcpUser: User, patient: Patient | null, topic: Topic) {\n return messageApi.encryptAndCreateMessageInTopic(\n await messageApi.newInstanceWithPatient(\n hcpUser,\n patient,\n new Message({\n id: randomUUID(),\n subject: 'Message Subject',\n sent: new Date().getTime(),\n transportGuid: topic.id,\n readStatus: Object.fromEntries(\n Object.keys(topic.activeParticipants ?? {})\n .filter((p) => p != hcpUser.healthcarePartyId)\n .map((hcpId) => [hcpId, { read: false }])\n ),\n fromHealthcarePartyId: hcpUser.healthcarePartyId,\n }),\n {\n additionalDelegates: Object.fromEntries(\n Object.keys(topic.activeParticipants ?? {})\n .filter((hcpId) => hcpId != hcpUser.healthcarePartyId)\n .map((hcpId) => [hcpId, SecureDelegation.AccessLevelEnum.READ])\n ),\n }\n )\n )\n }\n\n async function createTopic(topicApi: IccTopicXApi, hcpUser: User, patient: Patient, ...additionalUser: { user: User; role: TopicRole }[]) {\n return topicApi.createTopic(\n await topicApi.newInstance(\n hcpUser,\n patient,\n new Topic({\n id: randomUUID(),\n description: 'Topic description',\n activeParticipants: {\n ...Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, u.role])),\n [hcpUser.healthcarePartyId!]: TopicRole.OWNER,\n },\n }),\n {\n additionalDelegates: Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, SecureDelegation.AccessLevelEnum.WRITE])),\n }\n )\n )\n }\n\n async function createPatient(patientApiForHcp: IccPatientXApi, hcpUser: User) {\n return patientApiForHcp.createPatientWithUser(\n hcpUser,\n await patientApiForHcp.newInstance(\n hcpUser,\n new Patient({\n id: randomUUID(),\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n }\n\n it('An HCP should be able to publish a message on a topic and a participant can read it', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n const message2 = await messageApiForHcp2.getAndDecryptMessage(createdMessage.id!)\n\n expect(message).to.deep.equal(createdMessage)\n expect(message).to.deep.equal(message2)\n })\n\n it('An HCP should be able to publish an encrypted message on a topic', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username, {\n encryptedFieldsConfig: {\n message: ['subject'],\n },\n })\n\n const baseMessageApi = new IccMessageApi(\n env!.iCureUrl,\n messageApiForHcp._headers,\n messageApiForHcp.authenticationProvider,\n messageApiForHcp.fetchImpl\n )\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n expect(message).to.deep.equal(createdMessage)\n expect(message.subject).to.not.be.undefined\n\n const notDecryptedMessage = await baseMessageApi.getMessage(createdMessage.id!)\n expect(notDecryptedMessage).to.not.deep.equal(createdMessage)\n expect(notDecryptedMessage.subject).to.be.undefined\n })\n\n it('An HCP should be able to publish a message on a topic and a non-participant cannot read it', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const { messageApi: messageApiForHcp3 } = await initApi(env!, hcp3Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n expect(message).to.not.be.null\n\n await messageApiForHcp3.getAndDecryptMessage(createdMessage.id!).then(\n () => expect.fail('Should not be able to read the message'),\n (e) => {\n expect(e).to.be.instanceOf(XHR.XHRError)\n expect((e as XHRError).statusCode).to.equal(403)\n }\n )\n })\n\n it('An HCP should be able to publish a message on a topic and a participant could query it through MessageByHcPartyFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n\n const filterChain = (hcpId: string) =>\n new FilterChainMessage({\n filter: new MessageByHcPartyFilter({\n hcpId: hcpId,\n }),\n })\n\n const filterResultForHcp = await messageApiForHcp.filterMessagesBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows).to.have.length.greaterThanOrEqual(1)\n expect(filterResultForHcp.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows).to.have.length.greaterThanOrEqual(1)\n expect(filterResultForHcp2.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n }).timeout(60_000)\n\n it('An HCP should be able to publish a message on a topic and a non-participant should not be able to query it through MessageByHcPartyFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const { messageApi: messageApiForHcp3, userApi: userApiForHcp3 } = await initApi(env!, hcp3Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n const hcpUser3 = await userApiForHcp3.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n\n const filterChain = (hcpId: string) =>\n new FilterChainMessage({\n filter: new MessageByHcPartyFilter({\n hcpId: hcpId,\n }),\n })\n\n const filterResultForHcp = await messageApiForHcp.filterMessagesBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows).to.have.length.greaterThanOrEqual(1)\n expect(filterResultForHcp.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows).to.have.length.greaterThanOrEqual(1)\n expect(filterResultForHcp2.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp3 = await messageApiForHcp3.filterMessagesBy(filterChain(hcpUser3.healthcarePartyId!))\n expect(filterResultForHcp3.rows!.find((m) => m.id === message.id)).to.be.undefined\n })\n\n it('An HCP should be able to publish a message on a topic and a participant could query it through MessageByHcPartyTransportGuidFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n\n const filterChain = (hcpId: string, transportGuid: string) =>\n new FilterChainMessage({\n filter: new MessageByHcPartyTransportGuidFilter({\n healthcarePartyId: hcpId,\n transportGuid: transportGuid,\n }),\n })\n\n const filterResultForHcp = await messageApiForHcp.filterMessagesBy(filterChain(hcpUser.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp.rows).to.have.length(1)\n expect(filterResultForHcp.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp2.rows).to.have.length(1)\n expect(filterResultForHcp2.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n })\n\n it('An HCP should be able to publish a message on a topic and a non-participant should not be able to query it through MessageByHcPartyTransportGuidFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const { userApi: userApiForHcp3, messageApi: messageApiForHcp3 } = await initApi(env!, hcp3Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n const hcpUser3 = await userApiForHcp3.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const createdMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n\n const message = await messageApiForHcp.getAndDecryptMessage(createdMessage.id!)\n\n const filterChain = (hcpId: string, transportGuid: string) =>\n new FilterChainMessage({\n filter: new MessageByHcPartyTransportGuidFilter({\n healthcarePartyId: hcpId,\n transportGuid: transportGuid,\n }),\n })\n\n const filterResultForHcp = await messageApiForHcp.filterMessagesBy(filterChain(hcpUser.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp.rows).to.have.length(1)\n expect(filterResultForHcp.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp2.rows).to.have.length(1)\n expect(filterResultForHcp2.rows!.find((m) => m.id === message.id)).to.deep.equal(message)\n\n const filterResultForHcp3 = await messageApiForHcp3.filterMessagesBy(filterChain(hcpUser3.healthcarePartyId!, message.transportGuid!))\n expect(filterResultForHcp3.rows!.find((m) => m.id === message.id)).to.be.undefined\n })\n\n it('An HCP should be able to publish a message on a topic and a participant should be able to query it through LatestMessageByHcPartyTransportGuidFilter', async () => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, messageApi: messageApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n let latestMessage: Message | null = null\n for (let i = 0; i < 5; i++) {\n // Creating 5 messages\n latestMessage = await createMessage(messageApiForHcp, hcpUser, null, createdTopic)\n }\n\n const filterChain = (hcpId: string, transportGuid: string) =>\n new FilterChainMessage({\n filter: new LatestMessageByHcPartyTransportGuidFilter({\n healthcarePartyId: hcpId,\n transportGuid: transportGuid,\n }),\n })\n\n const filterResultForHcp2 = await messageApiForHcp2.filterMessagesBy(filterChain(hcpUser2.healthcarePartyId!, latestMessage!.transportGuid!))\n expect(filterResultForHcp2.rows).to.have.length(1) // Only one message should be returned\n expect(filterResultForHcp2.rows![0]).to.deep.equal(latestMessage) // It should be the latest message\n })\n\n async function doXOnYAndSubscribe<Y>(\n connectionPromise: Promise<Connection>,\n x: () => Promise<Y>,\n statusListener: (status: string) => void,\n eventReceivedPromiseReject: (reason?: any) => void,\n eventReceivedPromise: Promise<void>\n ) {\n const connection = (await connectionPromise)\n .onClosed(async () => {\n statusListener('CLOSED')\n await sleep(3_000)\n })\n .onConnected(async () => {\n statusListener('CONNECTED')\n await sleep(2_000)\n await x()\n })\n\n const timeout = setTimeout(eventReceivedPromiseReject, 20_000)\n await eventReceivedPromise.then(() => clearTimeout(timeout)).catch(() => {})\n\n connection.close()\n\n await sleep(3_000)\n }\n\n const subscribeAndCreateMessage = async (options: SubscriptionOptions, eventTypes: ('CREATE' | 'DELETE' | 'UPDATE')[]) => {\n const {\n userApi: userApiForHcp,\n topicApi: topicApiForHcp,\n patientApi: patientApiForHcp,\n messageApi: messageApiForHcp,\n } = await initApi(env!, hcp2Username)\n\n const loggedUser = await userApiForHcp.getCurrentUser()\n const connectionPromise = async (options: {}, eventListener: (healthcareElement: Message) => Promise<void>) =>\n messageApiForHcp.subscribeToMessageEvents(\n eventTypes,\n new MessageByHcPartyFilter({\n hcpId: loggedUser!.healthcarePartyId!,\n }),\n eventListener,\n options\n )\n\n const events: Message[] = []\n const statuses: string[] = []\n\n let eventReceivedPromiseResolve!: (value: void | PromiseLike<void>) => void\n let eventReceivedPromiseReject!: (reason?: any) => void\n const eventReceivedPromise = new Promise<void>((res, rej) => {\n eventReceivedPromiseResolve = res\n eventReceivedPromiseReject = rej\n })\n\n await doXOnYAndSubscribe(\n connectionPromise(options, async (healthcareElement) => {\n events.push(healthcareElement)\n eventReceivedPromiseResolve()\n }),\n async () => {\n const user = await userApiForHcp.getCurrentUser()\n\n const patient = await patientApiForHcp.createPatientWithUser(\n user,\n await patientApiForHcp.newInstance(\n user,\n new Patient({\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n\n const topic = await topicApiForHcp.createTopic(\n await topicApiForHcp.newInstance(\n loggedUser,\n patient,\n new Topic({\n description: 'Topic description',\n activeParticipants: {\n [loggedUser.healthcarePartyId!]: TopicRole.OWNER,\n },\n })\n )\n )\n\n const createdMessage = await messageApiForHcp.encryptAndCreateMessageInTopic(\n await messageApiForHcp.newInstanceWithPatient(\n loggedUser,\n null,\n new Message({\n id: randomUUID(),\n subject: 'Message Subject',\n sent: new Date().getTime(),\n transportGuid: topic.id,\n readStatus: Object.fromEntries(\n Object.keys(topic.activeParticipants ?? {})\n .filter((hcpId) => hcpId != loggedUser.healthcarePartyId)\n .map((hcpId) => [hcpId, { read: false }])\n ),\n fromHealthcarePartyId: loggedUser.healthcarePartyId,\n }),\n {\n additionalDelegates: {},\n }\n )\n )\n },\n (status) => {\n statuses.push(status)\n },\n eventReceivedPromiseReject,\n eventReceivedPromise\n )\n\n events?.forEach((event) => console.log(`Event : ${event}`))\n statuses?.forEach((status) => console.log(`Status : ${status}`))\n\n expect(statuses).to.have.length(2)\n expect(events).to.have.length(1)\n expect(events.every((event) => event instanceof Message)).to.be.true\n }\n\n it('CREATE Message without options', async () => {\n await subscribeAndCreateMessage({}, ['CREATE'])\n }).timeout(60000)\n\n it('CREATE Message with options', async () => {\n await subscribeAndCreateMessage(\n {\n connectionRetryIntervalMs: 10_000,\n connectionMaxRetry: 5,\n },\n ['CREATE']\n )\n }).timeout(60000)\n})?.timeout(60_000)\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icc-patient-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-patient-x-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { before } from 'mocha'\n\nimport 'isomorphic-fetch'\n\nimport { Patient } from '../../icc-api/model/Patient'\nimport { assert, expect } from 'chai'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { getEnvironmentInitializer, hcp1Username, hcp2Username, hcp3Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport initApi = TestUtils.initApi\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { EntityWithDelegationTypeName, ua2b64 } from '../../icc-x-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribe('icc-x-patient-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('CreatePatientWithUser Success for HCP', async () => {\n // Given\n const {\n userApi: userApiForHcp,\n dataOwnerApi: dataOwnerApiForHcp,\n patientApi: patientApiForHcp,\n cryptoApi: cryptoApiForHcp,\n } = await initApi(env, hcp1Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const patientToCreate = await patientApiForHcp.newInstance(\n hcpUser,\n new Patient({\n id: randomUUID(),\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n\n // When\n const createdPatient = await patientApiForHcp.createPatientWithUser(hcpUser, patientToCreate)\n\n // Then\n const readPatient = await patientApiForHcp.getPatientWithUser(hcpUser, createdPatient.id!)\n assert(readPatient != null)\n assert(readPatient.id != null)\n assert(readPatient.note == patientToCreate.note)\n assert(readPatient.firstName == patientToCreate.firstName)\n assert(readPatient.lastName == patientToCreate.lastName)\n expect(\n await cryptoApiForHcp.xapi.encryptionKeysOf({ entity: readPatient, type: EntityWithDelegationTypeName.Patient }, undefined)\n ).to.have.length(1)\n expect(await patientApiForHcp.decryptSecretIdsOf(readPatient)).to.have.length(1)\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 encryptedField = 'Something encrypted'\n const entity = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(user1, { firstName: 'Gigio', lastName: 'Bagigio', note: encryptedField })\n )\n expect(entity.note).to.be.equal(encryptedField)\n const secretIds = await api1.patientApi.decryptSecretIdsOf(entity)\n await api2.patientApi\n .getPatientWithUser(user2, 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.patientApi.shareWith(user2.healthcarePartyId!, entity, secretIds)\n const retrieved = await api2.patientApi.getPatientWithUser(user2, entity.id)\n expect(retrieved.note).to.be.equal(encryptedField)\n expect(await api2.patientApi.decryptSecretIdsOf(retrieved)).to.have.members(secretIds)\n })\n\n it('Merge patients 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 api3 = await initApi(env!, hcp3Username)\n const user3 = await api3.userApi.getCurrentUser()\n const mergedFirstName = 'Gigio'\n const mergedLastName = 'Bagigio'\n const mergedAlias = 'Luigio'\n const mergedNote = 'A secret note'\n const patientFrom = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(\n user1,\n {\n firstName: mergedFirstName,\n lastName: 'From',\n note: 'A',\n },\n { additionalDelegates: { [user2.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const patientFromSecretIds = await api1.patientApi.decryptSecretIdsOf(patientFrom)\n expect(patientFromSecretIds).to.have.lengthOf(1)\n const patientInto = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(\n user1,\n {\n firstName: 'Into',\n lastName: mergedLastName,\n note: 'B',\n },\n { additionalDelegates: { [user3.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const patientIntoSecretIds = await api1.patientApi.decryptSecretIdsOf(patientInto)\n expect(patientFromSecretIds).to.have.lengthOf(1)\n expect(patientIntoSecretIds[0]).to.not.equal(patientFromSecretIds[0])\n const mergedInto = {\n ...patientInto,\n firstName: mergedFirstName,\n lastName: mergedLastName,\n alias: mergedAlias,\n note: mergedNote,\n }\n const mergedPatient = await api1.patientApi.mergePatients(patientFrom, mergedInto)\n expect(mergedPatient.firstName).to.equal(mergedFirstName)\n expect(mergedPatient.lastName).to.equal(mergedLastName)\n expect(mergedPatient.alias).to.equal(mergedAlias)\n expect(mergedPatient.note).to.equal(mergedNote)\n expect(await api1.patientApi.decryptSecretIdsOf(mergedPatient)).to.have.members([...patientFromSecretIds, ...patientIntoSecretIds])\n const retrievedByDelegateWithAccessToInto = await api3.patientApi.getPatientWithUser(user3, patientInto.id!)\n expect(retrievedByDelegateWithAccessToInto.firstName).to.equal(mergedFirstName)\n expect(retrievedByDelegateWithAccessToInto.lastName).to.equal(mergedLastName)\n expect(retrievedByDelegateWithAccessToInto.alias).to.equal(mergedAlias)\n expect(retrievedByDelegateWithAccessToInto.note).to.equal(mergedNote)\n expect(await api3.patientApi.decryptSecretIdsOf(retrievedByDelegateWithAccessToInto)).to.have.members(patientIntoSecretIds)\n const retrievedByDelegateWithAccessToFrom = await api2.patientApi.getPatientWithUser(user2, patientInto.id!)\n expect(retrievedByDelegateWithAccessToFrom.firstName).to.equal(mergedFirstName)\n expect(retrievedByDelegateWithAccessToFrom.lastName).to.equal(mergedLastName)\n expect(retrievedByDelegateWithAccessToFrom.alias).to.equal(mergedAlias)\n expect(retrievedByDelegateWithAccessToFrom.note).to.be.undefined // No access to new encryption key yet\n expect(await api2.patientApi.decryptSecretIdsOf(retrievedByDelegateWithAccessToFrom)).to.have.members(patientFromSecretIds)\n })\n\n it('Patient picture should be automatically decoded from base64 on initialisation.', async () => {\n const pictureAB = randomBytes(100)\n const pictureBase64 = ua2b64(pictureAB)\n const patient = new Patient({ picture: pictureBase64 })\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n\n it('Creating a new Patient instance using a patient with decoded picture should not lose the picture data', async () => {\n const pictureAB = randomBytes(100)\n const patient = new Patient({ picture: new Uint8Array(pictureAB) })\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n\n it('A Patient with picture data should be created and retrieved correctly', async () => {\n const pictureAB = randomBytes(100)\n const api = await initApi(env!, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n const patient = await api.patientApi.createPatientWithUser(\n user,\n await api.patientApi.newInstance(user, { firstName: 'Giovanni', lastName: 'Giorgio', picture: new Uint8Array(pictureAB) })\n )\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n\n it('A patient created with v8 + should have no auto-fixed delegations', async () => {\n const api = await initApi(env!, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n const patient: Patient = await api.patientApi.createPatientWithUser(\n user,\n await api.patientApi.newInstance(user, { firstName: 'Giovanni', lastName: 'Giorgio', preferredUserId: user.id })\n )\n expect(Object.keys(patient.delegations ?? {}).length == 0).to.be.true\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"icc-patient-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-patient-x-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { before } from 'mocha'\n\nimport 'isomorphic-fetch'\n\nimport { Patient } from '../../icc-api/model/Patient'\nimport { assert, expect } from 'chai'\nimport { randomBytes, randomUUID } from 'crypto'\nimport { getEnvironmentInitializer, hcp1Username, hcp2Username, hcp3Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport initApi = TestUtils.initApi\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { EntityWithDelegationTypeName, ua2b64 } from '../../icc-x-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribe('icc-x-patient-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('CreatePatientWithUser Success for HCP', async () => {\n // Given\n const {\n userApi: userApiForHcp,\n dataOwnerApi: dataOwnerApiForHcp,\n patientApi: patientApiForHcp,\n cryptoApi: cryptoApiForHcp,\n } = await initApi(env, hcp1Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const patientToCreate = await patientApiForHcp.newInstance(\n hcpUser,\n new Patient({\n id: randomUUID(),\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n\n // When\n const createdPatient = await patientApiForHcp.createPatientWithUser(hcpUser, patientToCreate)\n\n // Then\n const readPatient = await patientApiForHcp.getPatientWithUser(hcpUser, createdPatient.id!)\n assert(readPatient != null)\n assert(readPatient.id != null)\n assert(readPatient.note == patientToCreate.note)\n assert(readPatient.firstName == patientToCreate.firstName)\n assert(readPatient.lastName == patientToCreate.lastName)\n expect(\n await cryptoApiForHcp.xapi.encryptionKeysOf({ entity: readPatient, type: EntityWithDelegationTypeName.Patient }, undefined)\n ).to.have.length(1)\n expect(await patientApiForHcp.decryptSecretIdsOf(readPatient)).to.have.length(1)\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 encryptedField = 'Something encrypted'\n const entity = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(user1, { firstName: 'Gigio', lastName: 'Bagigio', note: encryptedField })\n )\n expect(entity.note).to.be.equal(encryptedField)\n const secretIds = await api1.patientApi.decryptSecretIdsOf(entity)\n await api2.patientApi\n .getPatientWithUser(user2, 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.patientApi.shareWith(user2.healthcarePartyId!, entity, secretIds)\n const retrieved = await api2.patientApi.getPatientWithUser(user2, entity.id)\n expect(retrieved.note).to.be.equal(encryptedField)\n expect(await api2.patientApi.decryptSecretIdsOf(retrieved)).to.have.members(secretIds)\n })\n\n it('Merge patients 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 api3 = await initApi(env!, hcp3Username)\n const user3 = await api3.userApi.getCurrentUser()\n const mergedFirstName = 'Gigio'\n const mergedLastName = 'Bagigio'\n const mergedAlias = 'Luigio'\n const mergedNote = 'A secret note'\n const patientFrom = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(\n user1,\n {\n firstName: mergedFirstName,\n lastName: 'From',\n note: 'A',\n },\n { additionalDelegates: { [user2.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const patientFromSecretIds = await api1.patientApi.decryptSecretIdsOf(patientFrom)\n expect(patientFromSecretIds).to.have.lengthOf(1)\n const patientInto = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(\n user1,\n {\n firstName: 'Into',\n lastName: mergedLastName,\n note: 'B',\n },\n { additionalDelegates: { [user3.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const patientIntoSecretIds = await api1.patientApi.decryptSecretIdsOf(patientInto)\n expect(patientFromSecretIds).to.have.lengthOf(1)\n expect(patientIntoSecretIds[0]).to.not.equal(patientFromSecretIds[0])\n const mergedInto = {\n ...patientInto,\n firstName: mergedFirstName,\n lastName: mergedLastName,\n alias: mergedAlias,\n note: mergedNote,\n }\n const mergedPatient = await api1.patientApi.mergePatients(patientFrom, mergedInto)\n expect(mergedPatient.firstName).to.equal(mergedFirstName)\n expect(mergedPatient.lastName).to.equal(mergedLastName)\n expect(mergedPatient.alias).to.equal(mergedAlias)\n expect(mergedPatient.note).to.equal(mergedNote)\n expect(await api1.patientApi.decryptSecretIdsOf(mergedPatient)).to.have.members([...patientFromSecretIds, ...patientIntoSecretIds])\n const retrievedByDelegateWithAccessToInto = await api3.patientApi.getPatientWithUser(user3, patientInto.id!)\n expect(retrievedByDelegateWithAccessToInto.firstName).to.equal(mergedFirstName)\n expect(retrievedByDelegateWithAccessToInto.lastName).to.equal(mergedLastName)\n expect(retrievedByDelegateWithAccessToInto.alias).to.equal(mergedAlias)\n expect(retrievedByDelegateWithAccessToInto.note).to.equal(mergedNote)\n expect(await api3.patientApi.decryptSecretIdsOf(retrievedByDelegateWithAccessToInto)).to.have.members(patientIntoSecretIds)\n const retrievedByDelegateWithAccessToFrom = await api2.patientApi.getPatientWithUser(user2, patientInto.id!)\n expect(retrievedByDelegateWithAccessToFrom.firstName).to.equal(mergedFirstName)\n expect(retrievedByDelegateWithAccessToFrom.lastName).to.equal(mergedLastName)\n expect(retrievedByDelegateWithAccessToFrom.alias).to.equal(mergedAlias)\n expect(retrievedByDelegateWithAccessToFrom.note).to.be.undefined // No access to new encryption key yet\n expect(await api2.patientApi.decryptSecretIdsOf(retrievedByDelegateWithAccessToFrom)).to.have.members(patientFromSecretIds)\n })\n\n it('Patient picture should be automatically decoded from base64 on initialisation.', async () => {\n const pictureAB = randomBytes(100)\n const pictureBase64 = ua2b64(pictureAB)\n const patient = new Patient({ picture: pictureBase64 })\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n\n it('Creating a new Patient instance using a patient with decoded picture should not lose the picture data', async () => {\n const pictureAB = randomBytes(100)\n const patient = new Patient({ picture: new Uint8Array(pictureAB) })\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n\n it('A Patient with picture data should be created and retrieved correctly', async () => {\n const pictureAB = randomBytes(100)\n const api = await initApi(env!, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n const patient = await api.patientApi.createPatientWithUser(\n user,\n await api.patientApi.newInstance(user, { firstName: 'Giovanni', lastName: 'Giorgio', picture: new Uint8Array(pictureAB) })\n )\n expect(patient.picture).to.not.be.undefined\n expect(patient.picture instanceof ArrayBuffer || ArrayBuffer.isView(patient.picture)).to.be.true\n const decodedPicture = new Uint8Array(patient.picture!)\n expect(decodedPicture).to.have.length(pictureAB.length)\n for (let i = 0; i < pictureAB.length; i++) {\n expect(decodedPicture[i]).to.equal(pictureAB[i])\n }\n })\n\n it('A patient created with v8 + should have no auto-fixed delegations', async () => {\n const api = await initApi(env!, hcp1Username)\n const user = await api.userApi.getCurrentUser()\n const patient: Patient = await api.patientApi.createPatientWithUser(\n user,\n await api.patientApi.newInstance(user, { firstName: 'Giovanni', lastName: 'Giorgio', preferredUserId: user.id })\n )\n expect(Object.keys(patient.delegations ?? {}).length == 0).to.be.true\n })\n})\n"]}
|
|
@@ -1 +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'\nimport { FilterChainHealthElement } from '../../icc-api/model/FilterChainHealthElement'\nimport { HealthElementByHcPartyFilter } from '../../icc-x-api/filters/HealthElementByHcPartyFilter'\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(\n (\n await patientApi.healthcareElementApi.filterByWithUser(\n patientUser,\n undefined,\n 10000,\n new FilterChainHealthElement({\n filter: new HealthElementByHcPartyFilter({ hcpId: patientUser.patientId }),\n })\n )\n ).rows![0]\n ).to.be.deep.equal(sharedHealthData)\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"]}
|
|
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'\nimport { FilterChainHealthElement } from '../../icc-api/model/FilterChainHealthElement'\nimport { HealthElementByHcPartyFilter } from '../../icc-x-api/filters/HealthElementByHcPartyFilter'\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(\n (\n await patientApi.healthcareElementApi.filterByWithUser(\n patientUser,\n undefined,\n 10000,\n new FilterChainHealthElement({\n filter: new HealthElementByHcPartyFilter({ hcpId: patientUser.patientId }),\n })\n )\n ).rows![0]\n ).to.be.deep.equal(sharedHealthData)\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icc-topic-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-topic-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { describeNoLite, getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before, it, describe } from 'mocha'\nimport { IccPatientXApi, sleep, SubscriptionOptions } from '../../icc-x-api'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { expect } from 'chai'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { IccTopicXApi } from '../../icc-x-api/icc-topic-x-api'\nimport { Topic, TopicRole } from '../../icc-api/model/Topic'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport initApi = TestUtils.initApi\nimport { XHR } from '../../icc-api/api/XHR'\nimport XHRError = XHR.XHRError\nimport { FilterChainTopic } from '../../icc-api/model/FilterChainTopic'\nimport { TopicByHcPartyFilter } from '../../icc-x-api/filters/TopicByHcPartyFilter'\nimport { TopicByParticipantFilter } from '../../icc-x-api/filters/TopicByParticipantFilter'\nimport { Connection } from '../../icc-api/model/Connection'\nimport { Message } from '../../icc-api/model/Message'\nimport { IccTopicApi } from '../../icc-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribeNoLite('icc-topic-x-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function createTopic(topicApi: IccTopicXApi, hcpUser: User, patient: Patient, ...additionalUser: { user: User; role: TopicRole }[]) {\n return topicApi.createTopic(\n await topicApi.newInstance(\n hcpUser,\n patient,\n new Topic({\n id: randomUUID(),\n description: 'Topic description',\n activeParticipants: {\n ...Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, u.role])),\n [hcpUser.healthcarePartyId!]: TopicRole.OWNER,\n },\n }),\n {\n additionalDelegates: Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, SecureDelegation.AccessLevelEnum.WRITE])),\n }\n )\n )\n }\n\n async function createPatient(patientApiForHcp: IccPatientXApi, hcpUser: User) {\n return patientApiForHcp.createPatientWithUser(\n hcpUser,\n await patientApiForHcp.newInstance(\n hcpUser,\n new Patient({\n id: randomUUID(),\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n }\n\n it('An HCP should be able to create a topic with participants', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n }).timeout(10_000)\n\n it('An HCP should be able to create an encrypted topic', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const baseTopicApi = new IccTopicApi(env!.iCureUrl, topicApiForHcp._headers, topicApiForHcp.authenticationProvider, topicApiForHcp.fetchImpl)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n expect(retrievedByHcp.description).to.not.be.undefined\n\n const notDecryptedTopic = await baseTopicApi.getTopic(createdTopic.id!)\n expect(notDecryptedTopic).to.not.deep.equal(createdTopic)\n expect(notDecryptedTopic.description).to.be.undefined\n expect(notDecryptedTopic.encryptedSelf).to.not.be.undefined\n }).timeout(10_000)\n\n it('An HCP should be able to create a topic with no participants and add participants later', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n try {\n await topicApiForHcp2.getTopic(createdTopic.id!)\n expect.fail('Should not be able to get topic')\n } catch (e) {\n expect((e as XHRError).statusCode).to.equal(403)\n }\n\n await topicApiForHcp.addParticipantWithTopic({ dataOwnerId: hcpUser2.healthcarePartyId!, topicRole: TopicRole.PARTICIPANT }, createdTopic)\n\n const retrievedByHcpAfterAddParticipant = await topicApiForHcp.getTopic(createdTopic.id!)\n const retrievedByHcp2AfterAddParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n\n expect(retrievedByHcp2AfterAddParticipant).to.deep.equal(retrievedByHcpAfterAddParticipant)\n expect(retrievedByHcpAfterAddParticipant.id).to.equal(createdTopic.id)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId!, hcpUser2.healthcarePartyId!)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants![hcpUser2.healthcarePartyId!]).to.equal(TopicRole.PARTICIPANT)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants![hcpUser.healthcarePartyId!]).to.equal(TopicRole.OWNER)\n }).timeout(10_000)\n\n it('A participant should not be able to remove another participant', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n try {\n await topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser.healthcarePartyId! }, createdTopic.id!)\n expect.fail('Should not be able to remove participant')\n } catch (e) {\n expect((e as XHRError).statusCode).to.equal(403)\n }\n }).timeout(10_000)\n\n it('A participant should be able to remove himself but still able to get topic', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n await topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId! }, createdTopic.id!)\n\n const retrievedByHcpAfterRemoveParticipant = await topicApiForHcp.getTopic(createdTopic.id!)\n const retrievedByHcp2AfterRemoveParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n\n expect(retrievedByHcpAfterRemoveParticipant).to.deep.equal(retrievedByHcp2AfterRemoveParticipant)\n }).timeout(10_000)\n\n it('An owner should be able to remove a participant', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const topicWithRemovedParticipant = await topicApiForHcp.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId! }, createdTopic.id!)\n expect(topicWithRemovedParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId!)\n\n const retrievedByHcp2AfterRemoveParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2AfterRemoveParticipant).to.deep.equal(topicWithRemovedParticipant)\n }).timeout(10_000)\n\n it('A participant should be able to filter topics using TopicByHcPartyFilter', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const filterChain = (hcpId: string) =>\n new FilterChainTopic({\n filter: new TopicByHcPartyFilter({\n hcpId,\n }),\n })\n\n const filterResultForHcp = await topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows!.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic)\n\n const filterResultForHcp2 = await topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows!.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic)\n }).timeout(60_000)\n\n it('A participant should be able to filter topics using TopicByParticipantFilter', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const filterChain = (hcpId: string) =>\n new FilterChainTopic({\n filter: new TopicByParticipantFilter({\n participantId: hcpId,\n }),\n })\n\n const filterResultForHcp = await topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows?.map((t) => t.id)).to.includes(createdTopic.id)\n\n const filterResultForHcp2 = await topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows?.map((t) => t.id)).to.includes(createdTopic.id)\n }).timeout(10_000)\n\n async function doXOnYAndSubscribe<Y>(\n connectionPromise: Promise<Connection>,\n x: () => Promise<Y>,\n statusListener: (status: string) => void,\n eventReceivedPromiseReject: (reason?: any) => void,\n eventReceivedPromise: Promise<void>\n ) {\n const connection = (await connectionPromise)\n .onClosed(async () => {\n statusListener('CLOSED')\n await sleep(3_000)\n })\n .onConnected(async () => {\n statusListener('CONNECTED')\n await sleep(2_000)\n await x()\n })\n\n const timeout = setTimeout(eventReceivedPromiseReject, 20_000)\n await eventReceivedPromise.then(() => clearTimeout(timeout)).catch(() => {})\n\n connection.close()\n\n await sleep(3_000)\n }\n\n const subscribeAndCreateTopic = async (options: SubscriptionOptions, eventTypes: ('CREATE' | 'DELETE' | 'UPDATE')[]) => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const loggedUser = await userApiForHcp.getCurrentUser()\n const connectionPromise = async (options: SubscriptionOptions, eventListener: (healthcareElement: Message) => Promise<void>) =>\n topicApiForHcp.subscribeToTopicEvents(\n eventTypes,\n new TopicByHcPartyFilter({\n hcpId: loggedUser!.healthcarePartyId!,\n }),\n eventListener,\n options\n )\n\n const events: Message[] = []\n const statuses: string[] = []\n\n let eventReceivedPromiseResolve!: (value: void | PromiseLike<void>) => void\n let eventReceivedPromiseReject!: (reason?: any) => void\n const eventReceivedPromise = new Promise<void>((res, rej) => {\n eventReceivedPromiseResolve = res\n eventReceivedPromiseReject = rej\n })\n\n await doXOnYAndSubscribe(\n connectionPromise(options, async (healthcareElement) => {\n events.push(healthcareElement)\n eventReceivedPromiseResolve()\n }),\n async () => {\n const user = await userApiForHcp.getCurrentUser()\n\n const patient = await patientApiForHcp.createPatientWithUser(\n user,\n await patientApiForHcp.newInstance(\n user,\n new Patient({\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n\n const topic = await topicApiForHcp.createTopic(\n await topicApiForHcp.newInstance(\n loggedUser,\n patient,\n new Topic({\n description: 'Topic description',\n })\n )\n )\n },\n (status) => {\n statuses.push(status)\n },\n eventReceivedPromiseReject,\n eventReceivedPromise\n )\n\n events?.forEach((event) => console.log(`Event : ${event}`))\n statuses?.forEach((status) => console.log(`Status : ${status}`))\n\n expect(statuses).to.have.length(2)\n expect(events).to.have.length(1)\n expect(events.every((event) => event instanceof Topic)).to.be.true\n }\n\n it('CREATE Topic without options', async () => {\n await subscribeAndCreateTopic({}, ['CREATE'])\n }).timeout(60000)\n\n it('CREATE Topic with options', async () => {\n await subscribeAndCreateTopic(\n {\n connectionRetryIntervalMs: 10_000,\n connectionMaxRetry: 5,\n },\n ['CREATE']\n )\n }).timeout(60000)\n})\n"]}
|
|
1
|
+
{"version":3,"file":"icc-topic-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-topic-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { describeNoLite, getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before, it, describe } from 'mocha'\nimport { IccPatientXApi, sleep, SubscriptionOptions } from '../../icc-x-api'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { expect } from 'chai'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { IccTopicXApi } from '../../icc-x-api/icc-topic-x-api'\nimport { Topic, TopicRole } from '../../icc-api/model/Topic'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport initApi = TestUtils.initApi\nimport { XHR } from '../../icc-api/api/XHR'\nimport XHRError = XHR.XHRError\nimport { FilterChainTopic } from '../../icc-api/model/FilterChainTopic'\nimport { TopicByHcPartyFilter } from '../../icc-x-api/filters/TopicByHcPartyFilter'\nimport { TopicByParticipantFilter } from '../../icc-x-api/filters/TopicByParticipantFilter'\nimport { Connection } from '../../icc-api/model/Connection'\nimport { Message } from '../../icc-api/model/Message'\nimport { IccTopicApi } from '../../icc-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribeNoLite('icc-topic-x-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function createTopic(topicApi: IccTopicXApi, hcpUser: User, patient: Patient, ...additionalUser: { user: User; role: TopicRole }[]) {\n return topicApi.createTopic(\n await topicApi.newInstance(\n hcpUser,\n patient,\n new Topic({\n id: randomUUID(),\n description: 'Topic description',\n activeParticipants: {\n ...Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, u.role])),\n [hcpUser.healthcarePartyId!]: TopicRole.OWNER,\n },\n }),\n {\n additionalDelegates: Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, SecureDelegation.AccessLevelEnum.WRITE])),\n }\n )\n )\n }\n\n async function createPatient(patientApiForHcp: IccPatientXApi, hcpUser: User) {\n return patientApiForHcp.createPatientWithUser(\n hcpUser,\n await patientApiForHcp.newInstance(\n hcpUser,\n new Patient({\n id: randomUUID(),\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n }\n\n it('An HCP should be able to create a topic with participants', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n }).timeout(10_000)\n\n it('An HCP should be able to create an encrypted topic', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const baseTopicApi = new IccTopicApi(env!.iCureUrl, topicApiForHcp._headers, topicApiForHcp.authenticationProvider, topicApiForHcp.fetchImpl)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n expect(retrievedByHcp.description).to.not.be.undefined\n\n const notDecryptedTopic = await baseTopicApi.getTopic(createdTopic.id!)\n expect(notDecryptedTopic).to.not.deep.equal(createdTopic)\n expect(notDecryptedTopic.description).to.be.undefined\n expect(notDecryptedTopic.encryptedSelf).to.not.be.undefined\n }).timeout(10_000)\n\n it('An HCP should be able to create a topic with no participants and add participants later', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n try {\n await topicApiForHcp2.getTopic(createdTopic.id!)\n expect.fail('Should not be able to get topic')\n } catch (e) {\n expect((e as XHRError).statusCode).to.equal(403)\n }\n\n await topicApiForHcp.addParticipantWithTopic({ dataOwnerId: hcpUser2.healthcarePartyId!, topicRole: TopicRole.PARTICIPANT }, createdTopic)\n\n const retrievedByHcpAfterAddParticipant = await topicApiForHcp.getTopic(createdTopic.id!)\n const retrievedByHcp2AfterAddParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n\n expect(retrievedByHcp2AfterAddParticipant).to.deep.equal(retrievedByHcpAfterAddParticipant)\n expect(retrievedByHcpAfterAddParticipant.id).to.equal(createdTopic.id)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId!, hcpUser2.healthcarePartyId!)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants![hcpUser2.healthcarePartyId!]).to.equal(TopicRole.PARTICIPANT)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants![hcpUser.healthcarePartyId!]).to.equal(TopicRole.OWNER)\n }).timeout(10_000)\n\n it('A participant should not be able to remove another participant', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n try {\n await topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser.healthcarePartyId! }, createdTopic.id!)\n expect.fail('Should not be able to remove participant')\n } catch (e) {\n expect((e as XHRError).statusCode).to.equal(403)\n }\n }).timeout(10_000)\n\n it('A participant should be able to remove himself but still able to get topic', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n await topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId! }, createdTopic.id!)\n\n const retrievedByHcpAfterRemoveParticipant = await topicApiForHcp.getTopic(createdTopic.id!)\n const retrievedByHcp2AfterRemoveParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n\n expect(retrievedByHcpAfterRemoveParticipant).to.deep.equal(retrievedByHcp2AfterRemoveParticipant)\n }).timeout(10_000)\n\n it('An owner should be able to remove a participant', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const topicWithRemovedParticipant = await topicApiForHcp.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId! }, createdTopic.id!)\n expect(topicWithRemovedParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId!)\n\n const retrievedByHcp2AfterRemoveParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2AfterRemoveParticipant).to.deep.equal(topicWithRemovedParticipant)\n }).timeout(10_000)\n\n it('A participant should be able to filter topics using TopicByHcPartyFilter', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const filterChain = (hcpId: string) =>\n new FilterChainTopic({\n filter: new TopicByHcPartyFilter({\n hcpId,\n }),\n })\n\n const filterResultForHcp = await topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows!.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic)\n\n const filterResultForHcp2 = await topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows!.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic)\n }).timeout(60_000)\n\n it('A participant should be able to filter topics using TopicByParticipantFilter', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const filterChain = (hcpId: string) =>\n new FilterChainTopic({\n filter: new TopicByParticipantFilter({\n participantId: hcpId,\n }),\n })\n\n const filterResultForHcp = await topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows?.map((t) => t.id)).to.includes(createdTopic.id)\n\n const filterResultForHcp2 = await topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows?.map((t) => t.id)).to.includes(createdTopic.id)\n }).timeout(10_000)\n\n async function doXOnYAndSubscribe<Y>(\n connectionPromise: Promise<Connection>,\n x: () => Promise<Y>,\n statusListener: (status: string) => void,\n eventReceivedPromiseReject: (reason?: any) => void,\n eventReceivedPromise: Promise<void>\n ) {\n const connection = (await connectionPromise)\n .onClosed(async () => {\n statusListener('CLOSED')\n await sleep(3_000)\n })\n .onConnected(async () => {\n statusListener('CONNECTED')\n await sleep(2_000)\n await x()\n })\n\n const timeout = setTimeout(eventReceivedPromiseReject, 20_000)\n await eventReceivedPromise.then(() => clearTimeout(timeout)).catch(() => {})\n\n connection.close()\n\n await sleep(3_000)\n }\n\n const subscribeAndCreateTopic = async (options: SubscriptionOptions, eventTypes: ('CREATE' | 'DELETE' | 'UPDATE')[]) => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const loggedUser = await userApiForHcp.getCurrentUser()\n const connectionPromise = async (options: SubscriptionOptions, eventListener: (healthcareElement: Message) => Promise<void>) =>\n topicApiForHcp.subscribeToTopicEvents(\n eventTypes,\n new TopicByHcPartyFilter({\n hcpId: loggedUser!.healthcarePartyId!,\n }),\n eventListener,\n options\n )\n\n const events: Message[] = []\n const statuses: string[] = []\n\n let eventReceivedPromiseResolve!: (value: void | PromiseLike<void>) => void\n let eventReceivedPromiseReject!: (reason?: any) => void\n const eventReceivedPromise = new Promise<void>((res, rej) => {\n eventReceivedPromiseResolve = res\n eventReceivedPromiseReject = rej\n })\n\n await doXOnYAndSubscribe(\n connectionPromise(options, async (healthcareElement) => {\n events.push(healthcareElement)\n eventReceivedPromiseResolve()\n }),\n async () => {\n const user = await userApiForHcp.getCurrentUser()\n\n const patient = await patientApiForHcp.createPatientWithUser(\n user,\n await patientApiForHcp.newInstance(\n user,\n new Patient({\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n\n const topic = await topicApiForHcp.createTopic(\n await topicApiForHcp.newInstance(\n loggedUser,\n patient,\n new Topic({\n description: 'Topic description',\n })\n )\n )\n },\n (status) => {\n statuses.push(status)\n },\n eventReceivedPromiseReject,\n eventReceivedPromise\n )\n\n events?.forEach((event) => console.log(`Event : ${event}`))\n statuses?.forEach((status) => console.log(`Status : ${status}`))\n\n expect(statuses).to.have.length(2)\n expect(events).to.have.length(1)\n expect(events.every((event) => event instanceof Topic)).to.be.true\n }\n\n it('CREATE Topic without options', async () => {\n await subscribeAndCreateTopic({}, ['CREATE'])\n }).timeout(60000)\n\n it('CREATE Topic with options', async () => {\n await subscribeAndCreateTopic(\n {\n connectionRetryIntervalMs: 10_000,\n connectionMaxRetry: 5,\n },\n ['CREATE']\n )\n }).timeout(60000)\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icc-user-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-user-x-api-test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"icc-user-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-user-x-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, hcp1Username, itNoLite, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before } from 'mocha'\nimport { crypto } from '../../node-compat'\nimport { TestApi } from '../utils/TestApi'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { AuthenticationProvider, CryptoPrimitives, WebCryptoPrimitives, IccUserXApi, NoAuthenticationProvider } from '../../icc-x-api'\nimport { webcrypto } from 'crypto'\nimport { assert, expect } from 'chai'\nimport { User } from '../../icc-api/model/User'\nimport { v4 as uuid } from 'uuid'\nimport initMasterApi = TestUtils.initMasterApi\nimport { AuthSecretDetails, AuthSecretType, SmartAuthProvider } from '../../icc-x-api/auth/SmartAuthProvider'\nimport { randomUUID } from 'crypto'\nimport { IccAuthApi, IccUserApi } from '../../icc-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet authApi: IccAuthApi\n\ndescribe('icc-x-user-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n authApi = new IccAuthApi(env.iCureUrl, {}, new NoAuthenticationProvider(), fetch)\n })\n\n function userApiWithProvider(authProvider: AuthenticationProvider): IccUserApi {\n return new IccUserXApi(env.iCureUrl, {}, authProvider, new IccAuthApi(env.iCureUrl, {}, new NoAuthenticationProvider(), fetch))\n }\n\n it('Can instantiate an API and get the current user', async () => {\n // Given\n const api = await TestApi(env.iCureUrl, env.dataOwnerDetails[hcp1Username].user, env.dataOwnerDetails[hcp1Username].password, crypto)\n await api.userApi.getCurrentUser()\n })\n\n it('Can get an user by its phoneNumber', async () => {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const phoneNumber = `+${primitives.randomUuid()}`\n\n const api = await initMasterApi(env)\n\n const createdUser = await api.userApi.createUser(\n new User({\n id: uuid(),\n name: `user-${primitives.randomUuid()}`,\n login: `user-${primitives.randomUuid()}`,\n email: `user-${primitives.randomUuid()}@icure.com`,\n mobilePhone: phoneNumber,\n })\n )\n\n const user = await api.userApi.getUserByPhoneNumber(phoneNumber)\n\n expect(user).to.be.deep.equal(createdUser)\n })\n\n itNoLite(\n 'Should automatically ask for a more powerful secret to perform elevated-security operations if the available secret/token is not good enough. When a new token is created during this process, the modifyUser does not fail with a 409',\n async () => {\n const { credentials, api } = await createNewHcpApi(env)\n const initialUser = await api.userApi.getCurrentUser()\n const masterApi = await initMasterApi(env)\n const userToken = randomUUID()\n const userWithLongToken = await masterApi.userApi.modifyUser({\n ...initialUser,\n authenticationTokens: {\n 'test-long-lived-token': {\n token: userToken,\n creationTime: Date.now(),\n validity: 60 * 60 * 24 * 7,\n },\n },\n })\n let longLivedTokenRequested = false\n let shortLivedTokenRequested = false\n const authProvider = SmartAuthProvider.initialise(authApi, credentials.user, {\n getSecret: async (acceptedSecrets: AuthSecretType[], previousAttempts: AuthSecretDetails[]) => {\n if (acceptedSecrets.includes(AuthSecretType.LONG_LIVED_TOKEN)) {\n longLivedTokenRequested = true\n return { value: userToken, secretType: AuthSecretType.LONG_LIVED_TOKEN }\n } else if (acceptedSecrets.includes(AuthSecretType.SHORT_LIVED_TOKEN)) {\n shortLivedTokenRequested = true\n await masterApi.userApi.getToken(userWithLongToken.id!, 'tmp', 300, '123456')\n return { value: '123456', secretType: AuthSecretType.SHORT_LIVED_TOKEN }\n } else assert.fail('Should request LONG_LIVED_TOKEN or SHORT_LIVED_TOKEN')\n },\n })\n const userApi = userApiWithProvider(authProvider)\n expect((await userApi.getCurrentUser()).rev).to.equal(userWithLongToken.rev)\n expect(longLivedTokenRequested).to.be.true\n expect(shortLivedTokenRequested).to.be.false\n\n const newPw = randomUUID()\n const userWithNewPw = await userApi.modifyUser({ ...userWithLongToken, passwordHash: newPw })\n\n expect(userWithNewPw.rev).to.not.equal(userWithLongToken.rev)\n expect(shortLivedTokenRequested).to.be.true\n }\n )\n})\n"]}
|