@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.
Files changed (245) hide show
  1. package/.mocharc.yml +1 -1
  2. package/Cargo.toml +5 -2
  3. package/README.md +5 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.LICENSE.txt +9 -0
  6. package/dist/wasm/wasm_dpp.d.ts +3397 -1237
  7. package/karma.conf.js +5 -0
  8. package/lib/identifier/patchIdentifier.ts +5 -4
  9. package/lib/index.ts +1 -1
  10. package/lib/test/bootstrap.js +5 -0
  11. package/lib/test/fixtures/getDataContractFixture.js +267 -0
  12. package/lib/test/fixtures/getDocumentsFixture.js +43 -0
  13. package/lib/test/mocks/createStateRepositoryMock.js +64 -0
  14. package/lib/test/mocks/getBlsAdapterMock.js +51 -0
  15. package/package.json +11 -8
  16. package/src/bls_adapter.rs +17 -1
  17. package/src/buffer.rs +3 -0
  18. package/src/dash_platform_protocol.rs +107 -10
  19. package/src/data_contract/data_contract.rs +59 -10
  20. package/src/data_contract/data_contract_facade.rs +128 -0
  21. package/src/data_contract/errors/invalid_data_contract.rs +16 -16
  22. package/src/data_contract/errors/invalid_document_type.rs +8 -8
  23. package/src/data_contract/errors/mod.rs +10 -16
  24. package/src/data_contract/index.rs +56 -1
  25. package/src/data_contract/mod.rs +4 -0
  26. package/src/data_contract/state_transition/data_contract_create_transition/apply.rs +1 -1
  27. package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +41 -10
  28. package/src/data_contract/state_transition/data_contract_create_transition/validation.rs +35 -4
  29. package/src/data_contract/state_transition/data_contract_update_transition/apply.rs +1 -1
  30. package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +20 -7
  31. package/src/data_contract/state_transition/data_contract_update_transition/validation.rs +47 -11
  32. package/src/data_contract_factory/data_contract_factory.rs +19 -17
  33. package/src/data_trigger/data_trigger_execution_context.rs +95 -0
  34. package/src/data_trigger/data_trigger_execution_result.rs +48 -0
  35. package/src/data_trigger/execute_data_triggers_factory.rs +60 -0
  36. package/src/data_trigger/get_data_triggers_factory.rs +65 -0
  37. package/src/data_trigger/mod.rs +121 -0
  38. package/src/document/document_facade.rs +125 -0
  39. package/src/document/errors/invalid_document_error.rs +10 -9
  40. package/src/document/errors/invalid_initial_revision_error.rs +1 -1
  41. package/src/document/errors/mismatch_owners_ids_error.rs +14 -4
  42. package/src/document/errors/mod.rs +17 -13
  43. package/src/document/errors/no_documents_supplied_error.rs +4 -4
  44. package/src/document/factory.rs +257 -0
  45. package/src/document/fetch_and_validate_data_contract.rs +77 -0
  46. package/src/document/generate_document_id.rs +17 -0
  47. package/src/document/mod.rs +311 -37
  48. package/src/document/state_transition/document_batch_transition/apply_document_batch_transition.rs +22 -0
  49. package/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +253 -1
  50. package/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs +60 -1
  51. package/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +263 -0
  52. package/src/document/state_transition/document_batch_transition/document_transition/mod.rs +302 -3
  53. package/src/document/state_transition/document_batch_transition/mod.rs +378 -0
  54. package/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_id.rs +40 -0
  55. package/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_indices.rs +50 -0
  56. package/src/document/state_transition/document_batch_transition/validation/basic/mod.rs +8 -0
  57. package/src/document/state_transition/document_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs +34 -0
  58. package/src/document/state_transition/document_batch_transition/validation/basic/validate_partial_compound_indices.rs +39 -0
  59. package/src/document/state_transition/document_batch_transition/validation/mod.rs +2 -0
  60. package/src/document/state_transition/document_batch_transition/validation/state/fetch_documents.rs +43 -0
  61. package/src/document/state_transition/document_batch_transition/validation/state/mod.rs +3 -0
  62. package/src/document/state_transition/document_batch_transition/validation/state/validate_documents_batch_transitions_state.rs +27 -0
  63. package/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs +47 -0
  64. package/src/document/validator.rs +52 -0
  65. package/src/errors/compatible_protocol_version_is_not_defined_error.rs +24 -0
  66. package/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +1 -1
  67. package/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +1 -1
  68. package/src/errors/consensus/basic/document/inconsistent_compound_index_data_error.rs +2 -2
  69. package/src/errors/consensus/basic/document/invalid_document_type_error.rs +15 -1
  70. package/src/errors/consensus/basic/document/missing_data_contract_id_error.rs +16 -2
  71. package/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +1 -1
  72. package/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +1 -1
  73. package/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +6 -2
  74. package/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +5 -2
  75. package/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +3 -3
  76. package/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs +2 -2
  77. package/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_pooling_error.rs +29 -0
  78. package/src/errors/consensus/basic/identity/invalid_identity_key_signature_error.rs +4 -3
  79. package/src/errors/consensus/basic/identity/invalid_identity_public_key_data_error.rs +1 -1
  80. package/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +1 -1
  81. package/src/errors/consensus/basic/identity/missing_public_key_error.rs +4 -3
  82. package/src/errors/consensus/basic/identity/mod.rs +2 -0
  83. package/src/errors/consensus/basic/invalid_identifier_error.rs +1 -1
  84. package/src/errors/consensus/basic/json_schema_error.rs +8 -2
  85. package/src/errors/consensus/basic/public_key_is_disabled_error.rs +1 -1
  86. package/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs +9 -9
  87. package/src/errors/consensus/state/document/invalid_document_revision_error.rs +4 -4
  88. package/src/errors/consensus/state/identity/duplicated_identity_public_key_id_state_error.rs +35 -0
  89. package/src/errors/consensus/state/identity/duplicated_identity_public_key_state_error.rs +34 -0
  90. package/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs +10 -7
  91. package/src/errors/consensus/state/identity/identity_public_key_is_disabled_error.rs +2 -3
  92. package/src/errors/consensus/state/identity/identity_public_key_is_read_only_error.rs +7 -3
  93. package/src/errors/consensus/state/identity/invalid_identity_public_key_id_error.rs +2 -3
  94. package/src/errors/consensus/state/identity/invalid_identity_revision_error.rs +7 -4
  95. package/src/errors/consensus/state/identity/max_identity_public_key_limit_reached_error.rs +2 -1
  96. package/src/errors/consensus/state/identity/mod.rs +4 -0
  97. package/src/errors/consensus_error.rs +218 -268
  98. package/src/errors/data_contract_not_present_error.rs +23 -0
  99. package/src/errors/dpp_error.rs +17 -0
  100. package/src/errors/from.rs +22 -0
  101. package/src/errors/js_conversion.rs +52 -5
  102. package/src/errors/mod.rs +6 -0
  103. package/src/errors/protocol_error.rs +14 -3
  104. package/src/identifier/errors.rs +30 -0
  105. package/src/identifier/mod.rs +95 -11
  106. package/src/identity/errors/asset_lock_output_not_found_error.rs +11 -0
  107. package/src/identity/errors/asset_lock_transaction_is_not_found_error.rs +20 -0
  108. package/src/identity/errors/invalid_identity_error.rs +32 -0
  109. package/src/identity/errors/mod.rs +9 -0
  110. package/src/identity/errors/unknown_asset_lock_proof_type_error.rs +26 -0
  111. package/src/identity/factory_utils.rs +87 -0
  112. package/src/identity/identity_facade.rs +194 -20
  113. package/src/identity/identity_factory.rs +209 -0
  114. package/src/identity/identity_public_key/mod.rs +51 -40
  115. package/src/identity/mod.rs +31 -17
  116. package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +132 -0
  117. package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +72 -0
  118. package/src/identity/state_transition/asset_lock_proof/chain/mod.rs +4 -0
  119. package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +177 -0
  120. package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +72 -0
  121. package/src/identity/state_transition/asset_lock_proof/instant/mod.rs +4 -0
  122. package/src/identity/state_transition/asset_lock_proof/mod.rs +269 -0
  123. package/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs +26 -0
  124. package/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +337 -0
  125. package/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs +153 -0
  126. package/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +37 -0
  127. package/src/identity/state_transition/identity_create_transition/mod.rs +8 -0
  128. package/src/identity/state_transition/identity_create_transition/to_object.rs +45 -0
  129. package/src/identity/state_transition/identity_public_key_transitions.rs +207 -0
  130. package/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +31 -0
  131. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +278 -0
  132. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_basic_validator.rs +113 -0
  133. package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +37 -0
  134. package/src/identity/state_transition/identity_topup_transition/mod.rs +8 -0
  135. package/src/identity/state_transition/identity_topup_transition/to_object.rs +42 -0
  136. package/src/identity/state_transition/identity_update_transition/apply_identity_update_transition.rs +24 -0
  137. package/src/identity/state_transition/identity_update_transition/identity_update_public_keys_validator.rs +55 -0
  138. package/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +448 -0
  139. package/src/identity/state_transition/identity_update_transition/identity_update_transition_basic_validator.rs +94 -0
  140. package/src/identity/state_transition/identity_update_transition/identity_update_transition_state_validator.rs +53 -0
  141. package/src/identity/state_transition/identity_update_transition/mod.rs +9 -0
  142. package/src/identity/state_transition/identity_update_transition/to_object.rs +66 -0
  143. package/src/identity/state_transition/mod.rs +12 -0
  144. package/src/identity/state_transition/validate_public_key_signatures.rs +61 -0
  145. package/src/identity/validation/identity_validator.rs +50 -0
  146. package/src/identity/validation/mod.rs +2 -0
  147. package/src/identity/validation/public_keys_validator.rs +14 -13
  148. package/src/identity_public_key/public_keys_validator.rs +44 -0
  149. package/src/lib.rs +6 -0
  150. package/src/lodash.rs +7 -0
  151. package/src/metadata.rs +54 -10
  152. package/src/state_repository.rs +598 -101
  153. package/src/state_transition/conversion.rs +104 -0
  154. package/src/state_transition/errors/invalid_state_transition_error.rs +32 -0
  155. package/src/state_transition/errors/mod.rs +1 -0
  156. package/src/state_transition/mod.rs +46 -0
  157. package/src/state_transition/state_transition_facade.rs +263 -0
  158. package/src/state_transition/state_transition_factory.rs +216 -0
  159. package/src/state_transition/validation/mod.rs +1 -0
  160. package/src/state_transition/validation/validate_state_transition_key_signature.rs +62 -0
  161. package/src/utils.rs +210 -8
  162. package/src/validation/json_schema_validator.rs +41 -0
  163. package/src/validation/mod.rs +2 -0
  164. package/src/validation/validation_result.rs +29 -5
  165. package/src/version/mod.rs +2 -0
  166. package/src/version/protocol_version.rs +103 -0
  167. package/test/integration/dataContract/DataContractFacade.spec.js +46 -30
  168. package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +45 -127
  169. package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +91 -139
  170. package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +577 -503
  171. package/test/integration/document/Document.spec.js +55 -29
  172. package/test/integration/document/DocumentFacade.spec.js +51 -64
  173. package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +38 -16
  174. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +341 -396
  175. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +116 -218
  176. package/test/integration/document/validation/validateDocumentFactory.spec.js +123 -171
  177. package/test/integration/identity/IdentityFacade.spec.js +52 -27
  178. package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +185 -164
  179. package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +84 -114
  180. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +120 -137
  181. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +106 -91
  182. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +50 -16
  183. package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +78 -86
  184. package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +74 -30
  185. package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +93 -147
  186. package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +65 -77
  187. package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +60 -23
  188. package/test/integration/identity/validation/validateIdentityFactory.spec.js +46 -114
  189. package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +9 -3
  190. package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +12 -8
  191. package/test/integration/stateTransition/StateTransitionFacade.spec.js +95 -233
  192. package/test/integration/stateTransition/calculateStateTransitionFeeFromOperationsFactory.spec.js +53 -0
  193. package/test/unit/Identifier.spec.js +36 -36
  194. package/test/unit/Metadata.spec.js +17 -3
  195. package/test/unit/dataContract/DataContract.spec.js +9 -4
  196. package/test/unit/dataContract/createDataContract.spec.js +0 -1
  197. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +3 -3
  198. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +1 -1
  199. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +2 -2
  200. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +3 -3
  201. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +1 -1
  202. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +25 -31
  203. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +3 -3
  204. package/test/unit/dataTrigger/rewardShareDataTriggers/createMasternodeRewardSharesDataTrigger.spec.js +2 -0
  205. package/test/unit/decodeProtocolEntityFactory.spec.js +2 -2
  206. package/test/unit/document/Document.spec.js +147 -155
  207. package/test/unit/document/DocumentFactory.spec.js +153 -153
  208. package/test/unit/document/fetchAndValidateDataContractFactory.spec.js +59 -14
  209. package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +131 -62
  210. package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +144 -56
  211. package/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js +38 -8
  212. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +11 -7
  213. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js +29 -18
  214. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js +38 -29
  215. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js +53 -91
  216. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +357 -493
  217. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +133 -72
  218. package/test/unit/identity/Identity.spec.js +26 -9
  219. package/test/unit/identity/IdentityFactory.spec.js +81 -89
  220. package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +73 -30
  221. package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +38 -38
  222. package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +34 -25
  223. package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +36 -16
  224. package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +85 -50
  225. package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +24 -6
  226. package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +44 -22
  227. package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +58 -103
  228. package/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +63 -0
  229. package/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +90 -0
  230. package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +18 -3
  231. package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +38 -11
  232. package/test/unit/stateTransition/StateTransitionFactory.spec.js +49 -101
  233. package/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +23 -25
  234. package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +73 -46
  235. package/test/unit/version/validateProtocolVersionFactory.spec.js +45 -27
  236. package/wasm/package.json +5 -0
  237. package/wasm/wasm_dpp.d.ts +3397 -1237
  238. package/wasm/wasm_dpp.js +7158 -1384
  239. package/wasm/wasm_dpp_bg.js +1 -1
  240. package/wasm/wasm_dpp_bg.wasm +0 -0
  241. package/wasm/wasm_dpp_bg.wasm.d.ts +777 -389
  242. package/webpack.config.js +9 -0
  243. package/src/document/state_transition/document_batch_transition/document_transition/document_update_transition.rs +0 -22
  244. package/test/integration/stateTransition/calculateStateTransitionFeeFactory.spec.js +0 -135
  245. 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 Identifier = require('@dashevo/dpp/lib/identifier/Identifier');
10
+ const createStateRepositoryMock = require('../../../lib/test/mocks/createStateRepositoryMock');
11
+ const generateRandomIdentifierAsync = require('../../../lib/test/utils/generateRandomIdentifierAsync');
14
12
 
15
- const InvalidDocumentTypeError = require('@dashevo/dpp/lib/errors/InvalidDocumentTypeError');
16
- const InvalidDocumentError = require('@dashevo/dpp/lib/document/errors/InvalidDocumentError');
17
- const InvalidActionNameError = require('@dashevo/dpp/lib/document/errors/InvalidActionNameError');
18
- const NoDocumentsSuppliedError = require('@dashevo/dpp/lib/document/errors/NoDocumentsSuppliedError');
19
- const MismatchOwnerIdsError = require('@dashevo/dpp/lib/document/errors/MismatchOwnerIdsError');
20
- const InvalidInitialRevisionError = require('@dashevo/dpp/lib/document/errors/InvalidInitialRevisionError');
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 generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRandomIdentifier');
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
- ({ ownerId } = getDocumentsFixture);
47
- dataContract = getDataContractFixture();
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
- documents = getDocumentsFixture(dataContract);
50
- ([,,, document] = documents);
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(dataContract);
90
+ fetchContractResult.setData(dataContractJs);
65
91
 
66
- fetchAndValidateDataContractMock = this.sinonSandbox.stub().returns(fetchContractResult);
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
- ownerId = bs58.decode('5zcXZpTLWFwZjKjq3ME5KVavtZa9YUaZESVzrndehBhq');
92
- dataContract.id = Identifier.from(contractId);
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
- ownerId,
97
- rawDocument.$type,
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(rawDocument.$type);
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(generateEntropyMock).to.have.been.calledOnce();
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
- expect(newDocument.getId()).to.deep.equal(bs58.decode('B99gjrjq6R1FXwGUQnoP7VrmCDDT1PbKprUNzjVbxXfz'));
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().getTime()).to.be.equal(fakeTimeDate.getTime());
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(InvalidDocumentTypeError);
167
+ expect(e).to.be.an.instanceOf(InvalidDocumentTypeInDataContractError);
130
168
  expect(e.getType()).to.equal(type);
131
- expect(e.getDataContract()).to.equal(dataContract);
169
+ expect(e.getDataContractId().toBuffer()).to.deep.equal(dataContractId);
132
170
  }
133
171
  });
134
172
 
135
- it('should throw an error if validation faled', () => {
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, rawDocument.$type);
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(fetchAndValidateDataContractMock).to.have.been.calledOnceWithExactly(rawDocument);
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 function it() {
169
- const resultMock = {
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(fetchAndValidateDataContractMock).to.have.been.calledOnceWithExactly(rawDocument);
183
- expect(validateDocumentMock).to.have.not.been.called();
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
- const validationError = new SomeConsensusError('test');
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
- const [consensusError] = e.getErrors();
205
- expect(consensusError).to.equal(validationError);
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
- expect(fetchAndValidateDataContractMock).to.have.been.calledOnceWithExactly(rawDocument);
208
- expect(validateDocumentMock).to.have.been.calledOnceWithExactly(rawDocument, dataContract);
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 fetchContractError = new SomeConsensusError('error');
214
-
215
- fetchAndValidateDataContractMock.returns(
216
- new ValidationResult([fetchContractError]),
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(rawDocument);
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(e.getRawDocument()).to.equal(rawDocument);
242
+ expect(
243
+ (new Document(e.getRawDocument(), oldDataContract).toObject()),
244
+ ).to.deep.equal(rawDocumentJs);
228
245
 
229
- const [consensusError] = e.getErrors();
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(fetchAndValidateDataContractMock).to.have.been.calledOnceWith(rawDocument);
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(factory, 'createFromObject');
258
+ this.sinonSandbox.stub(factoryJs, 'createFromObject');
244
259
  // eslint-disable-next-line prefer-destructuring
245
- document = documents[8]; // document with binary fields
260
+ documentJs = documentsJs[8]; // document with binary fields
246
261
 
247
- serializedDocument = document.toBuffer();
248
- rawDocument = document.toObject();
262
+ serializedDocument = documentJs.toBuffer();
263
+ rawDocumentJs = documentJs.toObject();
249
264
  });
250
265
 
251
266
  afterEach(() => {
252
- factory.createFromObject.restore();
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(result).to.equal(document);
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
- const parsingError = new SerializedObjectParsingError(
273
- serializedDocument,
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 parsingError = new Error('Something failed during parsing');
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(serializedDocument);
292
+ await factory.createFromBuffer(serializeDocument);
298
293
 
299
294
  expect.fail('should throw an error');
300
295
  } catch (e) {
301
- expect(e).to.equal(parsingError);
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
- documents[0].ownerId = generateRandomIdentifier().toBuffer();
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
- expect(e.getDocuments()).to.have.deep.members(documents);
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(documents[0]);
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 [newDocument] = getDocumentsFixture(dataContract);
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 expectedTransitions = getDocumentTransitionsFixture({
365
- create: documents,
366
- replace: [newDocument],
365
+ const stateTransitionJs = factoryJs.createStateTransition({
366
+ create: documentsJs,
367
+ replace: [newDocumentJs],
367
368
  });
368
369
 
369
- expectedTransitions.slice(-1).updatedAt = new Date();
370
+ const transitions = stateTransition.getTransitions().map((t) => t.toObject());
371
+ const expectedTransitions = stateTransitionJs.getTransitions().map((t) => t.toObject());
370
372
 
371
- expect(stateTransition.getTransitions()).to.deep.equal(
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 ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult');
8
+ const ValidationResultJs = require('@dashevo/dpp/lib/validation/ValidationResult');
9
9
 
10
- const MissingDataContractIdError = require('@dashevo/dpp/lib/errors/consensus/basic/document/MissingDataContractIdError');
11
- const DataContractNotPresentError = require('@dashevo/dpp/lib/errors/consensus/basic/document/DataContractNotPresentError');
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 dataContract = getDataContractFixture();
36
+ const dataContractJs = getDataContractFixture();
37
+ const dataContract = DataContract.fromBuffer(dataContractJs.toBuffer());
22
38
 
23
- const [document] = getDocumentsFixture(dataContract);
39
+ const [document] = getDocumentsFixture(dataContractJs);
24
40
  rawDocument = document.toObject();
25
41
 
26
- stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
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
- fetchAndValidateDataContract = fetchAndValidateDataContractFactory(
31
- stateRepositoryMock,
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 fetchAndValidateDataContract(rawDocument);
56
+ const result = await fetchAndValidateDataContractJs(rawDocument);
39
57
 
40
- expectValidationError(result, MissingDataContractIdError);
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
- stateRepositoryMock.fetchDataContract.resolves(null);
75
+ stateRepositoryMockJs.fetchDataContract.resolves(null);
49
76
 
50
- const result = await fetchAndValidateDataContract(rawDocument);
77
+ const result = await fetchAndValidateDataContractJs(rawDocument);
51
78
 
52
- expectValidationError(result, DataContractNotPresentError);
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 fetchAndValidateDataContract(rawDocument);
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();