@dashevo/wasm-dpp 0.24.0-dev.12 → 0.24.0-dev.14
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/.mocharc.yml +1 -1
- package/Cargo.toml +5 -2
- package/README.md +5 -1
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +9 -0
- package/dist/wasm/wasm_dpp.d.ts +3397 -1237
- package/karma.conf.js +5 -0
- package/lib/identifier/patchIdentifier.ts +5 -4
- package/lib/index.ts +1 -1
- package/lib/test/bootstrap.js +5 -0
- package/lib/test/fixtures/getDataContractFixture.js +267 -0
- package/lib/test/fixtures/getDocumentsFixture.js +43 -0
- package/lib/test/mocks/createStateRepositoryMock.js +64 -0
- package/lib/test/mocks/getBlsAdapterMock.js +51 -0
- package/package.json +11 -8
- package/src/bls_adapter.rs +17 -1
- package/src/buffer.rs +3 -0
- package/src/dash_platform_protocol.rs +107 -10
- package/src/data_contract/data_contract.rs +59 -10
- package/src/data_contract/data_contract_facade.rs +128 -0
- package/src/data_contract/errors/invalid_data_contract.rs +16 -16
- package/src/data_contract/errors/invalid_document_type.rs +8 -8
- package/src/data_contract/errors/mod.rs +10 -16
- package/src/data_contract/index.rs +56 -1
- package/src/data_contract/mod.rs +4 -0
- package/src/data_contract/state_transition/data_contract_create_transition/apply.rs +1 -1
- package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +41 -10
- package/src/data_contract/state_transition/data_contract_create_transition/validation.rs +35 -4
- package/src/data_contract/state_transition/data_contract_update_transition/apply.rs +1 -1
- package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +20 -7
- package/src/data_contract/state_transition/data_contract_update_transition/validation.rs +47 -11
- package/src/data_contract_factory/data_contract_factory.rs +19 -17
- package/src/data_trigger/data_trigger_execution_context.rs +95 -0
- package/src/data_trigger/data_trigger_execution_result.rs +48 -0
- package/src/data_trigger/execute_data_triggers_factory.rs +60 -0
- package/src/data_trigger/get_data_triggers_factory.rs +65 -0
- package/src/data_trigger/mod.rs +121 -0
- package/src/document/document_facade.rs +125 -0
- package/src/document/errors/invalid_document_error.rs +10 -9
- package/src/document/errors/invalid_initial_revision_error.rs +1 -1
- package/src/document/errors/mismatch_owners_ids_error.rs +14 -4
- package/src/document/errors/mod.rs +17 -13
- package/src/document/errors/no_documents_supplied_error.rs +4 -4
- package/src/document/factory.rs +257 -0
- package/src/document/fetch_and_validate_data_contract.rs +77 -0
- package/src/document/generate_document_id.rs +17 -0
- package/src/document/mod.rs +311 -37
- package/src/document/state_transition/document_batch_transition/apply_document_batch_transition.rs +22 -0
- package/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +253 -1
- package/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs +60 -1
- package/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +263 -0
- package/src/document/state_transition/document_batch_transition/document_transition/mod.rs +302 -3
- package/src/document/state_transition/document_batch_transition/mod.rs +378 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_id.rs +40 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_indices.rs +50 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/mod.rs +8 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +34 -0
- package/src/document/state_transition/document_batch_transition/validation/basic/validate_partial_compound_indices.rs +39 -0
- package/src/document/state_transition/document_batch_transition/validation/mod.rs +2 -0
- package/src/document/state_transition/document_batch_transition/validation/state/fetch_documents.rs +43 -0
- package/src/document/state_transition/document_batch_transition/validation/state/mod.rs +3 -0
- package/src/document/state_transition/document_batch_transition/validation/state/validate_documents_batch_transitions_state.rs +27 -0
- package/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs +47 -0
- package/src/document/validator.rs +52 -0
- package/src/errors/compatible_protocol_version_is_not_defined_error.rs +24 -0
- package/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +1 -1
- package/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +1 -1
- package/src/errors/consensus/basic/document/inconsistent_compound_index_data_error.rs +2 -2
- package/src/errors/consensus/basic/document/invalid_document_type_error.rs +15 -1
- package/src/errors/consensus/basic/document/missing_data_contract_id_error.rs +16 -2
- package/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +1 -1
- package/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +1 -1
- package/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +6 -2
- package/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +5 -2
- package/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +3 -3
- package/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs +2 -2
- package/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_pooling_error.rs +29 -0
- package/src/errors/consensus/basic/identity/invalid_identity_key_signature_error.rs +4 -3
- package/src/errors/consensus/basic/identity/invalid_identity_public_key_data_error.rs +1 -1
- package/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +1 -1
- package/src/errors/consensus/basic/identity/missing_public_key_error.rs +4 -3
- package/src/errors/consensus/basic/identity/mod.rs +2 -0
- package/src/errors/consensus/basic/invalid_identifier_error.rs +1 -1
- package/src/errors/consensus/basic/json_schema_error.rs +8 -2
- package/src/errors/consensus/basic/public_key_is_disabled_error.rs +1 -1
- package/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs +9 -9
- package/src/errors/consensus/state/document/invalid_document_revision_error.rs +4 -4
- package/src/errors/consensus/state/identity/duplicated_identity_public_key_id_state_error.rs +35 -0
- package/src/errors/consensus/state/identity/duplicated_identity_public_key_state_error.rs +34 -0
- package/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs +10 -7
- package/src/errors/consensus/state/identity/identity_public_key_is_disabled_error.rs +2 -3
- package/src/errors/consensus/state/identity/identity_public_key_is_read_only_error.rs +7 -3
- package/src/errors/consensus/state/identity/invalid_identity_public_key_id_error.rs +2 -3
- package/src/errors/consensus/state/identity/invalid_identity_revision_error.rs +7 -4
- package/src/errors/consensus/state/identity/max_identity_public_key_limit_reached_error.rs +2 -1
- package/src/errors/consensus/state/identity/mod.rs +4 -0
- package/src/errors/consensus_error.rs +218 -268
- package/src/errors/data_contract_not_present_error.rs +23 -0
- package/src/errors/dpp_error.rs +17 -0
- package/src/errors/from.rs +22 -0
- package/src/errors/js_conversion.rs +52 -5
- package/src/errors/mod.rs +6 -0
- package/src/errors/protocol_error.rs +14 -3
- package/src/identifier/errors.rs +30 -0
- package/src/identifier/mod.rs +95 -11
- package/src/identity/errors/asset_lock_output_not_found_error.rs +11 -0
- package/src/identity/errors/asset_lock_transaction_is_not_found_error.rs +20 -0
- package/src/identity/errors/invalid_identity_error.rs +32 -0
- package/src/identity/errors/mod.rs +9 -0
- package/src/identity/errors/unknown_asset_lock_proof_type_error.rs +26 -0
- package/src/identity/factory_utils.rs +87 -0
- package/src/identity/identity_facade.rs +194 -20
- package/src/identity/identity_factory.rs +209 -0
- package/src/identity/identity_public_key/mod.rs +51 -40
- package/src/identity/mod.rs +31 -17
- package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +132 -0
- package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +72 -0
- package/src/identity/state_transition/asset_lock_proof/chain/mod.rs +4 -0
- package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +177 -0
- package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +72 -0
- package/src/identity/state_transition/asset_lock_proof/instant/mod.rs +4 -0
- package/src/identity/state_transition/asset_lock_proof/mod.rs +269 -0
- package/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs +26 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +337 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs +153 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +37 -0
- package/src/identity/state_transition/identity_create_transition/mod.rs +8 -0
- package/src/identity/state_transition/identity_create_transition/to_object.rs +45 -0
- package/src/identity/state_transition/identity_public_key_transitions.rs +207 -0
- package/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +31 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +278 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_basic_validator.rs +113 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +37 -0
- package/src/identity/state_transition/identity_topup_transition/mod.rs +8 -0
- package/src/identity/state_transition/identity_topup_transition/to_object.rs +42 -0
- package/src/identity/state_transition/identity_update_transition/apply_identity_update_transition.rs +24 -0
- package/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs +55 -0
- package/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +448 -0
- package/src/identity/state_transition/identity_update_transition/identity_update_transition_basic_validator.rs +94 -0
- package/src/identity/state_transition/identity_update_transition/identity_update_transition_state_validator.rs +53 -0
- package/src/identity/state_transition/identity_update_transition/mod.rs +9 -0
- package/src/identity/state_transition/identity_update_transition/to_object.rs +66 -0
- package/src/identity/state_transition/mod.rs +12 -0
- package/src/identity/state_transition/validate_public_key_signatures.rs +61 -0
- package/src/identity/validation/identity_validator.rs +50 -0
- package/src/identity/validation/mod.rs +2 -0
- package/src/identity/validation/public_keys_validator.rs +14 -13
- package/src/identity_public_key/public_keys_validator.rs +44 -0
- package/src/lib.rs +6 -0
- package/src/lodash.rs +7 -0
- package/src/metadata.rs +54 -10
- package/src/state_repository.rs +598 -101
- package/src/state_transition/conversion.rs +104 -0
- package/src/state_transition/errors/invalid_state_transition_error.rs +32 -0
- package/src/state_transition/errors/mod.rs +1 -0
- package/src/state_transition/mod.rs +46 -0
- package/src/state_transition/state_transition_facade.rs +263 -0
- package/src/state_transition/state_transition_factory.rs +216 -0
- package/src/state_transition/validation/mod.rs +1 -0
- package/src/state_transition/validation/validate_state_transition_key_signature.rs +62 -0
- package/src/utils.rs +210 -8
- package/src/validation/json_schema_validator.rs +41 -0
- package/src/validation/mod.rs +2 -0
- package/src/validation/validation_result.rs +29 -5
- package/src/version/mod.rs +2 -0
- package/src/version/protocol_version.rs +103 -0
- package/test/integration/dataContract/DataContractFacade.spec.js +46 -30
- package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +45 -127
- package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +91 -139
- package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +577 -503
- package/test/integration/document/Document.spec.js +55 -29
- package/test/integration/document/DocumentFacade.spec.js +51 -64
- package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +38 -16
- package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +341 -396
- package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +116 -218
- package/test/integration/document/validation/validateDocumentFactory.spec.js +123 -171
- package/test/integration/identity/IdentityFacade.spec.js +52 -27
- package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +185 -164
- package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +84 -114
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +120 -137
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +106 -91
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +50 -16
- package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +78 -86
- package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +74 -30
- package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +93 -147
- package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +65 -77
- package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +60 -23
- package/test/integration/identity/validation/validateIdentityFactory.spec.js +46 -114
- package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +9 -3
- package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +12 -8
- package/test/integration/stateTransition/StateTransitionFacade.spec.js +95 -233
- package/test/integration/stateTransition/calculateStateTransitionFeeFromOperationsFactory.spec.js +53 -0
- package/test/unit/Identifier.spec.js +36 -36
- package/test/unit/Metadata.spec.js +17 -3
- package/test/unit/dataContract/DataContract.spec.js +9 -4
- package/test/unit/dataContract/createDataContract.spec.js +0 -1
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +3 -3
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +1 -1
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +2 -2
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +3 -3
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +1 -1
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +25 -31
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +3 -3
- package/test/unit/dataTrigger/rewardShareDataTriggers/createMasternodeRewardSharesDataTrigger.spec.js +2 -0
- package/test/unit/decodeProtocolEntityFactory.spec.js +2 -2
- package/test/unit/document/Document.spec.js +147 -155
- package/test/unit/document/DocumentFactory.spec.js +153 -153
- package/test/unit/document/fetchAndValidateDataContractFactory.spec.js +59 -14
- package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +131 -62
- package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +144 -56
- package/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js +38 -8
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +11 -7
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js +29 -18
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js +38 -29
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js +53 -91
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +357 -493
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +133 -72
- package/test/unit/identity/Identity.spec.js +26 -9
- package/test/unit/identity/IdentityFactory.spec.js +81 -89
- package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +73 -30
- package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +38 -38
- package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +34 -25
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +36 -16
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +85 -50
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +24 -6
- package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +44 -22
- package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +58 -103
- package/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +63 -0
- package/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +90 -0
- package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +18 -3
- package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +38 -11
- package/test/unit/stateTransition/StateTransitionFactory.spec.js +49 -101
- package/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +23 -25
- package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +73 -46
- package/test/unit/version/validateProtocolVersionFactory.spec.js +45 -27
- package/wasm/package.json +5 -0
- package/wasm/wasm_dpp.d.ts +3397 -1237
- package/wasm/wasm_dpp.js +7158 -1384
- package/wasm/wasm_dpp_bg.js +1 -1
- package/wasm/wasm_dpp_bg.wasm +0 -0
- package/wasm/wasm_dpp_bg.wasm.d.ts +777 -389
- package/webpack.config.js +9 -0
- package/src/document/state_transition/document_batch_transition/document_transition/document_update_transition.rs +0 -22
- package/test/integration/stateTransition/calculateStateTransitionFeeFactory.spec.js +0 -135
- package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +0 -54
|
@@ -1,73 +1,102 @@
|
|
|
1
1
|
const bs58 = require('bs58');
|
|
2
2
|
|
|
3
|
-
const Document = require('@dashevo/dpp/lib/document/Document');
|
|
4
|
-
|
|
5
3
|
const DocumentCreateTransition = require('@dashevo/dpp/lib/document/stateTransition/DocumentsBatchTransition/documentTransition/DocumentCreateTransition');
|
|
6
|
-
|
|
7
4
|
const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture');
|
|
8
5
|
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
9
|
-
const getDocumentTransitionsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentTransitionsFixture');
|
|
10
|
-
|
|
11
6
|
const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult');
|
|
7
|
+
const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock');
|
|
8
|
+
const DocumentFactoryJS = require('@dashevo/dpp/lib/document/DocumentFactory');
|
|
12
9
|
|
|
13
|
-
const
|
|
10
|
+
const createStateRepositoryMock = require('../../../lib/test/mocks/createStateRepositoryMock');
|
|
11
|
+
const generateRandomIdentifierAsync = require('../../../lib/test/utils/generateRandomIdentifierAsync');
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const SerializedObjectParsingError = require('@dashevo/dpp/lib/errors/consensus/basic/decode/SerializedObjectParsingError');
|
|
13
|
+
let {
|
|
14
|
+
Identifier, DocumentFactory, DataContract, Document, DocumentValidator, ProtocolVersionValidator,
|
|
15
|
+
InvalidDocumentTypeInDataContractError, InvalidDocumentError, JsonSchemaError,
|
|
16
|
+
NoDocumentsSuppliedError, MismatchOwnerIdsError, InvalidInitialRevisionError,
|
|
17
|
+
InvalidActionNameError,
|
|
18
|
+
} = require('../../..');
|
|
22
19
|
|
|
23
|
-
const
|
|
24
|
-
const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock');
|
|
25
|
-
const SomeConsensusError = require('@dashevo/dpp/lib/test/mocks/SomeConsensusError');
|
|
26
|
-
const entropyGenerator = require('@dashevo/dpp/lib/util/entropyGenerator');
|
|
27
|
-
const DocumentFactory = require('@dashevo/dpp/lib/document/DocumentFactory');
|
|
20
|
+
const { default: loadWasmDpp } = require('../../..');
|
|
28
21
|
|
|
29
22
|
describe('DocumentFactory', () => {
|
|
30
23
|
let decodeProtocolEntityMock;
|
|
31
|
-
let generateEntropyMock;
|
|
32
24
|
let validateDocumentMock;
|
|
33
25
|
let fetchAndValidateDataContractMock;
|
|
26
|
+
let stateRepositoryMock;
|
|
27
|
+
let ownerIdJs;
|
|
34
28
|
let ownerId;
|
|
35
29
|
let dataContract;
|
|
30
|
+
let dataContractJs;
|
|
36
31
|
let document;
|
|
32
|
+
let documentJs;
|
|
33
|
+
let documentsJs;
|
|
37
34
|
let documents;
|
|
38
35
|
let rawDocument;
|
|
36
|
+
let rawDocumentJs;
|
|
37
|
+
let factoryJs;
|
|
39
38
|
let factory;
|
|
40
39
|
let fakeTime;
|
|
41
40
|
let fakeTimeDate;
|
|
42
|
-
let entropy;
|
|
43
41
|
let dppMock;
|
|
42
|
+
let dataContractId;
|
|
43
|
+
let documentValidator;
|
|
44
|
+
|
|
45
|
+
beforeEach(async () => {
|
|
46
|
+
({
|
|
47
|
+
Identifier, ProtocolVersionValidator, DocumentValidator, DocumentFactory,
|
|
48
|
+
DataContract, Document,
|
|
49
|
+
// Errors:
|
|
50
|
+
InvalidDocumentTypeInDataContractError,
|
|
51
|
+
InvalidDocumentError,
|
|
52
|
+
JsonSchemaError,
|
|
53
|
+
NoDocumentsSuppliedError,
|
|
54
|
+
MismatchOwnerIdsError,
|
|
55
|
+
InvalidInitialRevisionError,
|
|
56
|
+
InvalidActionNameError,
|
|
57
|
+
} = await loadWasmDpp());
|
|
58
|
+
});
|
|
44
59
|
|
|
45
60
|
beforeEach(function beforeEach() {
|
|
46
|
-
|
|
47
|
-
|
|
61
|
+
const protocolValidator = new ProtocolVersionValidator();
|
|
62
|
+
documentValidator = new DocumentValidator(protocolValidator);
|
|
63
|
+
|
|
64
|
+
({ ownerId: ownerIdJs } = getDocumentsFixture);
|
|
65
|
+
ownerId = Identifier.from(ownerIdJs);
|
|
66
|
+
|
|
67
|
+
dataContractJs = getDataContractFixture();
|
|
68
|
+
dataContract = DataContract.fromBuffer(dataContractJs.toBuffer());
|
|
69
|
+
const dc = DataContract.fromBuffer(dataContractJs.toBuffer());
|
|
70
|
+
dataContractId = dataContractJs.getId().toBuffer();
|
|
71
|
+
|
|
72
|
+
documentsJs = getDocumentsFixture(dataContractJs);
|
|
73
|
+
documents = documentsJs.map((d) => {
|
|
74
|
+
const doc = new Document(d.toObject(), dataContract);
|
|
75
|
+
doc.setEntropy(d.entropy);
|
|
76
|
+
return doc;
|
|
77
|
+
});
|
|
48
78
|
|
|
49
|
-
|
|
50
|
-
|
|
79
|
+
([, , , documentJs] = documentsJs);
|
|
80
|
+
rawDocumentJs = documentJs.toObject();
|
|
81
|
+
([, , , document] = documents);
|
|
51
82
|
rawDocument = document.toObject();
|
|
52
83
|
|
|
53
84
|
decodeProtocolEntityMock = this.sinonSandbox.stub();
|
|
54
|
-
generateEntropyMock = this.sinonSandbox.stub(entropyGenerator, 'generate');
|
|
55
85
|
validateDocumentMock = this.sinonSandbox.stub();
|
|
56
86
|
|
|
57
87
|
validateDocumentMock.returns(new ValidationResult());
|
|
58
88
|
|
|
59
|
-
entropy = bs58.decode('789');
|
|
60
|
-
|
|
61
|
-
generateEntropyMock.returns(entropy);
|
|
62
|
-
|
|
63
89
|
const fetchContractResult = new ValidationResult();
|
|
64
|
-
fetchContractResult.setData(
|
|
90
|
+
fetchContractResult.setData(dataContractJs);
|
|
65
91
|
|
|
66
|
-
|
|
92
|
+
stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
|
|
93
|
+
stateRepositoryMock.fetchDataContract.resolves(dc);
|
|
67
94
|
|
|
95
|
+
fetchAndValidateDataContractMock = this.sinonSandbox.stub().returns(fetchContractResult);
|
|
68
96
|
dppMock = createDPPMock();
|
|
69
97
|
|
|
70
|
-
factory = new DocumentFactory(
|
|
98
|
+
factory = new DocumentFactory(1, documentValidator, stateRepositoryMock);
|
|
99
|
+
factoryJs = new DocumentFactoryJS(
|
|
71
100
|
dppMock,
|
|
72
101
|
validateDocumentMock,
|
|
73
102
|
fetchAndValidateDataContractMock,
|
|
@@ -80,67 +109,70 @@ describe('DocumentFactory', () => {
|
|
|
80
109
|
|
|
81
110
|
afterEach(() => {
|
|
82
111
|
fakeTime.reset();
|
|
83
|
-
generateEntropyMock.restore();
|
|
84
112
|
});
|
|
85
113
|
|
|
86
114
|
describe('create', () => {
|
|
87
115
|
it('should return new Document with specified type and data', () => {
|
|
116
|
+
// NiceDocument is used instead of IndexedDocument, because the NiceDocument
|
|
117
|
+
// should be valid for this test and it passes the DataContract validation.
|
|
118
|
+
// The previous version of test passed due to the fact that
|
|
119
|
+
// the mocked DataContract validator always returned true.
|
|
120
|
+
const [niceDocument] = documentsJs;
|
|
121
|
+
|
|
122
|
+
const newRawDocument = niceDocument.toObject();
|
|
88
123
|
const contractId = bs58.decode('FQco85WbwNgb5ix8QQAH6wurMcgEC5ENSCv5ixG9cj12');
|
|
89
124
|
const name = 'Cutie';
|
|
90
125
|
|
|
91
|
-
|
|
92
|
-
|
|
126
|
+
ownerIdJs = bs58.decode('5zcXZpTLWFwZjKjq3ME5KVavtZa9YUaZESVzrndehBhq');
|
|
127
|
+
ownerId = Identifier.from(ownerIdJs);
|
|
128
|
+
|
|
129
|
+
dataContract.setId(Identifier.from(contractId));
|
|
93
130
|
|
|
94
131
|
const newDocument = factory.create(
|
|
95
132
|
dataContract,
|
|
96
|
-
|
|
97
|
-
|
|
133
|
+
ownerIdJs,
|
|
134
|
+
newRawDocument.$type,
|
|
98
135
|
{ name },
|
|
99
136
|
);
|
|
100
137
|
|
|
101
138
|
expect(newDocument).to.be.an.instanceOf(Document);
|
|
102
139
|
|
|
103
|
-
expect(newDocument.getType()).to.equal(
|
|
140
|
+
expect(newDocument.getType()).to.equal(newRawDocument.$type);
|
|
104
141
|
|
|
105
142
|
expect(newDocument.get('name')).to.equal(name);
|
|
106
143
|
|
|
107
144
|
expect(newDocument.getDataContractId().toBuffer()).to.deep.equal(contractId);
|
|
108
|
-
expect(newDocument.getOwnerId().toBuffer()).to.deep.equal(ownerId);
|
|
109
145
|
|
|
110
|
-
expect(
|
|
111
|
-
expect(newDocument.getEntropy()).to.deep.equal(entropy);
|
|
146
|
+
expect(newDocument.getOwnerId().toBuffer()).to.deep.equal(ownerIdJs);
|
|
112
147
|
|
|
113
148
|
expect(newDocument.getRevision()).to.equal(DocumentCreateTransition.INITIAL_REVISION);
|
|
114
149
|
|
|
115
|
-
|
|
150
|
+
// in case of rust version, it is impossible to test the ID, because the ID
|
|
151
|
+
// is generated based on entropy generator which generates different output
|
|
152
|
+
// every time and it cannot be mocked. ID generation should be verified
|
|
153
|
+
// in a true unit test. Not here.
|
|
154
|
+
expect(newDocument.getEntropy()).not.to.deep.be.equal(Buffer.alloc(32));
|
|
116
155
|
|
|
117
|
-
expect(newDocument.getCreatedAt()
|
|
118
|
-
expect(newDocument.getCreatedAt().getTime()).to.equal(newDocument.getUpdatedAt().getTime());
|
|
156
|
+
expect(newDocument.getCreatedAt()).to.be.an('number');
|
|
119
157
|
});
|
|
120
158
|
|
|
121
159
|
it('should throw an error if type is not defined', () => {
|
|
122
160
|
const type = 'wrong';
|
|
123
161
|
|
|
124
162
|
try {
|
|
125
|
-
factory.create(dataContract, ownerId, type);
|
|
163
|
+
factory.create(dataContract, ownerId, type, {});
|
|
126
164
|
|
|
127
165
|
expect.fail('InvalidDocumentTypeError should be thrown');
|
|
128
166
|
} catch (e) {
|
|
129
|
-
expect(e).to.be.an.instanceOf(
|
|
167
|
+
expect(e).to.be.an.instanceOf(InvalidDocumentTypeInDataContractError);
|
|
130
168
|
expect(e.getType()).to.equal(type);
|
|
131
|
-
expect(e.
|
|
169
|
+
expect(e.getDataContractId().toBuffer()).to.deep.equal(dataContractId);
|
|
132
170
|
}
|
|
133
171
|
});
|
|
134
172
|
|
|
135
|
-
it('should throw an error if validation
|
|
136
|
-
const error = new Error('validation failed');
|
|
137
|
-
const validationResult = new ValidationResult();
|
|
138
|
-
validationResult.addError(error);
|
|
139
|
-
|
|
140
|
-
validateDocumentMock.returns(validationResult);
|
|
141
|
-
|
|
173
|
+
it('should throw an error if validation failed', () => {
|
|
142
174
|
try {
|
|
143
|
-
factory.create(dataContract, ownerId,
|
|
175
|
+
factory.create(dataContract, ownerId, rawDocumentJs.$type, {});
|
|
144
176
|
|
|
145
177
|
expect.fail('InvalidDocumentError should be thrown');
|
|
146
178
|
} catch (e) {
|
|
@@ -151,45 +183,25 @@ describe('DocumentFactory', () => {
|
|
|
151
183
|
|
|
152
184
|
describe('createFromObject', () => {
|
|
153
185
|
it('should return new Data Contract with data from passed object', async () => {
|
|
154
|
-
validateDocumentMock.returns(new ValidationResult());
|
|
155
|
-
|
|
156
186
|
const result = await factory.createFromObject(rawDocument);
|
|
157
187
|
|
|
158
188
|
expect(result).to.be.an.instanceOf(Document);
|
|
159
189
|
expect(result.toObject()).to.deep.equal(document.toObject());
|
|
160
190
|
|
|
161
|
-
expect(
|
|
162
|
-
|
|
163
|
-
expect(validateDocumentMock).to.have.been.calledOnceWithExactly(
|
|
164
|
-
rawDocument, dataContract,
|
|
165
|
-
);
|
|
191
|
+
expect(stateRepositoryMock.fetchDataContract).to.have.been.calledOnce();
|
|
166
192
|
});
|
|
167
193
|
|
|
168
|
-
it('should return new Document without validation if "skipValidation" option is passed', async
|
|
169
|
-
|
|
170
|
-
isValid: () => true,
|
|
171
|
-
merge: this.sinonSandbox.stub(),
|
|
172
|
-
getData: () => getDataContractFixture(),
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
fetchAndValidateDataContractMock.resolves(resultMock);
|
|
176
|
-
|
|
194
|
+
it('should return new Document without validation if "skipValidation" option is passed - Rust', async () => {
|
|
195
|
+
delete rawDocument.lastName;
|
|
177
196
|
const result = await factory.createFromObject(rawDocument, { skipValidation: true });
|
|
178
|
-
|
|
179
197
|
expect(result).to.be.an.instanceOf(Document);
|
|
180
|
-
expect(result.toObject()).to.deep.equal(document.toObject());
|
|
181
198
|
|
|
182
|
-
expect(
|
|
183
|
-
expect(
|
|
184
|
-
expect(resultMock.merge).to.have.not.been.called();
|
|
199
|
+
expect(result.toObject()).to.deep.equal(rawDocument);
|
|
200
|
+
expect(stateRepositoryMock.fetchDataContract).to.have.been.calledOnce();
|
|
185
201
|
});
|
|
186
202
|
|
|
187
203
|
it('should throw InvalidDocumentError if passed object is not valid', async () => {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
validateDocumentMock.returns(
|
|
191
|
-
new ValidationResult([validationError]),
|
|
192
|
-
);
|
|
204
|
+
delete rawDocument.lastName;
|
|
193
205
|
|
|
194
206
|
try {
|
|
195
207
|
await factory.createFromObject(rawDocument);
|
|
@@ -197,41 +209,44 @@ describe('DocumentFactory', () => {
|
|
|
197
209
|
expect.fail('InvalidDocumentError should be thrown');
|
|
198
210
|
} catch (e) {
|
|
199
211
|
expect(e).to.be.an.instanceOf(InvalidDocumentError);
|
|
200
|
-
|
|
201
212
|
expect(e.getErrors()).to.have.length(1);
|
|
202
|
-
expect(e.getRawDocument()).to.equal(rawDocument);
|
|
203
213
|
|
|
204
|
-
|
|
205
|
-
|
|
214
|
+
// Identifiers don't survive conversion back and forth unless done through
|
|
215
|
+
// a Document constructor
|
|
216
|
+
const rawDocumentFromError = e.getRawDocument();
|
|
217
|
+
rawDocumentFromError.$id = Buffer.from(rawDocumentFromError.$id);
|
|
218
|
+
rawDocumentFromError.$dataContractId = Buffer.from(rawDocumentFromError.$dataContractId);
|
|
219
|
+
rawDocumentFromError.$ownerId = Buffer.from(rawDocumentFromError.$ownerId);
|
|
220
|
+
|
|
221
|
+
expect(rawDocumentFromError).to.deep.equal(rawDocument);
|
|
206
222
|
|
|
207
|
-
|
|
208
|
-
expect(
|
|
223
|
+
const [consensusError] = e.getErrors();
|
|
224
|
+
expect(consensusError).to.be.an.instanceOf(JsonSchemaError);
|
|
209
225
|
}
|
|
210
226
|
});
|
|
211
227
|
|
|
212
228
|
it('should throw InvalidDocumentError if Data Contract is not valid', async () => {
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
);
|
|
229
|
+
const dc = DataContract.fromBuffer(dataContractJs.toBuffer());
|
|
230
|
+
dc.setDocuments({ '$%34': { '^&*': 'Keck' } });
|
|
231
|
+
const oldDataContract = DataContract.fromBuffer(dataContractJs.toBuffer());
|
|
232
|
+
stateRepositoryMock.fetchDataContract.resolves(dc);
|
|
218
233
|
|
|
219
234
|
try {
|
|
220
|
-
await factory.createFromObject(
|
|
235
|
+
await factory.createFromObject(rawDocumentJs);
|
|
221
236
|
|
|
222
237
|
expect.fail('InvalidDocumentError should be thrown');
|
|
223
238
|
} catch (e) {
|
|
224
239
|
expect(e).to.be.an.instanceOf(InvalidDocumentError);
|
|
225
240
|
|
|
226
241
|
expect(e.getErrors()).to.have.length(1);
|
|
227
|
-
expect(
|
|
242
|
+
expect(
|
|
243
|
+
(new Document(e.getRawDocument(), oldDataContract).toObject()),
|
|
244
|
+
).to.deep.equal(rawDocumentJs);
|
|
228
245
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
expect(consensusError).to.equal(fetchContractError);
|
|
246
|
+
expect(stateRepositoryMock.fetchDataContract.callCount).to.be.equal(1);
|
|
247
|
+
const callArguments = stateRepositoryMock.fetchDataContract.getCall(0).args[0];
|
|
232
248
|
|
|
233
|
-
expect(
|
|
234
|
-
expect(validateDocumentMock).to.have.not.been.called();
|
|
249
|
+
expect(callArguments.toBuffer()).to.be.deep.equal(dc.getId().toBuffer());
|
|
235
250
|
}
|
|
236
251
|
});
|
|
237
252
|
});
|
|
@@ -240,41 +255,27 @@ describe('DocumentFactory', () => {
|
|
|
240
255
|
let serializedDocument;
|
|
241
256
|
|
|
242
257
|
beforeEach(function beforeEach() {
|
|
243
|
-
this.sinonSandbox.stub(
|
|
258
|
+
this.sinonSandbox.stub(factoryJs, 'createFromObject');
|
|
244
259
|
// eslint-disable-next-line prefer-destructuring
|
|
245
|
-
|
|
260
|
+
documentJs = documentsJs[8]; // document with binary fields
|
|
246
261
|
|
|
247
|
-
serializedDocument =
|
|
248
|
-
|
|
262
|
+
serializedDocument = documentJs.toBuffer();
|
|
263
|
+
rawDocumentJs = documentJs.toObject();
|
|
249
264
|
});
|
|
250
265
|
|
|
251
266
|
afterEach(() => {
|
|
252
|
-
|
|
267
|
+
factoryJs.createFromObject.restore();
|
|
253
268
|
});
|
|
254
269
|
|
|
255
270
|
it('should return new Document from serialized one', async () => {
|
|
256
|
-
decodeProtocolEntityMock.returns([rawDocument.$protocolVersion, rawDocument]);
|
|
257
|
-
|
|
258
|
-
factory.createFromObject.returns(document);
|
|
259
|
-
|
|
260
271
|
const result = await factory.createFromBuffer(serializedDocument);
|
|
261
|
-
|
|
262
|
-
expect(
|
|
263
|
-
|
|
264
|
-
expect(factory.createFromObject).to.have.been.calledOnceWith(rawDocument);
|
|
265
|
-
|
|
266
|
-
expect(decodeProtocolEntityMock).to.have.been.calledOnceWith(
|
|
267
|
-
serializedDocument,
|
|
268
|
-
);
|
|
272
|
+
expect(result.toObject()).to.deep.equal(documentJs.toObject());
|
|
273
|
+
expect(stateRepositoryMock.fetchDataContract).to.have.been.calledOnce();
|
|
269
274
|
});
|
|
270
275
|
|
|
271
276
|
it('should throw InvalidDocumentError if the decoding fails with consensus error', async () => {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
new Error(),
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
decodeProtocolEntityMock.throws(parsingError);
|
|
277
|
+
documentJs.data = 'Not a valid data';
|
|
278
|
+
serializedDocument = documentJs.toBuffer();
|
|
278
279
|
|
|
279
280
|
try {
|
|
280
281
|
await factory.createFromBuffer(serializedDocument);
|
|
@@ -282,41 +283,37 @@ describe('DocumentFactory', () => {
|
|
|
282
283
|
expect.fail('should throw InvalidDocumentError');
|
|
283
284
|
} catch (e) {
|
|
284
285
|
expect(e).to.be.an.instanceOf(InvalidDocumentError);
|
|
285
|
-
|
|
286
|
-
const [innerError] = e.getErrors();
|
|
287
|
-
expect(innerError).to.equal(parsingError);
|
|
288
286
|
}
|
|
289
287
|
});
|
|
290
288
|
|
|
291
|
-
it('should throw an error if decoding fails with any other error', async () => {
|
|
292
|
-
const
|
|
293
|
-
|
|
294
|
-
decodeProtocolEntityMock.throws(parsingError);
|
|
295
|
-
|
|
289
|
+
it('should throw an error if decoding fails with any other error - Rust', async () => {
|
|
290
|
+
const serializeDocument = Buffer.alloc(160, 1);
|
|
296
291
|
try {
|
|
297
|
-
await factory.createFromBuffer(
|
|
292
|
+
await factory.createFromBuffer(serializeDocument);
|
|
298
293
|
|
|
299
294
|
expect.fail('should throw an error');
|
|
300
295
|
} catch (e) {
|
|
301
|
-
|
|
296
|
+
// TODO - parsing errors are not handled yet, as they happen directly in the rust code when
|
|
297
|
+
// trying to access a field
|
|
298
|
+
expect(e).to.startsWith('Error conversion not implemented:');
|
|
302
299
|
}
|
|
303
300
|
});
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
describe('createStateTransition', () => {
|
|
307
|
-
it('should throw and error if documents have unknown action', () => {
|
|
301
|
+
}); describe('createStateTransition', () => {
|
|
302
|
+
it('should throw and error if documents have unknown action', async () => {
|
|
308
303
|
try {
|
|
309
304
|
factory.createStateTransition({
|
|
310
305
|
unknown: documents,
|
|
311
306
|
});
|
|
307
|
+
|
|
312
308
|
expect.fail('Error was not thrown');
|
|
313
309
|
} catch (e) {
|
|
310
|
+
// documents of unknown actions are filtered out
|
|
314
311
|
expect(e).to.be.an.instanceOf(InvalidActionNameError);
|
|
315
312
|
expect(e.getActions()).to.have.deep.members(['unknown']);
|
|
316
313
|
}
|
|
317
314
|
});
|
|
318
315
|
|
|
319
|
-
it('should throw and error if no documents were supplied', () => {
|
|
316
|
+
it('should throw and error if no documents were supplied', async () => {
|
|
320
317
|
try {
|
|
321
318
|
factory.createStateTransition({});
|
|
322
319
|
expect.fail('Error was not thrown');
|
|
@@ -325,8 +322,11 @@ describe('DocumentFactory', () => {
|
|
|
325
322
|
}
|
|
326
323
|
});
|
|
327
324
|
|
|
328
|
-
it('should throw and error if documents have mixed owner ids', () => {
|
|
329
|
-
|
|
325
|
+
it('should throw and error if documents have mixed owner ids', async () => {
|
|
326
|
+
const newId = await generateRandomIdentifierAsync();
|
|
327
|
+
documents[0].setOwnerId(newId);
|
|
328
|
+
const rawDocuments = documents.map((d) => d.toObject());
|
|
329
|
+
|
|
330
330
|
try {
|
|
331
331
|
factory.createStateTransition({
|
|
332
332
|
create: documents,
|
|
@@ -334,12 +334,14 @@ describe('DocumentFactory', () => {
|
|
|
334
334
|
expect.fail('Error was not thrown');
|
|
335
335
|
} catch (e) {
|
|
336
336
|
expect(e).to.be.an.instanceOf(MismatchOwnerIdsError);
|
|
337
|
-
|
|
337
|
+
const rawDocumentsFromError = e.getDocuments().map((d) => d.toObject());
|
|
338
|
+
expect(rawDocumentsFromError).to.have.deep.members(rawDocuments);
|
|
338
339
|
}
|
|
339
340
|
});
|
|
340
341
|
|
|
341
|
-
it('should throw and error if create documents have invalid initial version', () => {
|
|
342
|
+
it('should throw and error if create documents have invalid initial version', async () => {
|
|
342
343
|
documents[0].setRevision(3);
|
|
344
|
+
const expectedDocument = documents[0].toObject();
|
|
343
345
|
try {
|
|
344
346
|
factory.createStateTransition({
|
|
345
347
|
create: documents,
|
|
@@ -347,30 +349,28 @@ describe('DocumentFactory', () => {
|
|
|
347
349
|
expect.fail('Error was not thrown');
|
|
348
350
|
} catch (e) {
|
|
349
351
|
expect(e).to.be.an.instanceOf(InvalidInitialRevisionError);
|
|
350
|
-
expect(e.getDocument()).to.deep.equal(
|
|
352
|
+
expect(e.getDocument().toObject()).to.deep.equal(expectedDocument);
|
|
351
353
|
}
|
|
352
354
|
});
|
|
353
355
|
|
|
354
|
-
it('should create DocumentsBatchTransition with passed documents', () => {
|
|
355
|
-
const [
|
|
356
|
-
|
|
357
|
-
fakeTime.tick(1000);
|
|
356
|
+
it('should create DocumentsBatchTransition with passed documents', async () => {
|
|
357
|
+
const [newDocumentJs] = getDocumentsFixture(dataContractJs);
|
|
358
|
+
const newDocument = new Document(newDocumentJs.toObject(), dataContract);
|
|
358
359
|
|
|
359
360
|
const stateTransition = factory.createStateTransition({
|
|
360
361
|
create: documents,
|
|
361
362
|
replace: [newDocument],
|
|
362
363
|
});
|
|
363
364
|
|
|
364
|
-
const
|
|
365
|
-
create:
|
|
366
|
-
replace: [
|
|
365
|
+
const stateTransitionJs = factoryJs.createStateTransition({
|
|
366
|
+
create: documentsJs,
|
|
367
|
+
replace: [newDocumentJs],
|
|
367
368
|
});
|
|
368
369
|
|
|
369
|
-
|
|
370
|
+
const transitions = stateTransition.getTransitions().map((t) => t.toObject());
|
|
371
|
+
const expectedTransitions = stateTransitionJs.getTransitions().map((t) => t.toObject());
|
|
370
372
|
|
|
371
|
-
expect(
|
|
372
|
-
expectedTransitions,
|
|
373
|
-
);
|
|
373
|
+
expect(transitions).to.deep.includes.members(expectedTransitions);
|
|
374
374
|
});
|
|
375
375
|
});
|
|
376
376
|
});
|
|
@@ -5,51 +5,89 @@ const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createSta
|
|
|
5
5
|
const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture');
|
|
6
6
|
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
7
7
|
|
|
8
|
-
const
|
|
8
|
+
const ValidationResultJs = require('@dashevo/dpp/lib/validation/ValidationResult');
|
|
9
9
|
|
|
10
|
-
const
|
|
11
|
-
const
|
|
10
|
+
const MissingDataContractIdErrorJs = require('@dashevo/dpp/lib/errors/consensus/basic/document/MissingDataContractIdError');
|
|
11
|
+
const DataContractNotPresentErrorJs = require('@dashevo/dpp/lib/errors/consensus/basic/document/DataContractNotPresentError');
|
|
12
12
|
|
|
13
13
|
const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError');
|
|
14
14
|
|
|
15
|
+
const { default: loadWasmDpp } = require('../../../dist');
|
|
16
|
+
|
|
17
|
+
let ValidationResult;
|
|
18
|
+
let DataContract;
|
|
19
|
+
|
|
15
20
|
describe('fetchAndValidateDataContractFactory', () => {
|
|
21
|
+
let stateRepositoryMockJs;
|
|
16
22
|
let stateRepositoryMock;
|
|
23
|
+
let fetchAndValidateDataContractJs;
|
|
17
24
|
let fetchAndValidateDataContract;
|
|
18
25
|
let rawDocument;
|
|
19
26
|
|
|
27
|
+
beforeEach(async () => {
|
|
28
|
+
({
|
|
29
|
+
DataContract,
|
|
30
|
+
fetchAndValidateDataContract,
|
|
31
|
+
ValidationResult,
|
|
32
|
+
} = await loadWasmDpp());
|
|
33
|
+
});
|
|
34
|
+
|
|
20
35
|
beforeEach(function beforeEach() {
|
|
21
|
-
const
|
|
36
|
+
const dataContractJs = getDataContractFixture();
|
|
37
|
+
const dataContract = DataContract.fromBuffer(dataContractJs.toBuffer());
|
|
22
38
|
|
|
23
|
-
const [document] = getDocumentsFixture(
|
|
39
|
+
const [document] = getDocumentsFixture(dataContractJs);
|
|
24
40
|
rawDocument = document.toObject();
|
|
25
41
|
|
|
26
|
-
|
|
42
|
+
stateRepositoryMockJs = createStateRepositoryMock(this.sinonSandbox);
|
|
43
|
+
stateRepositoryMockJs.fetchDataContract.resolves(dataContractJs);
|
|
27
44
|
|
|
45
|
+
stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
|
|
28
46
|
stateRepositoryMock.fetchDataContract.resolves(dataContract);
|
|
29
47
|
|
|
30
|
-
|
|
31
|
-
|
|
48
|
+
fetchAndValidateDataContractJs = fetchAndValidateDataContractFactory(
|
|
49
|
+
stateRepositoryMockJs,
|
|
32
50
|
);
|
|
33
51
|
});
|
|
34
52
|
|
|
35
53
|
it('should return with invalid result if $dataContractId is not present', async () => {
|
|
36
54
|
delete rawDocument.$dataContractId;
|
|
37
55
|
|
|
38
|
-
const result = await
|
|
56
|
+
const result = await fetchAndValidateDataContractJs(rawDocument);
|
|
39
57
|
|
|
40
|
-
expectValidationError(result,
|
|
58
|
+
expectValidationError(result, MissingDataContractIdErrorJs);
|
|
41
59
|
|
|
42
60
|
const [error] = result.getErrors();
|
|
43
61
|
|
|
44
62
|
expect(error.getCode()).to.equal(1025);
|
|
45
63
|
});
|
|
46
64
|
|
|
65
|
+
it('should return with invalid result if $dataContractId is not present - Rust', async () => {
|
|
66
|
+
delete rawDocument.$dataContractId;
|
|
67
|
+
|
|
68
|
+
const result = await fetchAndValidateDataContract(stateRepositoryMock, rawDocument);
|
|
69
|
+
|
|
70
|
+
const [error] = result.getErrors();
|
|
71
|
+
expect(error.getCode()).to.equal(1025);
|
|
72
|
+
});
|
|
73
|
+
|
|
47
74
|
it('should return with invalid result if Data Contract is not present', async () => {
|
|
48
|
-
|
|
75
|
+
stateRepositoryMockJs.fetchDataContract.resolves(null);
|
|
49
76
|
|
|
50
|
-
const result = await
|
|
77
|
+
const result = await fetchAndValidateDataContractJs(rawDocument);
|
|
51
78
|
|
|
52
|
-
expectValidationError(result,
|
|
79
|
+
expectValidationError(result, DataContractNotPresentErrorJs);
|
|
80
|
+
|
|
81
|
+
const [error] = result.getErrors();
|
|
82
|
+
|
|
83
|
+
expect(error.getCode()).to.equal(1018);
|
|
84
|
+
expect(error.getDataContractId()).to.deep.equal(rawDocument.$dataContractId);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('should return with invalid result if Data Contract is not present - Rust', async () => {
|
|
88
|
+
stateRepositoryMock.fetchDataContract.resolves(null);
|
|
89
|
+
|
|
90
|
+
const result = await fetchAndValidateDataContract(stateRepositoryMock, rawDocument);
|
|
53
91
|
|
|
54
92
|
const [error] = result.getErrors();
|
|
55
93
|
|
|
@@ -58,7 +96,14 @@ describe('fetchAndValidateDataContractFactory', () => {
|
|
|
58
96
|
});
|
|
59
97
|
|
|
60
98
|
it('should return valid result', async () => {
|
|
61
|
-
const result = await
|
|
99
|
+
const result = await fetchAndValidateDataContractJs(rawDocument);
|
|
100
|
+
|
|
101
|
+
expect(result).to.be.an.instanceOf(ValidationResultJs);
|
|
102
|
+
expect(result.isValid()).to.be.true();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should return valid result - Rust', async () => {
|
|
106
|
+
const result = await fetchAndValidateDataContract(stateRepositoryMock, rawDocument);
|
|
62
107
|
|
|
63
108
|
expect(result).to.be.an.instanceOf(ValidationResult);
|
|
64
109
|
expect(result.isValid()).to.be.true();
|