@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":"patient-user.js","sourceRoot":"","sources":["../../../test/icc-x-api/patient-user.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { expect, use as chaiUse } from 'chai'\nimport 'mocha'\nimport { Apis, RSAUtilsImpl, ShaVersion, ua2hex } from '../../icc-x-api'\nimport { IccPatientApi } from '../../icc-api'\nimport { User } from '../../icc-api/model/User'\nimport { crypto } from '../../node-compat'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { before } from 'mocha'\nimport { getEnvironmentInitializer, hcp1Username, isLiteTest, patUsername, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { TestApi } from '../utils/TestApi'\nimport { RSAUtils } from '../../icc-x-api/crypto/RSA'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { BasicAuthenticationProvider } from '../../icc-x-api/auth/AuthenticationProvider'\nimport initApi = TestUtils.initApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\n\nchaiUse(chaiAsPromised)\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet api: Apis\nlet hcpUser: User\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\n\ndescribe('Patient', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n api = await initApi(env, hcp1Username)\n hcpUser = await api.userApi.getCurrentUser()\n })\n\n it('should be capable of creating a patient from scratch', async () => {\n const rawPatientApiForHcp = new IccPatientApi(\n env.iCureUrl,\n {},\n new BasicAuthenticationProvider(env.dataOwnerDetails[hcp1Username].user, env.dataOwnerDetails[hcp1Username].password)\n )\n const patient = await rawPatientApiForHcp.createPatient(\n new Patient({ id: api.cryptoApi.primitives.randomUuid(), firstName: 'Tasty', lastName: 'Test' })\n )\n const pwd = api.cryptoApi.primitives.randomUuid()\n const tmpUser = await api.userApi.createUser(\n new User({\n id: api.cryptoApi.primitives.randomUuid(),\n login: api.cryptoApi.primitives.randomUuid(),\n passwordHash: pwd,\n patientId: patient.id,\n })\n )\n\n const rsa = new RSAUtilsImpl(crypto)\n const keyPair = await rsa.generateKeyPair(ShaVersion.Sha256)\n const { publicKey, privateKey } = keyPair\n const publicKeyHex = ua2hex(await rsa.exportKey(publicKey, 'spki'))\n const rawPatientApi = new IccPatientApi(env.iCureUrl, {}, new BasicAuthenticationProvider(tmpUser.id!, pwd))\n await rawPatientApi.modifyPatient(new Patient({ ...patient, publicKey: publicKeyHex }))\n\n // TODO some of these operations may be forbidden by the backend in future versions...\n const { userApi, patientApi, cryptoApi } = await TestApi(env.iCureUrl, tmpUser.id!, pwd!, crypto, keyPair)\n const user = await userApi.getCurrentUser()\n let me: Patient = await patientApi.getPatientWithUser(user, user.patientId!)\n const mySecretIds = await patientApi.decryptSecretIdsOf(me)\n const myEncryptionKeys = await patientApi.getEncryptionKeysOf(me)\n expect(mySecretIds).to.have.length(1)\n expect(myEncryptionKeys).to.have.length(1)\n\n me = await patientApi.shareWith(hcpUser.healthcarePartyId!, me, mySecretIds, { requestedPermissions: FULL_WRITE })\n const expectedNote = 'This will be encrypted'\n await patientApi.modifyPatientWithUser(user, new Patient({ ...me, note: expectedNote }))\n\n const pat2 = await api.patientApi.getPatientWithUser(hcpUser, patient.id!)\n expect(!!pat2)\n expect(pat2.note).to.equal(expectedNote)\n }).timeout(60000)\n\n it('should be capable of logging in and encryption', async () => {\n const { userApi } = await initApi(env, patUsername)\n const rawPatientApi = new IccPatientApi(\n env.iCureUrl,\n {},\n new BasicAuthenticationProvider(env.dataOwnerDetails[patUsername].user, env.dataOwnerDetails[patUsername].password)\n )\n\n const user = await userApi.getCurrentUser()\n const patient = await rawPatientApi.getPatient(user.patientId!)\n\n const { calendarItemApi, patientApi, cryptoApi } = await initApi(env, patUsername)\n\n const patNote = 'Secret note'\n const pat = await patientApi.modifyPatientWithUser(user, {\n ...(await patientApi.getPatientWithUser(user, user.patientId!)),\n note: patNote,\n })\n const ciTitle = 'Secret title'\n const ciDetails = 'Important and private information'\n const ci = await calendarItemApi.createCalendarItemWithHcParty(\n user,\n await calendarItemApi.newInstancePatient(user, patient, { patientId: patient.id, title: ciTitle, details: ciDetails })\n )\n\n if (!isLiteTest()) {\n await expect(api.patientApi.getPatientWithUser(hcpUser, patient.id!)).to.be.rejected\n await expect(api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id)).to.be.rejected\n }\n\n await patientApi.shareWith(hcpUser.healthcarePartyId!, pat!, await patientApi.decryptSecretIdsOf(pat!), { requestedPermissions: FULL_WRITE })\n await calendarItemApi.shareWith(hcpUser.healthcarePartyId!, ci!, { requestedPermissions: FULL_WRITE })\n await api.cryptoApi.forceReload()\n const pat3 = await api.patientApi.getPatientWithUser(hcpUser, patient.id!)\n const ci3 = await api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id)\n expect(pat3).to.not.be.null\n expect(pat3.note).to.equal(patNote)\n expect(ci3).to.not.be.null\n expect(ci3.title).to.equal(ciTitle)\n expect(ci3.details).to.equal(ciDetails)\n }).timeout(60000)\n})\n"]}
|
|
1
|
+
{"version":3,"file":"patient-user.js","sourceRoot":"","sources":["../../../test/icc-x-api/patient-user.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { expect, use as chaiUse } from 'chai'\nimport 'mocha'\nimport { Apis, RSAUtilsImpl, ShaVersion, ua2hex } from '../../icc-x-api'\nimport { IccPatientApi } from '../../icc-api'\nimport { User } from '../../icc-api/model/User'\nimport { crypto } from '../../node-compat'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { before } from 'mocha'\nimport { getEnvironmentInitializer, hcp1Username, isLiteTest, patUsername, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { TestApi } from '../utils/TestApi'\nimport { RSAUtils } from '../../icc-x-api/crypto/RSA'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { BasicAuthenticationProvider } from '../../icc-x-api/auth/AuthenticationProvider'\nimport initApi = TestUtils.initApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\n\nchaiUse(chaiAsPromised)\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet api: Apis\nlet hcpUser: User\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\n\ndescribe('Patient', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n api = await initApi(env, hcp1Username)\n hcpUser = await api.userApi.getCurrentUser()\n })\n\n it('should be capable of creating a patient from scratch', async () => {\n const rawPatientApiForHcp = new IccPatientApi(\n env.iCureUrl,\n {},\n new BasicAuthenticationProvider(env.dataOwnerDetails[hcp1Username].user, env.dataOwnerDetails[hcp1Username].password)\n )\n const patient = await rawPatientApiForHcp.createPatient(\n new Patient({ id: api.cryptoApi.primitives.randomUuid(), firstName: 'Tasty', lastName: 'Test' })\n )\n const pwd = api.cryptoApi.primitives.randomUuid()\n const tmpUser = await api.userApi.createUser(\n new User({\n id: api.cryptoApi.primitives.randomUuid(),\n login: api.cryptoApi.primitives.randomUuid(),\n passwordHash: pwd,\n patientId: patient.id,\n })\n )\n\n const rsa = new RSAUtilsImpl(crypto)\n const keyPair = await rsa.generateKeyPair(ShaVersion.Sha256)\n const { publicKey, privateKey } = keyPair\n const publicKeyHex = ua2hex(await rsa.exportKey(publicKey, 'spki'))\n const rawPatientApi = new IccPatientApi(env.iCureUrl, {}, new BasicAuthenticationProvider(tmpUser.id!, pwd))\n await rawPatientApi.modifyPatient(new Patient({ ...patient, publicKey: publicKeyHex }))\n\n // TODO some of these operations may be forbidden by the backend in future versions...\n const { userApi, patientApi, cryptoApi } = await TestApi(env.iCureUrl, tmpUser.id!, pwd!, crypto, keyPair)\n const user = await userApi.getCurrentUser()\n let me: Patient = await patientApi.getPatientWithUser(user, user.patientId!)\n const mySecretIds = await patientApi.decryptSecretIdsOf(me)\n const myEncryptionKeys = await patientApi.getEncryptionKeysOf(me)\n expect(mySecretIds).to.have.length(1)\n expect(myEncryptionKeys).to.have.length(1)\n\n me = await patientApi.shareWith(hcpUser.healthcarePartyId!, me, mySecretIds, { requestedPermissions: FULL_WRITE })\n const expectedNote = 'This will be encrypted'\n await patientApi.modifyPatientWithUser(user, new Patient({ ...me, note: expectedNote }))\n\n const pat2 = await api.patientApi.getPatientWithUser(hcpUser, patient.id!)\n expect(!!pat2)\n expect(pat2.note).to.equal(expectedNote)\n }).timeout(60000)\n\n it('should be capable of logging in and encryption', async () => {\n const { userApi } = await initApi(env, patUsername)\n const rawPatientApi = new IccPatientApi(\n env.iCureUrl,\n {},\n new BasicAuthenticationProvider(env.dataOwnerDetails[patUsername].user, env.dataOwnerDetails[patUsername].password)\n )\n\n const user = await userApi.getCurrentUser()\n const patient = await rawPatientApi.getPatient(user.patientId!)\n\n const { calendarItemApi, patientApi, cryptoApi } = await initApi(env, patUsername)\n\n const patNote = 'Secret note'\n const pat = await patientApi.modifyPatientWithUser(user, {\n ...(await patientApi.getPatientWithUser(user, user.patientId!)),\n note: patNote,\n })\n const ciTitle = 'Secret title'\n const ciDetails = 'Important and private information'\n const ci = await calendarItemApi.createCalendarItemWithHcParty(\n user,\n await calendarItemApi.newInstancePatient(user, patient, { patientId: patient.id, title: ciTitle, details: ciDetails })\n )\n\n if (!isLiteTest()) {\n await expect(api.patientApi.getPatientWithUser(hcpUser, patient.id!)).to.be.rejected\n await expect(api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id)).to.be.rejected\n }\n\n await patientApi.shareWith(hcpUser.healthcarePartyId!, pat!, await patientApi.decryptSecretIdsOf(pat!), { requestedPermissions: FULL_WRITE })\n await calendarItemApi.shareWith(hcpUser.healthcarePartyId!, ci!, { requestedPermissions: FULL_WRITE })\n await api.cryptoApi.forceReload()\n const pat3 = await api.patientApi.getPatientWithUser(hcpUser, patient.id!)\n const ci3 = await api.calendarItemApi.getCalendarItemWithUser(hcpUser, ci.id)\n expect(pat3).to.not.be.null\n expect(pat3.note).to.equal(patNote)\n expect(ci3).to.not.be.null\n expect(ci3.title).to.equal(ciTitle)\n expect(ci3.details).to.equal(ciDetails)\n }).timeout(60000)\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-legacy-data-support.js","sourceRoot":"","sources":["../../../test/icc-x-api/test-legacy-data-support.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { Api as ApiV6, User as UserV6 } from '@icure/apiV6'\nimport { CryptoStrategies as CryptoStrategiesV7, DataOwnerWithType as DataOwnerWithTypeV7, IcureApi as ApiV7, User as UserV7 } from '@icure/apiV7'\nimport {\n WebCryptoPrimitives,\n EntityWithDelegationTypeName,\n hex2ua,\n IcureApi as ApiV8,\n RSAUtils,\n RSAUtilsImpl,\n ShaVersion,\n ua2hex,\n} from '../../icc-x-api'\nimport { getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { KeyPair } from '../../icc-x-api/crypto/RSA'\nimport { expect } from 'chai'\nimport { webcrypto } from 'crypto'\nimport { CryptoPrimitives } from '../../icc-x-api/crypto/CryptoPrimitives'\nimport { v4 as uuid } from 'uuid'\nimport { HealthcareParty } from '../../icc-api/model/HealthcareParty'\nimport { TestKeyStorage, TestStorage, testStorageWithKeys } from '../utils/TestStorage'\nimport { TestCryptoStrategies } from '../utils/TestCryptoStrategies'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { hexPublicKeysWithSha1Of, hexPublicKeysWithSha256Of } from '../../icc-x-api/crypto/utils'\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\n\ntype UserCredentials = {\n login: string\n password: string\n ownerId: string\n key: KeyPair<CryptoKey>\n}\ntype EncryptedData = {\n secretContent: string\n secretIds: string[]\n owningEntityIds: string[]\n}\n\ninterface UniformizedMasterApi {\n createUser(): Promise<UserCredentials>\n}\n\ninterface UniformizedTestApi {\n userDetails(): Promise<{ userId: string; dataOwnerId: string }>\n createEncryptedData(): Promise<{ id: string } & EncryptedData>\n getDecryptedData(id: string): Promise<EncryptedData>\n shareEncryptedData(dataId: string, delegateId: string): Promise<void>\n}\n\ninterface ApiFactory {\n readonly version: string\n masterApi(env: TestVars): Promise<UniformizedMasterApi>\n testApi(credentials: UserCredentials): Promise<UniformizedTestApi>\n}\n\nfunction checkEncryptedData(actual: EncryptedData, expected: EncryptedData, actualName: string) {\n expect(actual.secretContent, `${actualName} - secret content`).to.equal(expected.secretContent)\n expect(actual.secretIds, `${actualName} - secret ids`).to.have.length(expected.secretIds.length)\n for (const expectedId of expected.secretIds) {\n expect(actual.secretIds, `${actualName} - secret id`).to.contain(expectedId)\n }\n expect(actual.owningEntityIds, `${actualName} - owning entity id`).to.have.length(expected.owningEntityIds.length)\n for (const expectedId of expected.owningEntityIds) {\n expect(actual.owningEntityIds, `${actualName} - owning entity id`).to.contain(expectedId)\n }\n}\n\nsetLocalStorage(fetch)\nconst cryptoPrimitives = new WebCryptoPrimitives(webcrypto as any)\nlet env: TestVars\n\nclass ApiFactoryV6 implements ApiFactory {\n readonly version: string = 'apiV6.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const apis = await ApiV6(\n env.iCureUrl + '/rest/v1',\n env.masterHcp!.user,\n env.masterHcp!.password,\n webcrypto as any,\n fetch,\n false,\n false,\n new TestStorage(),\n new TestKeyStorage()\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v6' }))\n const user = await apis.userApi.createUser(\n new UserV6({\n id: uuid(),\n login: `v6-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const apis = await ApiV6(env.iCureUrl + '/rest/v1', credentials.login, credentials.password, webcrypto as any, fetch)\n // await apis.cryptoApi.cacheKeyPair(await cryptoPrimitives.RSA.exportKeys(credentials.key, \"jwk\", \"jwk\"))\n const user = await apis.userApi.getCurrentUser()\n await apis.cryptoApi.addKeyPairForOwner(\n apis.maintenanceTaskApi,\n user,\n await apis.cryptoApi.getDataOwner(credentials.ownerId),\n credentials.key,\n false,\n false\n )\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v6 note ${uuid()}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds: (await apis.cryptoApi.extractDelegationsSFKs(healthdata, credentials.ownerId)).extractedKeys,\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: (await apis.cryptoApi.extractDelegationsSFKs(healthdata, credentials.ownerId)).extractedKeys,\n owningEntityIds: (await apis.cryptoApi.extractCryptedFKs(healthdata, credentials.ownerId)).extractedKeys,\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n const patientIds = (await apis.cryptoApi.extractCryptedFKs(healthElement, credentials.ownerId)).extractedKeys\n expect(patientIds).to.have.length(1)\n const patient = await apis.patientApi.getPatientWithUser(user, patientIds[0])\n const secretIds = (await apis.cryptoApi.extractDelegationsSFKs(healthElement, credentials.ownerId)).extractedKeys\n expect(secretIds).to.have.length(1)\n await apis.healthcareElementApi.modifyHealthElementWithUser(\n user,\n (\n await apis.cryptoApi.extendedDelegationsAndCryptedForeignKeys(healthElement, patient, credentials.ownerId, delegateId, secretIds[0])\n ).modifiedObject\n )\n },\n }\n }\n}\n\nclass TestCryptoStrategiesV7 implements CryptoStrategiesV7 {\n private readonly RSA = new RSAUtilsImpl(webcrypto as any)\n constructor(private readonly key: KeyPair<CryptoKey> | undefined) {}\n\n async generateNewKeyForDataOwner(self: DataOwnerWithTypeV7): Promise<KeyPair<CryptoKey> | boolean> {\n if (!this.key) return false\n const knownKeys = new Set(...hexPublicKeysWithSha1Of(self))\n if (knownKeys.size <= 0) return this.key\n return false\n }\n\n async recoverAndVerifySelfHierarchyKeys(\n keysData: {\n dataOwner: DataOwnerWithTypeV7\n unknownKeys: string[]\n unavailableKeys: string[]\n }[]\n ): Promise<{\n [p: string]: { recoveredKeys: { [p: string]: KeyPair<CryptoKey> }; keyAuthenticity: { [p: string]: boolean } }\n }> {\n const self = keysData[keysData.length - 1].dataOwner\n const knownKeys = new Set([...hexPublicKeysWithSha1Of(self.dataOwner), ...hexPublicKeysWithSha256Of(self.dataOwner)])\n const publicKey = this.key ? ua2hex(await this.RSA.exportKey(this.key.publicKey, 'spki')) : undefined\n return Object.fromEntries(\n await Promise.all(\n keysData.map(async (currData) => {\n if (currData.dataOwner.dataOwner.id! !== self.dataOwner.id!) {\n return [\n currData.dataOwner.dataOwner.id!,\n {\n recoveredKeys: {},\n keyAuthenticity: {},\n },\n ]\n } else if (publicKey === undefined || !knownKeys.has(publicKey)) {\n return [currData.dataOwner.dataOwner.id!, { recoveredKeys: {}, keyAuthenticity: {} }]\n } else {\n return [currData.dataOwner.dataOwner.id!, { recoveredKeys: { [publicKey.slice(-32)]: this.key }, keyAuthenticity: {} }]\n }\n })\n )\n )\n }\n\n verifyDelegatePublicKeys(delegate: any, publicKeys: string[]): Promise<string[]> {\n return Promise.resolve(publicKeys)\n }\n}\nclass ApiFactoryV7 implements ApiFactory {\n readonly version: string = 'apiV7.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const key = {\n privateKey: await cryptoPrimitives.RSA.importKey('pkcs8', hex2ua(env.masterHcp!.privateKey), ['decrypt'], ShaVersion.Sha1),\n publicKey: await cryptoPrimitives.RSA.importKey('spki', hex2ua(env.masterHcp!.publicKey), ['encrypt'], ShaVersion.Sha1),\n }\n const apis = await ApiV7.initialise(\n env.iCureUrl,\n { username: env.masterHcp!.user, password: env.masterHcp!.password },\n new TestCryptoStrategiesV7(key),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v7' }))\n const user = await apis.userApi.createUser(\n new UserV7({\n id: uuid(),\n login: `v7-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const testStorage = await testStorageWithKeys([\n {\n dataOwnerId: credentials.ownerId,\n pairs: [\n {\n keyPair: {\n publicKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.publicKey, 'spki')),\n privateKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.privateKey, 'pkcs8')),\n },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const apis = await ApiV7.initialise(\n env.iCureUrl,\n {\n username: credentials.login,\n password: credentials.password,\n },\n new TestCryptoStrategiesV7(credentials.key),\n webcrypto as any,\n fetch,\n {\n storage: testStorage.storage,\n keyStorage: testStorage.keyStorage,\n entryKeysFactory: testStorage.keyFactory,\n }\n )\n const user = await apis.userApi.getCurrentUser()\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v7 note ${uuid}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n const secretIds = await apis.cryptoApi.entities.secretIdsOf(healthdata)\n expect(secretIds).to.have.length(1)\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds,\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: await apis.cryptoApi.entities.secretIdsOf(healthdata),\n owningEntityIds: await apis.cryptoApi.entities.owningEntityIdsOf(healthdata),\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n const encryptionKeys = await apis.cryptoApi.entities.encryptionKeysOf(healthElement)\n const secretIds = await apis.cryptoApi.entities.secretIdsOf(healthElement)\n const owningEntityIds = await apis.cryptoApi.entities.owningEntityIdsOf(healthElement)\n await apis.healthcareElementApi.modifyHealthElementWithUser(\n user,\n await apis.cryptoApi.entities.entityWithExtendedEncryptedMetadata(healthElement, delegateId, secretIds, encryptionKeys, owningEntityIds, [])\n )\n },\n }\n }\n}\n\nclass ApiFactoryV8 implements ApiFactory {\n readonly version: string = 'apiV8.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const key = {\n privateKey: await cryptoPrimitives.RSA.importKey('pkcs8', hex2ua(env.masterHcp!.privateKey), ['decrypt'], ShaVersion.Sha1),\n publicKey: await cryptoPrimitives.RSA.importKey('spki', hex2ua(env.masterHcp!.publicKey), ['encrypt'], ShaVersion.Sha1),\n }\n const apis = await ApiV8.initialise(\n env.iCureUrl,\n { username: env.masterHcp!.user, password: env.masterHcp!.password },\n new TestCryptoStrategies(key),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v7' }))\n const user = await apis.userApi.createUser(\n new UserV7({\n id: uuid(),\n login: `v7-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const testStorage = await testStorageWithKeys([\n {\n dataOwnerId: credentials.ownerId,\n pairs: [\n {\n keyPair: {\n publicKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.publicKey, 'spki')),\n privateKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.privateKey, 'pkcs8')),\n },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const apis = await ApiV8.initialise(\n env.iCureUrl,\n {\n username: credentials.login,\n password: credentials.password,\n },\n new TestCryptoStrategies(credentials.key),\n webcrypto as any,\n fetch,\n {\n storage: testStorage.storage,\n keyStorage: testStorage.keyStorage,\n entryKeysFactory: testStorage.keyFactory,\n }\n )\n const user = await apis.userApi.getCurrentUser()\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v8 note ${uuid()}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds: [],\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: await apis.cryptoApi.xapi.secretIdsOf({ entity: healthdata, type: EntityWithDelegationTypeName.HealthElement }, undefined),\n owningEntityIds: await apis.healthcareElementApi.decryptPatientIdOf(healthdata),\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n await apis.healthcareElementApi.shareWith(delegateId, healthElement, { requestedPermissions: RequestedPermissionEnum.MAX_WRITE })\n },\n }\n }\n}\n\n// Api factories in chronological version order\nlet chronologicalApiFactories: ApiFactory[] = [new ApiFactoryV6(), new ApiFactoryV7(), new ApiFactoryV8()]\n\ndescribe('All apis versions', async function () {\n before(async function () {\n this.timeout(600_000)\n env = await getEnvironmentInitializer().then((initializer) => initializer.execute(getEnvVariables()))\n })\n\n for (let legacyApiIndex = 0; legacyApiIndex < chronologicalApiFactories.length - 1; legacyApiIndex++) {\n const legacyApiFactory = chronologicalApiFactories[legacyApiIndex]\n const newApiFactories = chronologicalApiFactories.slice(legacyApiIndex + 1)\n it(`should be able to read and share data from older apis without affecting accessibility for older apis - ${legacyApiFactory.version}`, async function () {\n const legacyMasterApi = await legacyApiFactory.masterApi(env)\n const legacyUserCredentials = await legacyMasterApi.createUser()\n const legacyUserApi = await legacyApiFactory.testApi(legacyUserCredentials)\n const data = await legacyUserApi.createEncryptedData()\n checkEncryptedData(await legacyUserApi.getDecryptedData(data.id), data, 'Original decrypted data')\n const newApis = await Promise.all(\n newApiFactories.map(async (factory) => {\n const newLegacyUserApi = await factory.testApi(legacyUserCredentials)\n const newUser = await factory.masterApi(env).then((masterApi) => masterApi.createUser())\n const newUserApi = await factory.testApi(newUser)\n return { newLegacyUserApi, newUserApi, version: factory.version }\n })\n )\n for (const { newLegacyUserApi, newUserApi, version } of newApis) {\n checkEncryptedData(await newLegacyUserApi.getDecryptedData(data.id), data, `Data decrypted by legacy user on new api (${version})`)\n await newLegacyUserApi.shareEncryptedData(data.id, (await newUserApi.userDetails()).dataOwnerId)\n checkEncryptedData(await newUserApi.getDecryptedData(data.id), data, `Data decrypted by new user (${version})`)\n }\n checkEncryptedData(await legacyUserApi.getDecryptedData(data.id), data, `Data after changes by new versions of api`)\n })\n }\n})\n"]}
|
|
1
|
+
{"version":3,"file":"test-legacy-data-support.js","sourceRoot":"","sources":["../../../test/icc-x-api/test-legacy-data-support.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { Api as ApiV6, User as UserV6 } from '@icure/apiV6'\nimport { CryptoStrategies as CryptoStrategiesV7, DataOwnerWithType as DataOwnerWithTypeV7, IcureApi as ApiV7, User as UserV7 } from '@icure/apiV7'\nimport {\n WebCryptoPrimitives,\n EntityWithDelegationTypeName,\n hex2ua,\n IcureApi as ApiV8,\n RSAUtils,\n RSAUtilsImpl,\n ShaVersion,\n ua2hex,\n} from '../../icc-x-api'\nimport { getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { KeyPair } from '../../icc-x-api/crypto/RSA'\nimport { expect } from 'chai'\nimport { webcrypto } from 'crypto'\nimport { CryptoPrimitives } from '../../icc-x-api/crypto/CryptoPrimitives'\nimport { v4 as uuid } from 'uuid'\nimport { HealthcareParty } from '../../icc-api/model/HealthcareParty'\nimport { TestKeyStorage, TestStorage, testStorageWithKeys } from '../utils/TestStorage'\nimport { TestCryptoStrategies } from '../utils/TestCryptoStrategies'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { hexPublicKeysWithSha1Of, hexPublicKeysWithSha256Of } from '../../icc-x-api/crypto/utils'\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\n\ntype UserCredentials = {\n login: string\n password: string\n ownerId: string\n key: KeyPair<CryptoKey>\n}\ntype EncryptedData = {\n secretContent: string\n secretIds: string[]\n owningEntityIds: string[]\n}\n\ninterface UniformizedMasterApi {\n createUser(): Promise<UserCredentials>\n}\n\ninterface UniformizedTestApi {\n userDetails(): Promise<{ userId: string; dataOwnerId: string }>\n createEncryptedData(): Promise<{ id: string } & EncryptedData>\n getDecryptedData(id: string): Promise<EncryptedData>\n shareEncryptedData(dataId: string, delegateId: string): Promise<void>\n}\n\ninterface ApiFactory {\n readonly version: string\n masterApi(env: TestVars): Promise<UniformizedMasterApi>\n testApi(credentials: UserCredentials): Promise<UniformizedTestApi>\n}\n\nfunction checkEncryptedData(actual: EncryptedData, expected: EncryptedData, actualName: string) {\n expect(actual.secretContent, `${actualName} - secret content`).to.equal(expected.secretContent)\n expect(actual.secretIds, `${actualName} - secret ids`).to.have.length(expected.secretIds.length)\n for (const expectedId of expected.secretIds) {\n expect(actual.secretIds, `${actualName} - secret id`).to.contain(expectedId)\n }\n expect(actual.owningEntityIds, `${actualName} - owning entity id`).to.have.length(expected.owningEntityIds.length)\n for (const expectedId of expected.owningEntityIds) {\n expect(actual.owningEntityIds, `${actualName} - owning entity id`).to.contain(expectedId)\n }\n}\n\nsetLocalStorage(fetch)\nconst cryptoPrimitives = new WebCryptoPrimitives(webcrypto as any)\nlet env: TestVars\n\nclass ApiFactoryV6 implements ApiFactory {\n readonly version: string = 'apiV6.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const apis = await ApiV6(\n env.iCureUrl + '/rest/v1',\n env.masterHcp!.user,\n env.masterHcp!.password,\n webcrypto as any,\n fetch,\n false,\n false,\n new TestStorage(),\n new TestKeyStorage()\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v6' }))\n const user = await apis.userApi.createUser(\n new UserV6({\n id: uuid(),\n login: `v6-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const apis = await ApiV6(env.iCureUrl + '/rest/v1', credentials.login, credentials.password, webcrypto as any, fetch)\n // await apis.cryptoApi.cacheKeyPair(await cryptoPrimitives.RSA.exportKeys(credentials.key, \"jwk\", \"jwk\"))\n const user = await apis.userApi.getCurrentUser()\n await apis.cryptoApi.addKeyPairForOwner(\n apis.maintenanceTaskApi,\n user,\n await apis.cryptoApi.getDataOwner(credentials.ownerId),\n credentials.key,\n false,\n false\n )\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v6 note ${uuid()}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds: (await apis.cryptoApi.extractDelegationsSFKs(healthdata, credentials.ownerId)).extractedKeys,\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: (await apis.cryptoApi.extractDelegationsSFKs(healthdata, credentials.ownerId)).extractedKeys,\n owningEntityIds: (await apis.cryptoApi.extractCryptedFKs(healthdata, credentials.ownerId)).extractedKeys,\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n const patientIds = (await apis.cryptoApi.extractCryptedFKs(healthElement, credentials.ownerId)).extractedKeys\n expect(patientIds).to.have.length(1)\n const patient = await apis.patientApi.getPatientWithUser(user, patientIds[0])\n const secretIds = (await apis.cryptoApi.extractDelegationsSFKs(healthElement, credentials.ownerId)).extractedKeys\n expect(secretIds).to.have.length(1)\n await apis.healthcareElementApi.modifyHealthElementWithUser(\n user,\n (\n await apis.cryptoApi.extendedDelegationsAndCryptedForeignKeys(healthElement, patient, credentials.ownerId, delegateId, secretIds[0])\n ).modifiedObject\n )\n },\n }\n }\n}\n\nclass TestCryptoStrategiesV7 implements CryptoStrategiesV7 {\n private readonly RSA = new RSAUtilsImpl(webcrypto as any)\n constructor(private readonly key: KeyPair<CryptoKey> | undefined) {}\n\n async generateNewKeyForDataOwner(self: DataOwnerWithTypeV7): Promise<KeyPair<CryptoKey> | boolean> {\n if (!this.key) return false\n const knownKeys = new Set(...hexPublicKeysWithSha1Of(self))\n if (knownKeys.size <= 0) return this.key\n return false\n }\n\n async recoverAndVerifySelfHierarchyKeys(\n keysData: {\n dataOwner: DataOwnerWithTypeV7\n unknownKeys: string[]\n unavailableKeys: string[]\n }[]\n ): Promise<{\n [p: string]: { recoveredKeys: { [p: string]: KeyPair<CryptoKey> }; keyAuthenticity: { [p: string]: boolean } }\n }> {\n const self = keysData[keysData.length - 1].dataOwner\n const knownKeys = new Set([...hexPublicKeysWithSha1Of(self.dataOwner), ...hexPublicKeysWithSha256Of(self.dataOwner)])\n const publicKey = this.key ? ua2hex(await this.RSA.exportKey(this.key.publicKey, 'spki')) : undefined\n return Object.fromEntries(\n await Promise.all(\n keysData.map(async (currData) => {\n if (currData.dataOwner.dataOwner.id! !== self.dataOwner.id!) {\n return [\n currData.dataOwner.dataOwner.id!,\n {\n recoveredKeys: {},\n keyAuthenticity: {},\n },\n ]\n } else if (publicKey === undefined || !knownKeys.has(publicKey)) {\n return [currData.dataOwner.dataOwner.id!, { recoveredKeys: {}, keyAuthenticity: {} }]\n } else {\n return [currData.dataOwner.dataOwner.id!, { recoveredKeys: { [publicKey.slice(-32)]: this.key }, keyAuthenticity: {} }]\n }\n })\n )\n )\n }\n\n verifyDelegatePublicKeys(delegate: any, publicKeys: string[]): Promise<string[]> {\n return Promise.resolve(publicKeys)\n }\n}\nclass ApiFactoryV7 implements ApiFactory {\n readonly version: string = 'apiV7.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const key = {\n privateKey: await cryptoPrimitives.RSA.importKey('pkcs8', hex2ua(env.masterHcp!.privateKey), ['decrypt'], ShaVersion.Sha1),\n publicKey: await cryptoPrimitives.RSA.importKey('spki', hex2ua(env.masterHcp!.publicKey), ['encrypt'], ShaVersion.Sha1),\n }\n const apis = await ApiV7.initialise(\n env.iCureUrl,\n { username: env.masterHcp!.user, password: env.masterHcp!.password },\n new TestCryptoStrategiesV7(key),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v7' }))\n const user = await apis.userApi.createUser(\n new UserV7({\n id: uuid(),\n login: `v7-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const testStorage = await testStorageWithKeys([\n {\n dataOwnerId: credentials.ownerId,\n pairs: [\n {\n keyPair: {\n publicKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.publicKey, 'spki')),\n privateKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.privateKey, 'pkcs8')),\n },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const apis = await ApiV7.initialise(\n env.iCureUrl,\n {\n username: credentials.login,\n password: credentials.password,\n },\n new TestCryptoStrategiesV7(credentials.key),\n webcrypto as any,\n fetch,\n {\n storage: testStorage.storage,\n keyStorage: testStorage.keyStorage,\n entryKeysFactory: testStorage.keyFactory,\n }\n )\n const user = await apis.userApi.getCurrentUser()\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v7 note ${uuid}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n const secretIds = await apis.cryptoApi.entities.secretIdsOf(healthdata)\n expect(secretIds).to.have.length(1)\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds,\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: await apis.cryptoApi.entities.secretIdsOf(healthdata),\n owningEntityIds: await apis.cryptoApi.entities.owningEntityIdsOf(healthdata),\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n const encryptionKeys = await apis.cryptoApi.entities.encryptionKeysOf(healthElement)\n const secretIds = await apis.cryptoApi.entities.secretIdsOf(healthElement)\n const owningEntityIds = await apis.cryptoApi.entities.owningEntityIdsOf(healthElement)\n await apis.healthcareElementApi.modifyHealthElementWithUser(\n user,\n await apis.cryptoApi.entities.entityWithExtendedEncryptedMetadata(healthElement, delegateId, secretIds, encryptionKeys, owningEntityIds, [])\n )\n },\n }\n }\n}\n\nclass ApiFactoryV8 implements ApiFactory {\n readonly version: string = 'apiV8.x'\n\n async masterApi(env: TestVars): Promise<UniformizedMasterApi> {\n const key = {\n privateKey: await cryptoPrimitives.RSA.importKey('pkcs8', hex2ua(env.masterHcp!.privateKey), ['decrypt'], ShaVersion.Sha1),\n publicKey: await cryptoPrimitives.RSA.importKey('spki', hex2ua(env.masterHcp!.publicKey), ['encrypt'], ShaVersion.Sha1),\n }\n const apis = await ApiV8.initialise(\n env.iCureUrl,\n { username: env.masterHcp!.user, password: env.masterHcp!.password },\n new TestCryptoStrategies(key),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n return <UniformizedMasterApi>{\n createUser: async () => {\n const pair = await cryptoPrimitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hcp = await apis.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: `name`, lastName: 'v7' }))\n const user = await apis.userApi.createUser(\n new UserV7({\n id: uuid(),\n login: `v7-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n return {\n login: user.login,\n password: await apis.userApi.getToken(user.id!, uuid()),\n key: pair,\n ownerId: hcp.id,\n }\n },\n }\n }\n\n async testApi(credentials: UserCredentials): Promise<UniformizedTestApi> {\n const testStorage = await testStorageWithKeys([\n {\n dataOwnerId: credentials.ownerId,\n pairs: [\n {\n keyPair: {\n publicKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.publicKey, 'spki')),\n privateKey: ua2hex(await cryptoPrimitives.RSA.exportKey(credentials.key.privateKey, 'pkcs8')),\n },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const apis = await ApiV8.initialise(\n env.iCureUrl,\n {\n username: credentials.login,\n password: credentials.password,\n },\n new TestCryptoStrategies(credentials.key),\n webcrypto as any,\n fetch,\n {\n storage: testStorage.storage,\n keyStorage: testStorage.keyStorage,\n entryKeysFactory: testStorage.keyFactory,\n }\n )\n const user = await apis.userApi.getCurrentUser()\n return {\n userDetails: async () => {\n return { userId: user.id!, dataOwnerId: credentials.ownerId }\n },\n createEncryptedData: async () => {\n const note = `v8 note ${uuid()}`\n const patient = await apis.patientApi.createPatientWithUser(user, await apis.patientApi.newInstance(user))\n const healthdata = await apis.healthcareElementApi.createHealthElementWithUser(\n user,\n await apis.healthcareElementApi.newInstance(user, patient, { note })\n )\n return {\n id: healthdata.id,\n secretContent: note,\n secretIds: [],\n owningEntityIds: [patient.id! as string],\n }\n },\n getDecryptedData: async (id) => {\n const healthdata = await apis.healthcareElementApi.getHealthElementWithUser(user, id)\n return {\n secretContent: healthdata.note!,\n secretIds: await apis.cryptoApi.xapi.secretIdsOf({ entity: healthdata, type: EntityWithDelegationTypeName.HealthElement }, undefined),\n owningEntityIds: await apis.healthcareElementApi.decryptPatientIdOf(healthdata),\n }\n },\n shareEncryptedData: async (dataId, delegateId) => {\n const healthElement = await apis.healthcareElementApi.getHealthElementWithUser(user, dataId)\n await apis.healthcareElementApi.shareWith(delegateId, healthElement, { requestedPermissions: RequestedPermissionEnum.MAX_WRITE })\n },\n }\n }\n}\n\n// Api factories in chronological version order\nlet chronologicalApiFactories: ApiFactory[] = [new ApiFactoryV6(), new ApiFactoryV7(), new ApiFactoryV8()]\n\ndescribe('All apis versions', async function () {\n before(async function () {\n this.timeout(600_000)\n env = await getEnvironmentInitializer().then((initializer) => initializer.execute(getEnvVariables()))\n })\n\n for (let legacyApiIndex = 0; legacyApiIndex < chronologicalApiFactories.length - 1; legacyApiIndex++) {\n const legacyApiFactory = chronologicalApiFactories[legacyApiIndex]\n const newApiFactories = chronologicalApiFactories.slice(legacyApiIndex + 1)\n it(`should be able to read and share data from older apis without affecting accessibility for older apis - ${legacyApiFactory.version}`, async function () {\n const legacyMasterApi = await legacyApiFactory.masterApi(env)\n const legacyUserCredentials = await legacyMasterApi.createUser()\n const legacyUserApi = await legacyApiFactory.testApi(legacyUserCredentials)\n const data = await legacyUserApi.createEncryptedData()\n checkEncryptedData(await legacyUserApi.getDecryptedData(data.id), data, 'Original decrypted data')\n const newApis = await Promise.all(\n newApiFactories.map(async (factory) => {\n const newLegacyUserApi = await factory.testApi(legacyUserCredentials)\n const newUser = await factory.masterApi(env).then((masterApi) => masterApi.createUser())\n const newUserApi = await factory.testApi(newUser)\n return { newLegacyUserApi, newUserApi, version: factory.version }\n })\n )\n for (const { newLegacyUserApi, newUserApi, version } of newApis) {\n checkEncryptedData(await newLegacyUserApi.getDecryptedData(data.id), data, `Data decrypted by legacy user on new api (${version})`)\n await newLegacyUserApi.shareEncryptedData(data.id, (await newUserApi.userDetails()).dataOwnerId)\n checkEncryptedData(await newUserApi.getDecryptedData(data.id), data, `Data decrypted by new user (${version})`)\n }\n checkEncryptedData(await legacyUserApi.getDecryptedData(data.id), data, `Data after changes by new versions of api`)\n })\n }\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/utils/graph-test.ts"],"names":[],"mappings":";;AAAA,sEAAuG;AACvG,+BAA6B;AAC7B,gFAAqE;AAErE,SAAS,WAAW,CAAC,MAAa,EAAE,MAAa;IAC/C,IAAI,CAAC,IAAA,4BAAS,EAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"graph-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/utils/graph-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { acyclic, Graph, graphFromEdges, reachSetsAcyclic } from '../../../icc-x-api/utils/graph-utils'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\n\nfunction graphEquals(graphA: Graph, graphB: Graph): boolean {\n if (!setEquals(new Set(Object.keys(graphA)), new Set(Object.keys(graphA)))) {\n return false\n }\n return Object.keys(graphA).every((key) => setEquals(graphA[key], graphB[key]))\n}\n\ndescribe('Terminal nodes', function () {\n it('should match expected', function () {\n // Online representation of graph https://www.plantuml.com/plantuml/svg/LSux2e8n00FWFQVuHnLw1Ud3jlRHta7GJHsqtby9MPm-I234ljVbjJwFEtQ7_MRCSNDmrCi0JwCyoOAWFjA4H3CoZVACGgkSgBIX_TdHwS3G_bHkRy_hx-4N\n const graph = graphFromEdges([\n ['A', 'B'],\n ['A', 'C'],\n ['B', 'D'],\n ['B', 'E'],\n ['B', 'I'],\n ['C', 'C'],\n // NO D,\n ['E', 'F'],\n ['F', 'G'],\n ['G', 'E'],\n ['G', 'H'],\n // NO H,\n ['I', 'J'],\n ['I', 'N'],\n ['J', 'K'],\n ['K', 'K'],\n ['K', 'L'],\n ['L', 'M'],\n ['M', 'I'],\n ['N', 'L'],\n ])\n const copy = Object.entries(graph).reduce<Graph>((acc, [node, edges]) => {\n acc[node] = new Set(Array.from(edges))\n return acc\n }, {})\n expect(graphEquals(graph, copy)).to.be.true\n const terminals = Object.entries(reachSetsAcyclic(acyclic(graph).acyclicGraph))\n .filter(([, v]) => v.size === 0)\n .map(([k]) => k)\n expect(graphEquals(graph, copy)).to.be.true\n expect(terminals).to.have.length(4)\n expect(terminals).to.contain('C')\n expect(terminals).to.contain('D')\n expect(terminals).to.contain('H')\n const alternatives = new Set(['I', 'J', 'K', 'L', 'M', 'N'])\n expect(Array.from(terminals).filter((x) => alternatives.has(x))).to.have.length(1)\n })\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru-temporised-async-cache-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/utils/lru-temporised-async-cache-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { LruTemporisedAsyncCache } from '../../../icc-x-api/utils/lru-temporised-async-cache'\nimport { expect } from 'chai'\nimport { sleep } from '../../../icc-x-api'\n\ndescribe('Lru temporised async cache ', function () {\n it('should automatically retrieve data if not cached', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(100, () => 0)\n let wasRetrieved = false\n const retrieved = await cache.get('a', async () => {\n wasRetrieved = true\n return { item: 1 }\n })\n expect(wasRetrieved).to.be.true\n expect(retrieved).to.equal(1)\n })\n\n it('should reuse cached data if not expired', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(100, () => 0)\n const retrieved = await cache.get('a', async () => ({ item: 1 }))\n const reused = await cache.get('a', async () => {\n throw new Error('Should reuse cached value')\n })\n expect(reused).to.equal(retrieved)\n })\n\n it('should re-retrieve data if the cached item is expired by time, without evicting other items', async function () {\n let lifetimeCheckCalled = 0\n const cache = new LruTemporisedAsyncCache<string, number>(2, (value) => {\n lifetimeCheckCalled += 1\n return value < 10 ? 10 : 50\n })\n expect(await cache.get('b', async () => ({ item: 10 }))).to.equal(10)\n const retrieved = await cache.get('a', async () => ({ item: 1 }))\n expect(retrieved).to.equal(1)\n await sleep(20)\n const reRetrieved = await cache.get('a', async (previousValue) => {\n expect(previousValue).to.equal(1)\n return { item: 2 }\n })\n expect(reRetrieved).to.equal(2)\n expect(lifetimeCheckCalled).to.equal(1)\n expect(\n await cache.get('b', async () => {\n throw new Error('Value should have not been evicted')\n })\n ).to.equal(10)\n expect(lifetimeCheckCalled).to.equal(2)\n })\n\n it('should re-retrieve data if the cached item is expired according to the additional expiration condition, without evicting other items', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(2, () => 0)\n expect(await cache.get('b', async () => ({ item: 10 }))).to.equal(10)\n const retrieved = await cache.get('a', async () => ({ item: 1 }))\n expect(retrieved).to.equal(1)\n const retrieved2 = await cache.get(\n 'a',\n async () => {\n throw new Error('Value should not have been evicted')\n },\n (item) => item < 1\n )\n expect(retrieved2).to.equal(1)\n const retrieved3 = await cache.get(\n 'a',\n async (previousValue) => {\n expect(previousValue).to.equal(1)\n return { item: 2 }\n },\n (item) => item < 2\n )\n expect(retrieved3).to.equal(2)\n expect(\n await cache.get('b', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(10)\n })\n\n it('should ignore additional expiration condition on newly retrieved data', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(3, () => 0)\n expect(\n await cache.get(\n 'a',\n async () => ({ item: 1 }),\n () => true\n )\n ).to.equal(1)\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(1)\n })\n\n it('should evict the least recently used item if full, regardless of expiration time of items', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(3, (v) => (v == 4 ? 10 : 0))\n expect(await cache.get('a', async () => ({ item: 1 }))).to.equal(1)\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(await cache.get('c', async () => ({ item: 3 }))).to.equal(3)\n expect(\n await cache.get('d', async (prev) => {\n expect(prev).to.be.undefined\n return { item: 4 }\n })\n ).to.equal(4) // This evicts \"a\"\n expect(\n await cache.get('b', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(2)\n expect(\n await cache.get('c', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(3)\n expect(\n await cache.get('d', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(4)\n expect(\n await cache.get('a', async (prev) => {\n expect(prev).to.be.undefined // \"a\" was previously evicted so prev should be undefined\n return { item: 5 }\n })\n ).to.equal(5) // This evicts \"b\"\n await sleep(20)\n // Cache for \"d\" is expired, but LRU is \"c\", so we still evict \"c\"\n expect(await cache.get('b', async () => ({ item: 6 }))).to.equal(6)\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(5)\n expect(\n await cache.get('d', async (previousValue) => {\n expect(previousValue).to.equal(4)\n return { item: 7 }\n })\n ).to.equal(7)\n expect(\n await cache.get('c', async (previousValue) => {\n expect(previousValue).to.be.undefined\n return { item: 8 }\n })\n ).to.equal(8)\n })\n\n it('should update least recently used item', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(3, () => 0)\n expect(await cache.get('a', async () => ({ item: 1 }))).to.equal(1)\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(await cache.get('c', async () => ({ item: 3 }))).to.equal(3)\n // We retrieve \"a\" again, so LRU will be \"b\"\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(1)\n // Now we run out of space and evict b\n expect(await cache.get('d', async () => ({ item: 4 }))).to.equal(4)\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(1)\n expect(\n await cache.get('c', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(3)\n expect(\n await cache.get('b', async (previousValue) => {\n expect(previousValue).to.be.undefined\n return { item: 5 }\n })\n ).to.equal(5)\n })\n\n it('should support additional eviction triggers for any eviction reason - time based expiration', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(2, () => 10)\n let didTrigger = false\n expect(\n await cache.get('a', async () => ({\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.true\n didTrigger = true\n },\n }))\n ).to.equal(1)\n expect(didTrigger).to.be.false\n await sleep(20)\n expect(didTrigger).to.be.false\n expect(await cache.get('a', async () => ({ item: 2 }))).to.equal(2)\n expect(didTrigger).to.be.true\n })\n\n it('should support additional eviction triggers for any eviction reason - additional expiration condition', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(2, () => 0)\n let didTrigger = false\n expect(\n await cache.get('a', async () => ({\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.true\n didTrigger = true\n },\n }))\n ).to.equal(1)\n expect(didTrigger).to.be.false\n expect(\n await cache.get(\n 'a',\n async () => ({ item: 2 }),\n () => true\n )\n ).to.equal(2)\n expect(didTrigger).to.be.true\n })\n\n it('should support additional eviction triggers for any eviction reason - eviction because out of slots', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n let didTrigger = false\n expect(\n await cache.get('a', async () => ({\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.false\n didTrigger = true\n },\n }))\n ).to.equal(1)\n expect(didTrigger).to.be.false\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(didTrigger).to.be.true\n })\n\n it('should support additional eviction triggers for any eviction reason - eviction due to clear, if requested', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(2, () => 0)\n let didTrigger = false\n expect(\n await cache.get('a', async () => ({\n item: 1,\n onEviction: () => {\n didTrigger = true\n },\n }))\n ).to.equal(1)\n cache.clear(false)\n expect(didTrigger).to.be.false\n expect(\n await cache.get('a', async (previousValue) => {\n expect(previousValue).to.be.undefined\n return {\n item: 2,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.false\n didTrigger = true\n },\n }\n })\n ).to.equal(2)\n cache.clear(true)\n expect(didTrigger).to.be.true\n })\n\n it('should not start parallel retrieval jobs for the same key if the job was not evicted', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return { item: 1 }\n })\n const job2 = cache.get('a', async () => {\n throw new Error('Should not start another job')\n })\n expect(await job2).to.equal(1)\n expect(await job1).to.equal(1)\n })\n\n it('should be able to evict uncompleted jobs, but still complete them', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return { item: 1 }\n })\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(await job1).to.equal(1)\n expect(\n await cache.get('b', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(2)\n })\n\n it('evicted uncompleted jobs, should not override more recent results for the same key when completed', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return { item: 1 }\n })\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(\n await cache.get('a', async (prev) => {\n expect(prev).to.be.undefined\n return { item: 3 }\n })\n ).to.equal(3)\n expect(await job1).to.equal(1)\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(3)\n })\n\n it('should rethrow exceptions from the retrieval job to anyone waiting on the job, but allow future tasks to reattempt the job', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n const error = new Error('This error is expected')\n const job1 = cache.get('a', async () => {\n await sleep(20)\n throw error\n })\n const job2 = cache.get('a', async () => {\n throw new Error('Should not start another job')\n })\n try {\n await job2\n } catch (e) {\n expect(e).to.equal(error)\n }\n try {\n await job1\n } catch (e) {\n expect(e).to.equal(error)\n }\n expect(await cache.get('a', async () => ({ item: 1 }))).to.equal(1)\n })\n\n it('should immediately perform the eviction triggers on completion if the data will not cached when the job completes', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n let eviction1Performed = false\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return {\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.false\n eviction1Performed = true\n },\n }\n })\n // Lose reference to existing and incomplete job for key 'a'\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n // Can't evict because not yet completed\n expect(eviction1Performed).to.be.false\n // Wait for job completion and eviction\n expect(await job1).to.equal(1)\n expect(eviction1Performed).to.be.true\n })\n\n it('should not replace newer data if old data completes after replacement by newer data', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n let eviction1Performed = false\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return {\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.true\n eviction1Performed = true\n },\n }\n })\n // Lose reference to existing and incomplete job for key 'a'\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n // Can't evict because not yet completed\n expect(eviction1Performed).to.be.false\n // Start new job for 'a' since we don't know about the existing one\n expect(\n await cache.get('a', async () => ({\n item: 3,\n onEviction: () => {\n throw new Error('This should not be called')\n },\n }))\n ).to.equal(3)\n expect(await job1).to.equal(1)\n expect(eviction1Performed).to.be.true\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"lru-temporised-async-cache-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/utils/lru-temporised-async-cache-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { LruTemporisedAsyncCache } from '../../../icc-x-api/utils/lru-temporised-async-cache'\nimport { expect } from 'chai'\nimport { sleep } from '../../../icc-x-api'\n\ndescribe('Lru temporised async cache ', function () {\n it('should automatically retrieve data if not cached', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(100, () => 0)\n let wasRetrieved = false\n const retrieved = await cache.get('a', async () => {\n wasRetrieved = true\n return { item: 1 }\n })\n expect(wasRetrieved).to.be.true\n expect(retrieved).to.equal(1)\n })\n\n it('should reuse cached data if not expired', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(100, () => 0)\n const retrieved = await cache.get('a', async () => ({ item: 1 }))\n const reused = await cache.get('a', async () => {\n throw new Error('Should reuse cached value')\n })\n expect(reused).to.equal(retrieved)\n })\n\n it('should re-retrieve data if the cached item is expired by time, without evicting other items', async function () {\n let lifetimeCheckCalled = 0\n const cache = new LruTemporisedAsyncCache<string, number>(2, (value) => {\n lifetimeCheckCalled += 1\n return value < 10 ? 10 : 50\n })\n expect(await cache.get('b', async () => ({ item: 10 }))).to.equal(10)\n const retrieved = await cache.get('a', async () => ({ item: 1 }))\n expect(retrieved).to.equal(1)\n await sleep(20)\n const reRetrieved = await cache.get('a', async (previousValue) => {\n expect(previousValue).to.equal(1)\n return { item: 2 }\n })\n expect(reRetrieved).to.equal(2)\n expect(lifetimeCheckCalled).to.equal(1)\n expect(\n await cache.get('b', async () => {\n throw new Error('Value should have not been evicted')\n })\n ).to.equal(10)\n expect(lifetimeCheckCalled).to.equal(2)\n })\n\n it('should re-retrieve data if the cached item is expired according to the additional expiration condition, without evicting other items', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(2, () => 0)\n expect(await cache.get('b', async () => ({ item: 10 }))).to.equal(10)\n const retrieved = await cache.get('a', async () => ({ item: 1 }))\n expect(retrieved).to.equal(1)\n const retrieved2 = await cache.get(\n 'a',\n async () => {\n throw new Error('Value should not have been evicted')\n },\n (item) => item < 1\n )\n expect(retrieved2).to.equal(1)\n const retrieved3 = await cache.get(\n 'a',\n async (previousValue) => {\n expect(previousValue).to.equal(1)\n return { item: 2 }\n },\n (item) => item < 2\n )\n expect(retrieved3).to.equal(2)\n expect(\n await cache.get('b', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(10)\n })\n\n it('should ignore additional expiration condition on newly retrieved data', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(3, () => 0)\n expect(\n await cache.get(\n 'a',\n async () => ({ item: 1 }),\n () => true\n )\n ).to.equal(1)\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(1)\n })\n\n it('should evict the least recently used item if full, regardless of expiration time of items', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(3, (v) => (v == 4 ? 10 : 0))\n expect(await cache.get('a', async () => ({ item: 1 }))).to.equal(1)\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(await cache.get('c', async () => ({ item: 3 }))).to.equal(3)\n expect(\n await cache.get('d', async (prev) => {\n expect(prev).to.be.undefined\n return { item: 4 }\n })\n ).to.equal(4) // This evicts \"a\"\n expect(\n await cache.get('b', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(2)\n expect(\n await cache.get('c', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(3)\n expect(\n await cache.get('d', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(4)\n expect(\n await cache.get('a', async (prev) => {\n expect(prev).to.be.undefined // \"a\" was previously evicted so prev should be undefined\n return { item: 5 }\n })\n ).to.equal(5) // This evicts \"b\"\n await sleep(20)\n // Cache for \"d\" is expired, but LRU is \"c\", so we still evict \"c\"\n expect(await cache.get('b', async () => ({ item: 6 }))).to.equal(6)\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(5)\n expect(\n await cache.get('d', async (previousValue) => {\n expect(previousValue).to.equal(4)\n return { item: 7 }\n })\n ).to.equal(7)\n expect(\n await cache.get('c', async (previousValue) => {\n expect(previousValue).to.be.undefined\n return { item: 8 }\n })\n ).to.equal(8)\n })\n\n it('should update least recently used item', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(3, () => 0)\n expect(await cache.get('a', async () => ({ item: 1 }))).to.equal(1)\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(await cache.get('c', async () => ({ item: 3 }))).to.equal(3)\n // We retrieve \"a\" again, so LRU will be \"b\"\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(1)\n // Now we run out of space and evict b\n expect(await cache.get('d', async () => ({ item: 4 }))).to.equal(4)\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(1)\n expect(\n await cache.get('c', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(3)\n expect(\n await cache.get('b', async (previousValue) => {\n expect(previousValue).to.be.undefined\n return { item: 5 }\n })\n ).to.equal(5)\n })\n\n it('should support additional eviction triggers for any eviction reason - time based expiration', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(2, () => 10)\n let didTrigger = false\n expect(\n await cache.get('a', async () => ({\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.true\n didTrigger = true\n },\n }))\n ).to.equal(1)\n expect(didTrigger).to.be.false\n await sleep(20)\n expect(didTrigger).to.be.false\n expect(await cache.get('a', async () => ({ item: 2 }))).to.equal(2)\n expect(didTrigger).to.be.true\n })\n\n it('should support additional eviction triggers for any eviction reason - additional expiration condition', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(2, () => 0)\n let didTrigger = false\n expect(\n await cache.get('a', async () => ({\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.true\n didTrigger = true\n },\n }))\n ).to.equal(1)\n expect(didTrigger).to.be.false\n expect(\n await cache.get(\n 'a',\n async () => ({ item: 2 }),\n () => true\n )\n ).to.equal(2)\n expect(didTrigger).to.be.true\n })\n\n it('should support additional eviction triggers for any eviction reason - eviction because out of slots', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n let didTrigger = false\n expect(\n await cache.get('a', async () => ({\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.false\n didTrigger = true\n },\n }))\n ).to.equal(1)\n expect(didTrigger).to.be.false\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(didTrigger).to.be.true\n })\n\n it('should support additional eviction triggers for any eviction reason - eviction due to clear, if requested', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(2, () => 0)\n let didTrigger = false\n expect(\n await cache.get('a', async () => ({\n item: 1,\n onEviction: () => {\n didTrigger = true\n },\n }))\n ).to.equal(1)\n cache.clear(false)\n expect(didTrigger).to.be.false\n expect(\n await cache.get('a', async (previousValue) => {\n expect(previousValue).to.be.undefined\n return {\n item: 2,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.false\n didTrigger = true\n },\n }\n })\n ).to.equal(2)\n cache.clear(true)\n expect(didTrigger).to.be.true\n })\n\n it('should not start parallel retrieval jobs for the same key if the job was not evicted', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return { item: 1 }\n })\n const job2 = cache.get('a', async () => {\n throw new Error('Should not start another job')\n })\n expect(await job2).to.equal(1)\n expect(await job1).to.equal(1)\n })\n\n it('should be able to evict uncompleted jobs, but still complete them', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return { item: 1 }\n })\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(await job1).to.equal(1)\n expect(\n await cache.get('b', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(2)\n })\n\n it('evicted uncompleted jobs, should not override more recent results for the same key when completed', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return { item: 1 }\n })\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n expect(\n await cache.get('a', async (prev) => {\n expect(prev).to.be.undefined\n return { item: 3 }\n })\n ).to.equal(3)\n expect(await job1).to.equal(1)\n expect(\n await cache.get('a', async () => {\n throw new Error('Value should not have been evicted')\n })\n ).to.equal(3)\n })\n\n it('should rethrow exceptions from the retrieval job to anyone waiting on the job, but allow future tasks to reattempt the job', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n const error = new Error('This error is expected')\n const job1 = cache.get('a', async () => {\n await sleep(20)\n throw error\n })\n const job2 = cache.get('a', async () => {\n throw new Error('Should not start another job')\n })\n try {\n await job2\n } catch (e) {\n expect(e).to.equal(error)\n }\n try {\n await job1\n } catch (e) {\n expect(e).to.equal(error)\n }\n expect(await cache.get('a', async () => ({ item: 1 }))).to.equal(1)\n })\n\n it('should immediately perform the eviction triggers on completion if the data will not cached when the job completes', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n let eviction1Performed = false\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return {\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.false\n eviction1Performed = true\n },\n }\n })\n // Lose reference to existing and incomplete job for key 'a'\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n // Can't evict because not yet completed\n expect(eviction1Performed).to.be.false\n // Wait for job completion and eviction\n expect(await job1).to.equal(1)\n expect(eviction1Performed).to.be.true\n })\n\n it('should not replace newer data if old data completes after replacement by newer data', async function () {\n const cache = new LruTemporisedAsyncCache<string, number>(1, () => 0)\n let eviction1Performed = false\n const job1 = cache.get('a', async () => {\n await sleep(20)\n return {\n item: 1,\n onEviction: (isReplacement) => {\n expect(isReplacement).to.be.true\n eviction1Performed = true\n },\n }\n })\n // Lose reference to existing and incomplete job for key 'a'\n expect(await cache.get('b', async () => ({ item: 2 }))).to.equal(2)\n // Can't evict because not yet completed\n expect(eviction1Performed).to.be.false\n // Start new job for 'a' since we don't know about the existing one\n expect(\n await cache.get('a', async () => ({\n item: 3,\n onEviction: () => {\n throw new Error('This should not be called')\n },\n }))\n ).to.equal(3)\n expect(await job1).to.equal(1)\n expect(eviction1Performed).to.be.true\n })\n})\n"]}
|
package/test/support/CSM-243.js
CHANGED
|
@@ -19,8 +19,8 @@ const chaiAsPromised = require("chai-as-promised");
|
|
|
19
19
|
(0, chai_1.use)(chaiAsPromised);
|
|
20
20
|
let env;
|
|
21
21
|
function createMessage(api, user, props) {
|
|
22
|
-
var _a, _b;
|
|
23
22
|
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
var _a, _b;
|
|
24
24
|
const messageBase = {
|
|
25
25
|
subject: `Test message - ${api.cryptoApi.primitives.randomUuid()}`,
|
|
26
26
|
fromAddress: (_a = props.includeFromAddress) !== null && _a !== void 0 ? _a : api.cryptoApi.primitives.randomUuid(),
|
|
@@ -46,8 +46,8 @@ function createTestMessages(api, user, propsForAccessibleMessages, propsForInacc
|
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
function getAllPaginatedMessages(listFunction) {
|
|
49
|
-
var _a, _b, _c;
|
|
50
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
var _a, _b, _c;
|
|
51
51
|
let latestRetrieved;
|
|
52
52
|
let allResults = [];
|
|
53
53
|
do {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CSM-243.js","sourceRoot":"","sources":["../../../test/support/CSM-243.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oDAAiG;AAEjG,mCAAmC;AACnC,+BAA6C;AAC7C,4BAAyB;AACzB,mDAAmE;AAEnE,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AACtB,mDAAkD;AAIlD,IAAA,UAAO,EAAC,cAAc,CAAC,CAAA;AAEvB,IAAI,GAAa,CAAA;AAEjB,SAAe,aAAa,CAC1B,GAAa,EACb,IAAU,EACV,KAIC;;;QAED,MAAM,WAAW,GAAY;YAC3B,OAAO,EAAE,kBAAkB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE;YAClE,WAAW,EAAE,MAAA,KAAK,CAAC,kBAAkB,mCAAI,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE;YAC9E,WAAW,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,MAAA,KAAK,CAAC,gBAAgB,mCAAI,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACrH,QAAQ,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;SACxF,CAAA;QACD,OAAO,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;;CAC/F;AAED,SAAe,kBAAkB,CAC/B,GAAa,EACb,IAAU,EACV,0BAIC,EACD,4BAIC;;QAED,MAAM,gBAAgB,GAAc,EAAE,CAAA;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,gBAAgB,CAAC,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC,CAAA;YACjF,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,4BAA4B,CAAC,CAAA;SAC7D;QACD,mHAAmH;QACnH,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAA;QACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAA;SACrE;QACD,OAAO,gBAAgB,CAAA;IACzB,CAAC;CAAA;AAED,SAAe,uBAAuB,CAAC,YAAwF;;;QAC7H,IAAI,eAAiD,CAAA;QACrD,IAAI,UAAU,GAAc,EAAE,CAAA;QAC9B,GAAG;YACD,MAAM,OAAO,GAAG,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,WAAW,0CAAE,QAAQ,CAAA;YACtD,eAAe,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,WAAW,0CAAE,aAAa,CAAC,CAAA;YAChI,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,IAAK,CAAC,CAAA;SAC1C,QAAQ,CAAA,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,WAAW,0CAAE,QAAQ,MAAK,SAAS,EAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC9D,OAAO,UAAU,CAAA;;CAClB;AAED,QAAQ,CAAC,SAAS,EAAE;;QAClB,MAAM,CAAC;;gBACL,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACpB,MAAM,WAAW,GAAG,MAAM,IAAA,sCAAyB,GAAE,CAAA;gBACrD,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAA;YACpD,CAAC;SAAA,CAAC,CAAA;QAEF,SAAe,qBAAqB,CAClC,0BAGC,EACD,YAKkC;;gBAElC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAA;gBAChD,MAAM,gBAAgB,GAAc,MAAM,kBAAkB,CAC1D,GAAG,EACH,IAAI,kCACC,0BAA0B,KAAE,qBAAqB,EAAE,KAAK,KAC7D,EAAE,qBAAqB,EAAE,KAAK,EAAE,CACjC,CAAA;gBACD,IAAI,UAAU,GAAc,MAAM,uBAAuB,CAAC,CAAC,OAAgB,EAAE,YAAqB,EAAE,EAAE,CACpG,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CACxD,CAAA;gBACD,IAAA,aAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;gBAC3D,IAAA,aAAM,EAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACxF,CAAC;SAAA;QAED,SAAe,kBAAkB,CAC/B,0BAGC,EACD,YAKkC;;gBAElC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAA;gBAChD,MAAM,4BAA4B,GAAc,MAAM,kBAAkB,CACtE,GAAG,EACH,IAAI,kCACC,0BAA0B,KAAE,qBAAqB,EAAE,IAAI,KAC5D,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAChC,CAAA;gBACD,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,kCAAO,0BAA0B,KAAE,qBAAqB,EAAE,KAAK,IAAG,CAAA;gBAC9H,IAAI,UAAU,GAAc,MAAM,uBAAuB,CAAC,CAAC,OAAgB,EAAE,YAAqB,EAAE,EAAE,CACpG,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CACxD,CAAA;gBACD,IAAA,aAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAC3E,IAAA,aAAM,EAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,sBAAsB,CAAC,EAAG,CAAC,CAAC,CAAA;gBACnI,IAAA,aAAM,EAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;oBACtD,SAAS;oBACT,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAS,GAAG,CAAC,CAAC,QAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;iBACjG,CAAC,CAAA;YACJ,CAAC;SAAA;QACD,EAAE,CAAC,2FAA2F,EAAE;;gBAC9F,MAAM,aAAa,GAAG,IAAA,mBAAU,GAAE,CAAA;gBAClC,MAAM,qBAAqB,CAAC,EAAE,kBAAkB,EAAE,aAAa,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAC9G,UAAU,CAAC,yBAAyB,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAClF,CAAA;YACH,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,wFAAwF,EAAE;;gBAC3F,MAAM,aAAa,GAAG,IAAA,mBAAU,GAAE,CAAA;gBAClC,MAAM,kBAAkB,CAAC,EAAE,kBAAkB,EAAE,aAAa,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAC3G,UAAU,CAAC,yBAAyB,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAClF,CAAA;YACH,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,yFAAyF,EAAE;;gBAC5F,MAAM,aAAa,GAAG,IAAA,mBAAU,GAAE,CAAA;gBAClC,MAAM,qBAAqB,CAAC,EAAE,gBAAgB,EAAE,aAAa,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAC5G,UAAU,CAAC,uBAAuB,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAChF,CAAA;YACH,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,sFAAsF,EAAE;;gBACzF,MAAM,aAAa,GAAG,IAAA,mBAAU,GAAE,CAAA;gBAClC,MAAM,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,aAAa,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CACzG,UAAU,CAAC,uBAAuB,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAChF,CAAA;YACH,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC;CAAA,CAAC,CAAA","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { IccMessageXApi, IcureApi } from '../../icc-x-api'\nimport { randomUUID } from 'crypto'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { User } from '../../icc-api/model/User'\nimport { Message } from '../../icc-api/model/Message'\nimport { PaginatedListMessage } from '../../icc-api/model/PaginatedListMessage'\nchaiUse(chaiAsPromised)\n\nlet env: TestVars\n\nasync function createMessage(\n api: IcureApi,\n user: User,\n props: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message> {\n const messageBase: Message = {\n subject: `Test message - ${api.cryptoApi.primitives.randomUuid()}`,\n fromAddress: props.includeFromAddress ?? api.cryptoApi.primitives.randomUuid(),\n toAddresses: [api.cryptoApi.primitives.randomUuid(), props.includeToAddress ?? api.cryptoApi.primitives.randomUuid()],\n received: props.includeRandomReceived ? Math.floor(Math.random() * 1000000) : undefined,\n }\n return await api.messageApi.createMessage(await api.messageApi.newInstance(user, messageBase))\n}\n\nasync function createTestMessages(\n api: IcureApi,\n user: User,\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n },\n propsForInaccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message[]> {\n const expectedMessages: Message[] = []\n for (let i = 0; i < 100; i++) {\n expectedMessages.push(await createMessage(api, user, propsForAccessibleMessages))\n await createMessage(api, user, propsForInaccessibleMessages)\n }\n // Also creates some messages from an unrelated hcp and same from address that should not be retrieved by the test.\n const { api: otherApi, user: otherUser } = await createNewHcpApi(env)\n for (let i = 0; i < 100; i++) {\n await createMessage(otherApi, otherUser, propsForAccessibleMessages)\n }\n return expectedMessages\n}\n\nasync function getAllPaginatedMessages(listFunction: (nextKey?: string, nextKeyDocId?: string) => Promise<PaginatedListMessage>): Promise<Message[]> {\n let latestRetrieved: PaginatedListMessage | undefined\n let allResults: Message[] = []\n do {\n const nextKey = latestRetrieved?.nextKeyPair?.startKey\n latestRetrieved = await listFunction(nextKey ? JSON.stringify(nextKey) : undefined, latestRetrieved?.nextKeyPair?.startKeyDocId)\n allResults.push(...latestRetrieved.rows!)\n } while (latestRetrieved?.nextKeyPair?.startKey !== undefined)\n console.log(JSON.stringify(allResults.map((m) => m.received)))\n return allResults\n}\n\ndescribe('CSM-243', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function doTestWithoutReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessages: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: false },\n { includeRandomReceived: false }\n )\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessages.length)\n expect(allResults.map((m) => m.id)).to.have.members(expectedMessages.map((m) => m.id))\n }\n\n async function doTestWithReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessagesWithReceived: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: true },\n { includeRandomReceived: true }\n )\n const messageWithoutReceived = await createMessage(api, user, { ...propsForAccessibleMessages, includeRandomReceived: false })\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessagesWithReceived.length + 1)\n expect(allResults.map((m) => m.id)).to.have.members([...expectedMessagesWithReceived.map((m) => m.id), messageWithoutReceived.id!])\n expect(allResults.map((m) => m.received)).to.deep.equal([\n undefined,\n ...expectedMessagesWithReceived.sort((a, b) => b.received! - a.received!).map((m) => m.received),\n ])\n }\n it('A user should be able to retrieve paginated messages without received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages without received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"CSM-243.js","sourceRoot":"","sources":["../../../test/support/CSM-243.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { IccMessageXApi, IcureApi } from '../../icc-x-api'\nimport { randomUUID } from 'crypto'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { User } from '../../icc-api/model/User'\nimport { Message } from '../../icc-api/model/Message'\nimport { PaginatedListMessage } from '../../icc-api/model/PaginatedListMessage'\nchaiUse(chaiAsPromised)\n\nlet env: TestVars\n\nasync function createMessage(\n api: IcureApi,\n user: User,\n props: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message> {\n const messageBase: Message = {\n subject: `Test message - ${api.cryptoApi.primitives.randomUuid()}`,\n fromAddress: props.includeFromAddress ?? api.cryptoApi.primitives.randomUuid(),\n toAddresses: [api.cryptoApi.primitives.randomUuid(), props.includeToAddress ?? api.cryptoApi.primitives.randomUuid()],\n received: props.includeRandomReceived ? Math.floor(Math.random() * 1000000) : undefined,\n }\n return await api.messageApi.createMessage(await api.messageApi.newInstance(user, messageBase))\n}\n\nasync function createTestMessages(\n api: IcureApi,\n user: User,\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n },\n propsForInaccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message[]> {\n const expectedMessages: Message[] = []\n for (let i = 0; i < 100; i++) {\n expectedMessages.push(await createMessage(api, user, propsForAccessibleMessages))\n await createMessage(api, user, propsForInaccessibleMessages)\n }\n // Also creates some messages from an unrelated hcp and same from address that should not be retrieved by the test.\n const { api: otherApi, user: otherUser } = await createNewHcpApi(env)\n for (let i = 0; i < 100; i++) {\n await createMessage(otherApi, otherUser, propsForAccessibleMessages)\n }\n return expectedMessages\n}\n\nasync function getAllPaginatedMessages(listFunction: (nextKey?: string, nextKeyDocId?: string) => Promise<PaginatedListMessage>): Promise<Message[]> {\n let latestRetrieved: PaginatedListMessage | undefined\n let allResults: Message[] = []\n do {\n const nextKey = latestRetrieved?.nextKeyPair?.startKey\n latestRetrieved = await listFunction(nextKey ? JSON.stringify(nextKey) : undefined, latestRetrieved?.nextKeyPair?.startKeyDocId)\n allResults.push(...latestRetrieved.rows!)\n } while (latestRetrieved?.nextKeyPair?.startKey !== undefined)\n console.log(JSON.stringify(allResults.map((m) => m.received)))\n return allResults\n}\n\ndescribe('CSM-243', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function doTestWithoutReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessages: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: false },\n { includeRandomReceived: false }\n )\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessages.length)\n expect(allResults.map((m) => m.id)).to.have.members(expectedMessages.map((m) => m.id))\n }\n\n async function doTestWithReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessagesWithReceived: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: true },\n { includeRandomReceived: true }\n )\n const messageWithoutReceived = await createMessage(api, user, { ...propsForAccessibleMessages, includeRandomReceived: false })\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessagesWithReceived.length + 1)\n expect(allResults.map((m) => m.id)).to.have.members([...expectedMessagesWithReceived.map((m) => m.id), messageWithoutReceived.id!])\n expect(allResults.map((m) => m.received)).to.deep.equal([\n undefined,\n ...expectedMessagesWithReceived.sort((a, b) => b.received! - a.received!).map((m) => m.received),\n ])\n }\n it('A user should be able to retrieve paginated messages without received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages without received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n})\n"]}
|
package/test/support/CSM-93.js
CHANGED
|
@@ -36,8 +36,8 @@ describe('CSM-93', function () {
|
|
|
36
36
|
});
|
|
37
37
|
});
|
|
38
38
|
it('A patient should be able retrieve existing data after give access back', function () {
|
|
39
|
-
var _a;
|
|
40
39
|
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
var _a;
|
|
41
41
|
const hcpApis = yield initApi(env, test_utils_1.hcp1Username);
|
|
42
42
|
const hcpUser = yield hcpApis.userApi.getCurrentUser();
|
|
43
43
|
const patApis = yield initApi(env, test_utils_1.patUsername);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CSM-93.js","sourceRoot":"","sources":["../../../test/support/CSM-93.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEnvironmentInitializer, hcp1Username, isLiteTest, patUsername, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { IcureApi, ShaVersion, ua2hex } from '../../icc-x-api'\nimport { webcrypto } from 'crypto'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { FilterChainMaintenanceTask } from '../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTask } from '../../icc-api/model/MaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { Service } from '../../icc-api/model/Service'\nimport { Contact } from '../../icc-api/model/Contact'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { TestCryptoStrategies } from '../utils/TestCryptoStrategies'\nimport { KeyPairUpdateRequest } from '../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { TestKeyStorage, TestStorage } from '../utils/TestStorage'\nimport initApi = TestUtils.initApi\n\nsetLocalStorage(fetch)\nchaiUse(chaiAsPromised)\n\nlet env: TestVars\n\ndescribe('CSM-93', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('A patient should be able retrieve existing data after give access back', async function () {\n const hcpApis = await initApi(env, hcp1Username)\n const hcpUser = await hcpApis.userApi.getCurrentUser()\n const patApis = await initApi(env, patUsername)\n const patUser = await patApis.userApi.getCurrentUser()\n const patientNote = 'Some secret note'\n const p2 = await hcpApis.patientApi.createPatientWithUser(\n hcpUser,\n await hcpApis.patientApi.newInstance(\n hcpUser,\n {\n firstName: 'John',\n lastName: 'Doe',\n note: patientNote,\n },\n { additionalDelegates: { [patUser.patientId!]: 'WRITE' } }\n )\n )\n await patApis.cryptoApi.forceReload()\n const heNote = 'Another secret note'\n const he = await patApis.healthcareElementApi.createHealthElementWithUser(\n patUser,\n await patApis.healthcareElementApi.newInstance(\n patUser,\n p2,\n { note: heNote },\n { additionalDelegates: { [hcpUser.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const ctcData = 'Some data'\n const ctcDescr = 'Some description'\n const ctc = await hcpApis.contactApi.createContactWithUser(\n hcpUser,\n await hcpApis.contactApi.newInstance(\n hcpUser,\n p2,\n {\n services: [new Service({ label: 'svc', content: { fr: { stringValue: ctcData } } })],\n descr: ctcDescr,\n },\n { additionalDelegates: { [patUser.patientId!]: 'WRITE' } }\n )\n )\n function checkContactDecrypted(ctc: Contact) {\n expect(ctc.services?.[0]?.content?.fr?.stringValue).to.equal(ctcData)\n expect(ctc.descr).to.equal(ctcDescr)\n }\n function checkContactEncrypted(ctc: Contact) {\n expect(ctc.services?.[0]).to.not.be.undefined\n expect(Object.keys(ctc.services![0].content ?? {})).to.be.empty\n expect(ctc.descr).to.be.undefined\n }\n expect((await hcpApis.patientApi.getPatientWithUser(hcpUser, p2.id!)).note).to.equal(patientNote)\n expect((await patApis.patientApi.getPatientWithUser(patUser, p2.id!)).note).to.equal(patientNote)\n expect((await hcpApis.healthcareElementApi.getHealthElementWithUser(hcpUser, he.id!)).note).to.equal(heNote)\n expect((await patApis.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).note).to.equal(heNote)\n checkContactDecrypted(await hcpApis.contactApi.getContactWithUser(hcpUser, ctc!.id!))\n checkContactDecrypted(await patApis.contactApi.getContactWithUser(patUser, ctc!.id!))\n const startTimestamp = new Date().getTime()\n const newPair = await patApis.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const patApisLost = await IcureApi.initialise(\n env.iCureUrl,\n { username: env.dataOwnerDetails[patUsername].user, password: env.dataOwnerDetails[patUsername].password },\n new TestCryptoStrategies(newPair),\n webcrypto as any,\n fetch,\n {\n createMaintenanceTasksOnNewKey: true,\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n if (!isLiteTest()) {\n await expect(patApisLost.patientApi.getPatientWithUser(patUser, p2.id!)).to.be.rejected\n await expect(patApisLost.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).to.be.rejected\n await expect(patApisLost.contactApi.getContactWithUser(patUser, ctc!.id!)).to.be.rejected\n }\n // The patient had to create a new aes exchange key to share the maintenance task with the hcp:\n // If you don't clear the cache of the hcp he will not be able to decrypt the maintenance task\n await hcpApis.cryptoApi.forceReload()\n const foundTasks =\n (\n await hcpApis.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcpUser,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n healthcarePartyId: hcpUser.healthcarePartyId!,\n date: startTimestamp - 1,\n }),\n })\n )\n ).rows ?? []\n expect(foundTasks.length).to.equal(1)\n const task = KeyPairUpdateRequest.fromMaintenanceTask(foundTasks[0] as MaintenanceTask)\n expect(task.concernedDataOwnerId).to.equal(patUser.patientId)\n expect(task.newPublicKey).to.equal(ua2hex(await hcpApis.cryptoApi.primitives.RSA.exportKey(newPair.publicKey, 'spki')))\n await hcpApis.icureMaintenanceTaskApi.applyKeyPairUpdate(task)\n // Clear the caches to ensure the user uses the latest version of the exchange keys with the 'give access back' data\n await patApisLost.cryptoApi.forceReload()\n expect((await patApisLost.patientApi.getPatientWithUser(patUser, p2.id!)).note).to.equal(patientNote)\n expect((await patApisLost.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).note).to.equal(heNote)\n checkContactDecrypted(await patApisLost.contactApi.getContactWithUser(patUser, ctc!.id!))\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"CSM-93.js","sourceRoot":"","sources":["../../../test/support/CSM-93.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oDAAkI;AAClI,+CAA8D;AAC9D,mCAAkC;AAClC,+BAA6C;AAC7C,4BAAyB;AACzB,+FAA2F;AAE3F,2GAAuG;AACvG,yDAAqD;AAErD,mDAAmE;AACnE,wEAAoE;AACpE,2FAAuF;AACvF,mDAAkD;AAClD,sDAAkE;AAClE,IAAO,OAAO,GAAG,sBAAS,CAAC,OAAO,CAAA;AAElC,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AACtB,IAAA,UAAO,EAAC,cAAc,CAAC,CAAA;AAEvB,IAAI,GAAa,CAAA;AAEjB,QAAQ,CAAC,QAAQ,EAAE;;QACjB,MAAM,CAAC;;gBACL,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACpB,MAAM,WAAW,GAAG,MAAM,IAAA,sCAAyB,GAAE,CAAA;gBACrD,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAA;YACpD,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,wEAAwE,EAAE;;;gBAC3E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,yBAAY,CAAC,CAAA;gBAChD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;gBACtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,wBAAW,CAAC,CAAA;gBAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;gBACtD,MAAM,WAAW,GAAG,kBAAkB,CAAA;gBACtC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,qBAAqB,CACvD,OAAO,EACP,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,CAClC,OAAO,EACP;oBACE,SAAS,EAAE,MAAM;oBACjB,QAAQ,EAAE,KAAK;oBACf,IAAI,EAAE,WAAW;iBAClB,EACD,EAAE,mBAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,SAAU,CAAC,EAAE,OAAO,EAAE,EAAE,CAC3D,CACF,CAAA;gBACD,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;gBACrC,MAAM,MAAM,GAAG,qBAAqB,CAAA;gBACpC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,2BAA2B,CACvE,OAAO,EACP,MAAM,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAC5C,OAAO,EACP,EAAE,EACF,EAAE,IAAI,EAAE,MAAM,EAAE,EAChB,EAAE,mBAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,iBAAkB,CAAC,EAAE,OAAO,EAAE,EAAE,CACnE,CACF,CAAA;gBACD,MAAM,OAAO,GAAG,WAAW,CAAA;gBAC3B,MAAM,QAAQ,GAAG,kBAAkB,CAAA;gBACnC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,qBAAqB,CACxD,OAAO,EACP,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,CAClC,OAAO,EACP,EAAE,EACF;oBACE,QAAQ,EAAE,CAAC,IAAI,iBAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;oBACpF,KAAK,EAAE,QAAQ;iBAChB,EACD,EAAE,mBAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,SAAU,CAAC,EAAE,OAAO,EAAE,EAAE,CAC3D,CACF,CAAA;gBACD,SAAS,qBAAqB,CAAC,GAAY;;oBACzC,IAAA,aAAM,EAAC,MAAA,MAAA,MAAA,MAAA,GAAG,CAAC,QAAQ,0CAAG,CAAC,CAAC,0CAAE,OAAO,0CAAE,EAAE,0CAAE,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;oBACrE,IAAA,aAAM,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACtC,CAAC;gBACD,SAAS,qBAAqB,CAAC,GAAY;;oBACzC,IAAA,aAAM,EAAC,MAAA,GAAG,CAAC,QAAQ,0CAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;oBAC7C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,GAAG,CAAC,QAAS,CAAC,CAAC,CAAC,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAA;oBAC/D,IAAA,aAAM,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;gBACnC,CAAC;gBACD,IAAA,aAAM,EAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;gBACjG,IAAA,aAAM,EAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;gBACjG,IAAA,aAAM,EAAC,CAAC,MAAM,OAAO,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC5G,IAAA,aAAM,EAAC,CAAC,MAAM,OAAO,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC5G,qBAAqB,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAI,CAAC,EAAG,CAAC,CAAC,CAAA;gBACrF,qBAAqB,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAI,CAAC,EAAG,CAAC,CAAC,CAAA;gBACrF,MAAM,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;gBAC3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACzF,MAAM,WAAW,GAAG,MAAM,oBAAQ,CAAC,UAAU,CAC3C,GAAG,CAAC,QAAQ,EACZ,EAAE,QAAQ,EAAE,GAAG,CAAC,gBAAgB,CAAC,wBAAW,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,gBAAgB,CAAC,wBAAW,CAAC,CAAC,QAAQ,EAAE,EAC1G,IAAI,2CAAoB,CAAC,OAAO,CAAC,EACjC,kBAAgB,EAChB,KAAK,EACL;oBACE,8BAA8B,EAAE,IAAI;oBACpC,OAAO,EAAE,IAAI,yBAAW,EAAE;oBAC1B,UAAU,EAAE,IAAI,4BAAc,EAAE;iBACjC,CACF,CAAA;gBACD,IAAI,CAAC,IAAA,uBAAU,GAAE,EAAE,CAAC;oBAClB,MAAM,IAAA,aAAM,EAAC,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAA;oBACvF,MAAM,IAAA,aAAM,EAAC,WAAW,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAA;oBACvG,MAAM,IAAA,aAAM,EAAC,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAI,CAAC,EAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAA;gBAC3F,CAAC;gBACD,+FAA+F;gBAC/F,8FAA8F;gBAC9F,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;gBACrC,MAAM,UAAU,GACd,MAAA,CACE,MAAM,OAAO,CAAC,kBAAkB,CAAC,gCAAgC,CAC/D,OAAO,EACP,SAAS,EACT,SAAS,EACT,IAAI,uDAA0B,CAAC;oBAC7B,MAAM,EAAE,IAAI,+DAA8B,CAAC;wBACzC,iBAAiB,EAAE,OAAO,CAAC,iBAAkB;wBAC7C,IAAI,EAAE,cAAc,GAAG,CAAC;qBACzB,CAAC;iBACH,CAAC,CACH,CACF,CAAC,IAAI,mCAAI,EAAE,CAAA;gBACd,IAAA,aAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACrC,MAAM,IAAI,GAAG,2CAAoB,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAoB,CAAC,CAAA;gBACvF,IAAA,aAAM,EAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;gBAC7D,IAAA,aAAM,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAA,kBAAM,EAAC,MAAM,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;gBACvH,MAAM,OAAO,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;gBAC9D,oHAAoH;gBACpH,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;gBACzC,IAAA,aAAM,EAAC,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;gBACrG,IAAA,aAAM,EAAC,CAAC,MAAM,WAAW,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,OAAO,EAAE,EAAE,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAChH,qBAAqB,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAI,CAAC,EAAG,CAAC,CAAC,CAAA;YAC3F,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC;CAAA,CAAC,CAAA","sourcesContent":["import { getEnvironmentInitializer, hcp1Username, isLiteTest, patUsername, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { IcureApi, ShaVersion, ua2hex } from '../../icc-x-api'\nimport { webcrypto } from 'crypto'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { FilterChainMaintenanceTask } from '../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTask } from '../../icc-api/model/MaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { Service } from '../../icc-api/model/Service'\nimport { Contact } from '../../icc-api/model/Contact'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { TestCryptoStrategies } from '../utils/TestCryptoStrategies'\nimport { KeyPairUpdateRequest } from '../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { TestKeyStorage, TestStorage } from '../utils/TestStorage'\nimport initApi = TestUtils.initApi\n\nsetLocalStorage(fetch)\nchaiUse(chaiAsPromised)\n\nlet env: TestVars\n\ndescribe('CSM-93', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('A patient should be able retrieve existing data after give access back', async function () {\n const hcpApis = await initApi(env, hcp1Username)\n const hcpUser = await hcpApis.userApi.getCurrentUser()\n const patApis = await initApi(env, patUsername)\n const patUser = await patApis.userApi.getCurrentUser()\n const patientNote = 'Some secret note'\n const p2 = await hcpApis.patientApi.createPatientWithUser(\n hcpUser,\n await hcpApis.patientApi.newInstance(\n hcpUser,\n {\n firstName: 'John',\n lastName: 'Doe',\n note: patientNote,\n },\n { additionalDelegates: { [patUser.patientId!]: 'WRITE' } }\n )\n )\n await patApis.cryptoApi.forceReload()\n const heNote = 'Another secret note'\n const he = await patApis.healthcareElementApi.createHealthElementWithUser(\n patUser,\n await patApis.healthcareElementApi.newInstance(\n patUser,\n p2,\n { note: heNote },\n { additionalDelegates: { [hcpUser.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const ctcData = 'Some data'\n const ctcDescr = 'Some description'\n const ctc = await hcpApis.contactApi.createContactWithUser(\n hcpUser,\n await hcpApis.contactApi.newInstance(\n hcpUser,\n p2,\n {\n services: [new Service({ label: 'svc', content: { fr: { stringValue: ctcData } } })],\n descr: ctcDescr,\n },\n { additionalDelegates: { [patUser.patientId!]: 'WRITE' } }\n )\n )\n function checkContactDecrypted(ctc: Contact) {\n expect(ctc.services?.[0]?.content?.fr?.stringValue).to.equal(ctcData)\n expect(ctc.descr).to.equal(ctcDescr)\n }\n function checkContactEncrypted(ctc: Contact) {\n expect(ctc.services?.[0]).to.not.be.undefined\n expect(Object.keys(ctc.services![0].content ?? {})).to.be.empty\n expect(ctc.descr).to.be.undefined\n }\n expect((await hcpApis.patientApi.getPatientWithUser(hcpUser, p2.id!)).note).to.equal(patientNote)\n expect((await patApis.patientApi.getPatientWithUser(patUser, p2.id!)).note).to.equal(patientNote)\n expect((await hcpApis.healthcareElementApi.getHealthElementWithUser(hcpUser, he.id!)).note).to.equal(heNote)\n expect((await patApis.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).note).to.equal(heNote)\n checkContactDecrypted(await hcpApis.contactApi.getContactWithUser(hcpUser, ctc!.id!))\n checkContactDecrypted(await patApis.contactApi.getContactWithUser(patUser, ctc!.id!))\n const startTimestamp = new Date().getTime()\n const newPair = await patApis.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const patApisLost = await IcureApi.initialise(\n env.iCureUrl,\n { username: env.dataOwnerDetails[patUsername].user, password: env.dataOwnerDetails[patUsername].password },\n new TestCryptoStrategies(newPair),\n webcrypto as any,\n fetch,\n {\n createMaintenanceTasksOnNewKey: true,\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n if (!isLiteTest()) {\n await expect(patApisLost.patientApi.getPatientWithUser(patUser, p2.id!)).to.be.rejected\n await expect(patApisLost.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).to.be.rejected\n await expect(patApisLost.contactApi.getContactWithUser(patUser, ctc!.id!)).to.be.rejected\n }\n // The patient had to create a new aes exchange key to share the maintenance task with the hcp:\n // If you don't clear the cache of the hcp he will not be able to decrypt the maintenance task\n await hcpApis.cryptoApi.forceReload()\n const foundTasks =\n (\n await hcpApis.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcpUser,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n healthcarePartyId: hcpUser.healthcarePartyId!,\n date: startTimestamp - 1,\n }),\n })\n )\n ).rows ?? []\n expect(foundTasks.length).to.equal(1)\n const task = KeyPairUpdateRequest.fromMaintenanceTask(foundTasks[0] as MaintenanceTask)\n expect(task.concernedDataOwnerId).to.equal(patUser.patientId)\n expect(task.newPublicKey).to.equal(ua2hex(await hcpApis.cryptoApi.primitives.RSA.exportKey(newPair.publicKey, 'spki')))\n await hcpApis.icureMaintenanceTaskApi.applyKeyPairUpdate(task)\n // Clear the caches to ensure the user uses the latest version of the exchange keys with the 'give access back' data\n await patApisLost.cryptoApi.forceReload()\n expect((await patApisLost.patientApi.getPatientWithUser(patUser, p2.id!)).note).to.equal(patientNote)\n expect((await patApisLost.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).note).to.equal(heNote)\n checkContactDecrypted(await patApisLost.contactApi.getContactWithUser(patUser, ctc!.id!))\n })\n})\n"]}
|