diff --git a/lib/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.js b/lib/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.js index ce103d88d..0b4524173 100644 --- a/lib/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.js +++ b/lib/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.js @@ -1,5 +1,3 @@ -const DataContractCreateTransition = require('../../DataContractCreateTransition'); - const InvalidDataContractIdError = require('../../../../../errors/InvalidDataContractIdError'); const generateDataContractId = require('../../../../generateDataContractId'); @@ -11,19 +9,18 @@ const dataContractCreateTransitionSchema = require('../../../../../../schema/dat /** * @param {JsonSchemaValidator} jsonSchemaValidator * @param {validateDataContract} validateDataContract - * @param {validateStateTransitionSignature} validateStateTransitionSignature - * @return {validateDataContractCreateTransitionStructure} + * @return {validateDataContractCreateTransitionBasic} */ function validateDataContractCreateTransitionBasicFactory( jsonSchemaValidator, validateDataContract, ) { /** - * @typedef validateDataContractCreateTransitionStructure + * @typedef validateDataContractCreateTransitionBasic * @param {RawDataContractCreateTransition} rawStateTransition * @return {ValidationResult} */ - async function validateDataContractCreateTransitionStructure(rawStateTransition) { + async function validateDataContractCreateTransitionBasic(rawStateTransition) { const result = jsonSchemaValidator.validate( dataContractCreateTransitionSchema, convertBuffersToArrays(rawStateTransition), @@ -58,7 +55,7 @@ function validateDataContractCreateTransitionBasicFactory( return result; } - return validateDataContractCreateTransitionStructure; + return validateDataContractCreateTransitionBasic; } module.exports = validateDataContractCreateTransitionBasicFactory; diff --git a/lib/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.js b/lib/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.js index 5c647fca7..eef5e0d1f 100644 --- a/lib/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.js +++ b/lib/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.js @@ -5,15 +5,15 @@ const DataContractAlreadyPresentError = require('../../../../../errors/DataContr /** * * @param {StateRepository} stateRepository - * @return {validateDataContractCreateTransitionData} + * @return {validateDataContractCreateTransitionState} */ function validateDataContractCreateTransitionStateFactory(stateRepository) { /** - * @typedef validateDataContractCreateTransitionData + * @typedef validateDataContractCreateTransitionState * @param {DataContractCreateTransition} stateTransition * @return {ValidationResult} */ - async function validateDataContractCreateTransitionData(stateTransition) { + async function validateDataContractCreateTransitionState(stateTransition) { const result = new ValidationResult(); const dataContract = stateTransition.getDataContract(); @@ -31,7 +31,7 @@ function validateDataContractCreateTransitionStateFactory(stateRepository) { return result; } - return validateDataContractCreateTransitionData; + return validateDataContractCreateTransitionState; } module.exports = validateDataContractCreateTransitionStateFactory; diff --git a/lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.js b/lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.js index 3cc18283e..b4769abbc 100644 --- a/lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.js +++ b/lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.js @@ -30,7 +30,7 @@ const createAndValidateIdentifier = require('../../../../../identifier/createAnd * @param {enrichDataContractWithBaseSchema} enrichDataContractWithBaseSchema * @param {validatePartialCompoundIndices} validatePartialCompoundIndices * - * @return {validateDocumentsBatchTransitionStructure} + * @return {validateDocumentsBatchTransitionBasic} */ function validateDocumentsBatchTransitionBasicFactory( findDuplicatesById, @@ -215,11 +215,11 @@ function validateDocumentsBatchTransitionBasicFactory( } /** - * @typedef validateDocumentsBatchTransitionStructure + * @typedef validateDocumentsBatchTransitionBasic * @param {RawDocumentsBatchTransition} rawStateTransition * @return {ValidationResult} */ - async function validateDocumentsBatchTransitionStructure(rawStateTransition) { + async function validateDocumentsBatchTransitionBasic(rawStateTransition) { const result = jsonSchemaValidator.validate( documentsBatchTransitionSchema, convertBuffersToArrays(rawStateTransition), @@ -295,7 +295,7 @@ function validateDocumentsBatchTransitionBasicFactory( return result; } - return validateDocumentsBatchTransitionStructure; + return validateDocumentsBatchTransitionBasic; } module.exports = validateDocumentsBatchTransitionBasicFactory; diff --git a/lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validatePartialCompoundIndices.js b/lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validatePartialCompoundIndices.js index 23d7e969f..192ff7573 100644 --- a/lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validatePartialCompoundIndices.js +++ b/lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validatePartialCompoundIndices.js @@ -1,3 +1,5 @@ +const lodashGet = require('lodash.get'); + const ValidationResult = require('../../../../../validation/ValidationResult'); const InconsistentCompoundIndexDataError = require('../../../../../errors/InconsistentCompoundIndexDataError'); @@ -8,26 +10,24 @@ const InconsistentCompoundIndexDataError = require('../../../../../errors/Incons * @param {Array< * RawDocumentCreateTransition| * RawDocumentReplaceTransition - * >} documentTransitions + * >} rawDocumentTransitions * @param {DataContract} dataContract * @return {ValidationResult} */ function validatePartialCompoundIndices( ownerId, - documentTransitions, + rawDocumentTransitions, dataContract, ) { const result = new ValidationResult(); - documentTransitions.forEach((documentTransition) => { - const documentSchema = dataContract.getDocumentSchema(documentTransition.$type); + rawDocumentTransitions.forEach((rawDocumentTransition) => { + const documentSchema = dataContract.getDocumentSchema(rawDocumentTransition.$type); if (!documentSchema.indices) { return; } - const rawDocumentTransition = documentTransition.toObject(); - documentSchema.indices .filter((index) => index.unique && index.properties.length > 1) .forEach((indexDefinition) => { @@ -42,7 +42,7 @@ function validatePartialCompoundIndices( return rawDocumentTransition[propertyPath]; } - return documentTransition.get(propertyPath); + return lodashGet(rawDocumentTransition, propertyPath); }); const allAreDefined = data.every((item) => item !== undefined); @@ -52,7 +52,7 @@ function validatePartialCompoundIndices( if (!isOk) { result.addError(new InconsistentCompoundIndexDataError( - documentTransition.getType(), + rawDocumentTransition.$type, indexDefinition, )); } diff --git a/lib/document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.js b/lib/document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.js index 9e4b8a282..68ce01d30 100644 --- a/lib/document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.js +++ b/lib/document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.js @@ -24,15 +24,13 @@ const BLOCK_TIME_WINDOW_MINUTES = 5; * @param {StateRepository} stateRepository * @param {fetchDocuments} fetchDocuments * @param {validateDocumentsUniquenessByIndices} validateDocumentsUniquenessByIndices - * @param {validatePartialCompoundIndices} validatePartialCompoundIndices * @param {executeDataTriggers} executeDataTriggers - * @return {validateDocumentsBatchTransitionData} + * @return {validateDocumentsBatchTransitionState} */ function validateDocumentsBatchTransitionStateFactory( stateRepository, fetchDocuments, validateDocumentsUniquenessByIndices, - validatePartialCompoundIndices, executeDataTriggers, ) { /** @@ -221,11 +219,11 @@ function validateDocumentsBatchTransitionStateFactory( return result; } /** - * @typedef validateDocumentsBatchTransitionData + * @typedef validateDocumentsBatchTransitionState * @param {DocumentsBatchTransition} stateTransition * @return {ValidationResult} */ - async function validateDocumentsBatchTransitionData(stateTransition) { + async function validateDocumentsBatchTransitionState(stateTransition) { const result = new ValidationResult(); const ownerId = stateTransition.getOwnerId(); @@ -257,7 +255,7 @@ function validateDocumentsBatchTransitionStateFactory( return result; } - return validateDocumentsBatchTransitionData; + return validateDocumentsBatchTransitionState; } module.exports = validateDocumentsBatchTransitionStateFactory; diff --git a/lib/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.js b/lib/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.js index e16072c60..ca4fde6d1 100644 --- a/lib/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.js +++ b/lib/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.js @@ -5,22 +5,20 @@ const convertBuffersToArrays = require('../../../../../util/convertBuffersToArra /** * @param {JsonSchemaValidator} jsonSchemaValidator * @param {validatePublicKeys} validatePublicKeys - * @param {validateSignatureAgainstAssetLockPublicKey} validateSignatureAgainstAssetLockPublicKey * @param {Object.} proofValidationFunctionsByType - * @return {validateIdentityCreateTransitionStructure} + * @return {validateIdentityCreateTransitionBasic} */ function validateIdentityCreateTransitionBasicFactory( jsonSchemaValidator, validatePublicKeys, - validateSignatureAgainstAssetLockPublicKey, proofValidationFunctionsByType, ) { /** - * @typedef validateIdentityCreateTransitionStructure + * @typedef validateIdentityCreateTransitionBasic * @param {RawIdentityCreateTransition} rawStateTransition * @return {Promise} */ - async function validateIdentityCreateTransitionStructure(rawStateTransition) { + async function validateIdentityCreateTransitionBasic(rawStateTransition) { // Validate state transition against JSON Schema const result = jsonSchemaValidator.validate( identityCreateTransitionSchema, @@ -54,7 +52,7 @@ function validateIdentityCreateTransitionBasicFactory( return result; } - return validateIdentityCreateTransitionStructure; + return validateIdentityCreateTransitionBasic; } module.exports = validateIdentityCreateTransitionBasicFactory; diff --git a/lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.js b/lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.js index 06c878fc1..bba8c2b05 100644 --- a/lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.js +++ b/lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.js @@ -5,7 +5,7 @@ const IdentityAlreadyExistsError = require('../../../../../errors/IdentityAlread /** * @param {StateRepository} stateRepository * @param {validateIdentityPublicKeysUniqueness} validateIdentityPublicKeysUniqueness - * @return {validateIdentityCreateTransitionData} + * @return {validateIdentityCreateTransitionState} */ function validateIdentityCreateTransitionStateFactory( stateRepository, @@ -21,11 +21,11 @@ function validateIdentityCreateTransitionStateFactory( */ /** - * @typedef validateIdentityCreateTransitionData + * @typedef {validateIdentityCreateTransitionState} * @param {IdentityCreateTransition} stateTransition * @return {ValidationResult} */ - async function validateIdentityCreateTransitionData(stateTransition) { + async function validateIdentityCreateTransitionState(stateTransition) { const result = new ValidationResult(); // Check if identity with such id already exists @@ -49,7 +49,7 @@ function validateIdentityCreateTransitionStateFactory( return result; } - return validateIdentityCreateTransitionData; + return validateIdentityCreateTransitionState; } module.exports = validateIdentityCreateTransitionStateFactory; diff --git a/lib/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.js b/lib/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.js index 530309538..9ca3d453c 100644 --- a/lib/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.js +++ b/lib/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.js @@ -6,22 +6,20 @@ const Identifier = require('../../../../../identifier/Identifier'); /** * @param {JsonSchemaValidator} jsonSchemaValidator * @param {validateIdentityExistence} validateIdentityExistence - * @param {validateSignatureAgainstAssetLockPublicKey} validateSignatureAgainstAssetLockPublicKey * @param {Object.} proofValidationFunctionsByType - * @return {validateIdentityTopUpTransitionStructure} + * @return {validateIdentityTopUpTransitionBasic} */ function validateIdentityTopUpTransitionBasicFactory( jsonSchemaValidator, validateIdentityExistence, - validateSignatureAgainstAssetLockPublicKey, proofValidationFunctionsByType, ) { /** - * @typedef {validateIdentityTopUpTransitionStructure} + * @typedef {validateIdentityTopUpTransitionBasic} * @param {RawIdentityTopUpTransition} rawStateTransition * @return {ValidationResult} */ - async function validateIdentityTopUpTransitionStructure(rawStateTransition) { + async function validateIdentityTopUpTransitionBasic(rawStateTransition) { const result = jsonSchemaValidator.validate( identityTopUpTransitionSchema, convertBuffersToArrays(rawStateTransition), @@ -56,7 +54,7 @@ function validateIdentityTopUpTransitionBasicFactory( return result; } - return validateIdentityTopUpTransitionStructure; + return validateIdentityTopUpTransitionBasic; } module.exports = validateIdentityTopUpTransitionBasicFactory; diff --git a/lib/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.js b/lib/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.js index 3ad6ccc5e..6509d3d34 100644 --- a/lib/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.js +++ b/lib/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.js @@ -1,20 +1,20 @@ const ValidationResult = require('../../../../../validation/ValidationResult'); /** - * @return {validateIdentityTopUpTransitionData} + * @return {validateIdentityTopUpTransitionState} */ function validateIdentityTopUpTransitionStateFactory() { /** - * @typedef validateIdentityTopUpTransitionData + * @typedef {validateIdentityTopUpTransitionState} * @param {IdentityTopUpTransition} stateTransition - * @return {ValidationResult} + * @return {Promise} */ // eslint-disable-next-line no-unused-vars - async function validateIdentityTopUpTransitionData(stateTransition) { + async function validateIdentityTopUpTransitionState(stateTransition) { return new ValidationResult(); } - return validateIdentityTopUpTransitionData; + return validateIdentityTopUpTransitionState; } module.exports = validateIdentityTopUpTransitionStateFactory; diff --git a/lib/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHash.js b/lib/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHash.js new file mode 100644 index 000000000..a6fc3b9dd --- /dev/null +++ b/lib/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHash.js @@ -0,0 +1,49 @@ +const { Transaction } = require('@dashevo/dashcore-lib'); + +const InstantAssetLockProof = require('./instant/InstantAssetLockProof'); +const ChainAssetLockProof = require('./chain/ChainAssetLockProof'); + +/** + * @param {StateRepository} stateRepository + * @return {fetchAssetLockPublicKeyHash} + */ +function fetchAssetLockPublicKeyHashFactory(stateRepository) { + /** + * @typedef {fetchAssetLockPublicKeyHash} + * @param {InstantAssetLockProof|ChainAssetLockProof} assetLockProof + * @return {Promise} + */ + async function fetchAssetLockPublicKeyHash(assetLockProof) { + let transaction; + let outputIndex; + + if (assetLockProof instanceof InstantAssetLockProof) { + transaction = assetLockProof.getTransaction(); + outputIndex = assetLockProof.getOutputIndex(); + } else if (assetLockProof instanceof ChainAssetLockProof) { + const outPoint = Transaction.parseOutPointBuffer(assetLockProof.getOutPoint()); + + outputIndex = outPoint.outputIndex; + + const rawTransaction = await stateRepository.fetchTransaction(outPoint.transactionHash); + + if (!rawTransaction) { + throw new Error(); + } + + transaction = new Transaction(rawTransaction); + } + + const output = transaction.outputs[outputIndex]; + + if (!output) { + throw new Error(); + } + + return output.script.getData(); + } + + return fetchAssetLockPublicKeyHash; +} + +module.exports = fetchAssetLockPublicKeyHashFactory; diff --git a/lib/stateTransition/StateTransitionFacade.js b/lib/stateTransition/StateTransitionFacade.js index 0c8a5ec14..e3ea4fa75 100644 --- a/lib/stateTransition/StateTransitionFacade.js +++ b/lib/stateTransition/StateTransitionFacade.js @@ -13,15 +13,15 @@ const createStateTransitionFactory = require('./createStateTransitionFactory'); const validateDataContractFactory = require('../dataContract/validation/validateDataContractFactory'); const validateDataContractPatternsFactory = require('../dataContract/validation/validateDataContractPatternsFactory'); -const validateDataContractCreateTransitionStructureFactory = require('../dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory'); -const validateStateTransitionStructureFactory = require('./validation/validateStateTransitionBasicFactory'); -const validateDataContractCreateTransitionDataFactory = require('../dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory'); -const validateStateTransitionDataFactory = require('./validation/validateStateTransitionStateFactory'); -const validateDocumentsBatchTransitionStructureFactory = require('../document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory'); -const validateIdentityCreateTransitionDataFactory = require('../identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory'); -const validateIdentityTopUpTransitionDataFactory = require('../identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory'); -const validateIdentityCreateTransitionStructureFactory = require('../identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory'); -const validateIdentityTopUpTransitionStructureFactory = require('../identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory'); +const validateDataContractCreateTransitionBasicFactory = require('../dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory'); +const validateStateTransitionBasicFactory = require('./validation/validateStateTransitionBasicFactory'); +const validateDataContractCreateTransitionStateFactory = require('../dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory'); +const validateStateTransitionStateFactory = require('./validation/validateStateTransitionStateFactory'); +const validateDocumentsBatchTransitionBasicFactory = require('../document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory'); +const validateIdentityCreateTransitionStateFactory = require('../identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory'); +const validateIdentityTopUpTransitionStateFactory = require('../identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory'); +const validateIdentityCreateTransitionBasicFactory = require('../identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory'); +const validateIdentityTopUpTransitionBasicFactory = require('../identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory'); const validateIdentityPublicKeysUniquenessFactory = require('../identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityPublicKeysUniquenessFactory'); const validateStateTransitionSignatureFactory = require('./validation/validateStateTransitionIdentitySignatureFactory'); const validateStateTransitionFeeFactory = require('./validation/validateStateTransitionFeeFactory'); @@ -30,7 +30,7 @@ const enrichDataContractWithBaseSchema = require('../dataContract/enrichDataCont const findDuplicatesById = require('../document/stateTransition/DocumentsBatchTransition/validation/basic/findDuplicatesById'); const findDuplicatesByIndices = require('../document/stateTransition/DocumentsBatchTransition/validation/basic/findDuplicatesByIndices'); -const validateDocumentsBatchTransitionDataFactory = require('../document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory'); +const validateDocumentsBatchTransitionStateFactory = require('../document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory'); const fetchDocumentsFactory = require('../document/stateTransition/DocumentsBatchTransition/validation/state/fetchDocumentsFactory'); const validateDocumentsUniquenessByIndicesFactory = require('../document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory'); const validatePartialCompoundIndices = require('../document/stateTransition/DocumentsBatchTransition/validation/basic/validatePartialCompoundIndices'); @@ -97,24 +97,21 @@ class StateTransitionFacade { const validateIdentityExistence = validateIdentityExistenceFactory(this.stateRepository); // eslint-disable-next-line max-len - const validateDataContractCreateTransitionStructure = validateDataContractCreateTransitionStructureFactory( + const validateDataContractCreateTransitionBasic = validateDataContractCreateTransitionBasicFactory( validator, validateDataContract, - validateStateTransitionSignature, - validateIdentityExistence, ); this.createStateTransition = createStateTransitionFactory(this.stateRepository); - const validateDocumentsBatchTransitionStructure = ( - validateDocumentsBatchTransitionStructureFactory( + const validateDocumentsBatchTransitionBasic = ( + validateDocumentsBatchTransitionBasicFactory( findDuplicatesById, findDuplicatesByIndices, - validateStateTransitionSignature, - validateIdentityExistence, this.stateRepository, validator, enrichDataContractWithBaseSchema, + validatePartialCompoundIndices, ) ); @@ -148,38 +145,36 @@ class StateTransitionFacade { validator, ); - const validateIdentityCreateTransitionStructure = ( - validateIdentityCreateTransitionStructureFactory( + const validateIdentityCreateTransitionBasic = ( + validateIdentityCreateTransitionBasicFactory( validator, validatePublicKeys, - validateSignatureAgainstAssetLockPublicKey, proofValidationFunctionsByType, ) ); - const validateIdentityTopUpTransitionStructure = ( - validateIdentityTopUpTransitionStructureFactory( + const validateIdentityTopUpTransitionBasic = ( + validateIdentityTopUpTransitionBasicFactory( validator, validateIdentityExistence, - validateSignatureAgainstAssetLockPublicKey, proofValidationFunctionsByType, ) ); const validationFunctionsByType = { - [stateTransitionTypes.DATA_CONTRACT_CREATE]: validateDataContractCreateTransitionStructure, - [stateTransitionTypes.DOCUMENTS_BATCH]: validateDocumentsBatchTransitionStructure, - [stateTransitionTypes.IDENTITY_CREATE]: validateIdentityCreateTransitionStructure, - [stateTransitionTypes.IDENTITY_TOP_UP]: validateIdentityTopUpTransitionStructure, + [stateTransitionTypes.DATA_CONTRACT_CREATE]: validateDataContractCreateTransitionBasic, + [stateTransitionTypes.DOCUMENTS_BATCH]: validateDocumentsBatchTransitionBasic, + [stateTransitionTypes.IDENTITY_CREATE]: validateIdentityCreateTransitionBasic, + [stateTransitionTypes.IDENTITY_TOP_UP]: validateIdentityTopUpTransitionBasic, }; - this.validateStateTransitionStructure = validateStateTransitionStructureFactory( + this.validateStateTransitionBasic = validateStateTransitionBasicFactory( validationFunctionsByType, this.createStateTransition, ); - const validateDataContractCreateTransitionData = ( - validateDataContractCreateTransitionDataFactory( + const validateDataContractCreateTransitionState = ( + validateDataContractCreateTransitionStateFactory( this.stateRepository, ) ); @@ -188,12 +183,12 @@ class StateTransitionFacade { this.stateRepository, ); - const validateIdentityCreateTransitionData = validateIdentityCreateTransitionDataFactory( + const validateIdentityCreateTransitionState = validateIdentityCreateTransitionStateFactory( this.stateRepository, validateIdentityPublicKeysUniqueness, ); - const validateIdentityTopUpTransitionData = validateIdentityTopUpTransitionDataFactory(); + const validateIdentityTopUpTransitionState = validateIdentityTopUpTransitionStateFactory(); const fetchDocuments = fetchDocumentsFactory( this.stateRepository, @@ -209,19 +204,18 @@ class StateTransitionFacade { getDataTriggers, ); - const validateDocumentsBatchTransitionData = validateDocumentsBatchTransitionDataFactory( + const validateDocumentsBatchTransitionState = validateDocumentsBatchTransitionStateFactory( this.stateRepository, fetchDocuments, validateDocumentsUniquenessByIndices, - validatePartialCompoundIndices, executeDataTriggers, ); - this.validateStateTransitionData = validateStateTransitionDataFactory({ - [stateTransitionTypes.DATA_CONTRACT_CREATE]: validateDataContractCreateTransitionData, - [stateTransitionTypes.DOCUMENTS_BATCH]: validateDocumentsBatchTransitionData, - [stateTransitionTypes.IDENTITY_CREATE]: validateIdentityCreateTransitionData, - [stateTransitionTypes.IDENTITY_TOP_UP]: validateIdentityTopUpTransitionData, + this.validateStateTransitionState = validateStateTransitionStateFactory({ + [stateTransitionTypes.DATA_CONTRACT_CREATE]: validateDataContractCreateTransitionState, + [stateTransitionTypes.DOCUMENTS_BATCH]: validateDocumentsBatchTransitionState, + [stateTransitionTypes.IDENTITY_CREATE]: validateIdentityCreateTransitionState, + [stateTransitionTypes.IDENTITY_TOP_UP]: validateIdentityTopUpTransitionState, }); const fetchAssetLockTransactionOutput = fetchAssetLockTransactionOutputFactory( @@ -235,7 +229,7 @@ class StateTransitionFacade { ); this.factory = new StateTransitionFactory( - this.validateStateTransitionStructure, + this.validateStateTransitionBasic, this.createStateTransition, ); @@ -408,7 +402,7 @@ class StateTransitionFacade { rawStateTransition = stateTransition; } - return this.validateStateTransitionStructure(rawStateTransition); + return this.validateStateTransitionBasic(rawStateTransition); } /** @@ -466,7 +460,7 @@ class StateTransitionFacade { ); } - return this.validateStateTransitionData(stateTransition); + return this.validateStateTransitionState(stateTransition); } /** diff --git a/lib/stateTransition/StateTransitionFactory.js b/lib/stateTransition/StateTransitionFactory.js index c8016db83..b4884ea42 100644 --- a/lib/stateTransition/StateTransitionFactory.js +++ b/lib/stateTransition/StateTransitionFactory.js @@ -5,14 +5,14 @@ const SerializedObjectParsingError = require('../errors/SerializedObjectParsingE class StateTransitionFactory { /** - * @param {validateStateTransitionStructure} validateStateTransitionStructure + * @param {validateStateTransitionBasic} validateStateTransitionBasic * @param {createStateTransition} createStateTransition */ constructor( - validateStateTransitionStructure, + validateStateTransitionBasic, createStateTransition, ) { - this.validateStateTransitionStructure = validateStateTransitionStructure; + this.validateStateTransitionBasic = validateStateTransitionBasic; this.createStateTransition = createStateTransition; } @@ -28,7 +28,7 @@ class StateTransitionFactory { const opts = { skipValidation: false, ...options }; if (!opts.skipValidation) { - const result = await this.validateStateTransitionStructure(rawStateTransition); + const result = await this.validateStateTransitionBasic(rawStateTransition); if (!result.isValid()) { throw new InvalidStateTransitionError(result.getErrors(), rawStateTransition); diff --git a/lib/stateTransition/validation/validateStateTransitionBasicFactory.js b/lib/stateTransition/validation/validateStateTransitionBasicFactory.js index d0b4f9ac4..9de3e46db 100644 --- a/lib/stateTransition/validation/validateStateTransitionBasicFactory.js +++ b/lib/stateTransition/validation/validateStateTransitionBasicFactory.js @@ -8,17 +8,17 @@ const MaxEncodedBytesReachedError = require('../../util/errors/MaxEncodedBytesRe /** * @param {Object.} validationFunctionsByType * @param {createStateTransition} createStateTransition - * @return {validateStateTransitionStructure} + * @return {validateStateTransitionBasic} */ function validateStateTransitionBasicFactory( validationFunctionsByType, createStateTransition, ) { /** - * @typedef validateStateTransitionStructure + * @typedef validateStateTransitionBasic * @param {RawStateTransition} rawStateTransition */ - async function validateStateTransitionStructure(rawStateTransition) { + async function validateStateTransitionBasic(rawStateTransition) { const result = new ValidationResult(); if (!Object.prototype.hasOwnProperty.call(rawStateTransition, 'type')) { @@ -64,7 +64,7 @@ function validateStateTransitionBasicFactory( return result; } - return validateStateTransitionStructure; + return validateStateTransitionBasic; } module.exports = validateStateTransitionBasicFactory; diff --git a/lib/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.js b/lib/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.js index f078fe9a4..da239021b 100644 --- a/lib/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.js +++ b/lib/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.js @@ -1,4 +1,3 @@ -const ValidationResult = require('../../validation/ValidationResult'); const IdentityPublicKey = require('../../identity/IdentityPublicKey'); const InvalidIdentityPublicKeyTypeError = require('../../errors/InvalidIdentityPublicKeyTypeError'); const InvalidStateTransitionSignatureError = require('../../errors/InvalidStateTransitionSignatureError'); @@ -7,12 +6,10 @@ const MissingPublicKeyError = require('../../errors/MissingPublicKeyError'); /** * Validate state transition signature * - * @param {StateRepository} stateRepository * @param {validateIdentityExistence} validateIdentityExistence - * @returns {validateStateTransitionSignature} + * @returns {validateStateTransitionIdentitySignature} */ function validateStateTransitionIdentitySignatureFactory( - stateRepository, validateIdentityExistence, ) { /** @@ -24,14 +21,8 @@ function validateStateTransitionIdentitySignatureFactory( * @returns {Promise} */ async function validateStateTransitionIdentitySignature(stateTransition) { - const result = new ValidationResult(); - - if (stateTransition instanceof AbstractStateTransitionIdentitySigned) - // Owner must exist - result.merge( - await validateIdentityExistence(stateTransition.getOwnerId()), - ); + const result = await validateIdentityExistence(stateTransition.getOwnerId()); if (!result.isValid()) { return result; diff --git a/lib/stateTransition/validation/validateStateTransitionKeySignatureFactory.js b/lib/stateTransition/validation/validateStateTransitionKeySignatureFactory.js index aa50776f7..6c398e779 100644 --- a/lib/stateTransition/validation/validateStateTransitionKeySignatureFactory.js +++ b/lib/stateTransition/validation/validateStateTransitionKeySignatureFactory.js @@ -5,22 +5,22 @@ const ValidationResult = require('../../validation/ValidationResult'); /** * @param {createStateTransition} createStateTransition * @param {Function} verifyHashSignature + * @param {fetchAssetLockPublicKeyHash} fetchAssetLockPublicKeyHash * @returns {validateSignatureAgainstAssetLockPublicKey} */ function validateStateTransitionKeySignatureFactory( createStateTransition, verifyHashSignature, + fetchAssetLockPublicKeyHash, ) { /** * @typedef {validateSignatureAgainstAssetLockPublicKey} - * @param {RawStateTransition} rawStateTransition - * @param {Buffer} publicKeyHash + * @param {IdentityCreateTransition|IdentityTopUpTransition} stateTransition * @returns {Promise} */ - async function validateSignatureAgainstAssetLockPublicKey(rawStateTransition, publicKeyHash) { + async function validateSignatureAgainstAssetLockPublicKey(stateTransition) { const result = new ValidationResult(); - const stateTransition = await createStateTransition(rawStateTransition); const stateTransitionHash = stateTransition.hash({ skipSignature: true }); let signatureIsVerified; @@ -29,7 +29,7 @@ function validateStateTransitionKeySignatureFactory( signatureIsVerified = verifyHashSignature( stateTransitionHash, stateTransition.getSignature(), - publicKeyHash, + fetchAssetLockPublicKeyHash(stateTransition.getAssetLockProof()), ); } catch (e) { signatureIsVerified = false; diff --git a/lib/stateTransition/validation/validateStateTransitionStateFactory.js b/lib/stateTransition/validation/validateStateTransitionStateFactory.js index 029946c97..88636d93e 100644 --- a/lib/stateTransition/validation/validateStateTransitionStateFactory.js +++ b/lib/stateTransition/validation/validateStateTransitionStateFactory.js @@ -4,15 +4,15 @@ const InvalidStateTransitionTypeError = require('../../errors/InvalidStateTransi /** * @param {Object} validationFunctions - * @return {validateStateTransitionData} + * @return {validateStateTransitionState} */ function validateStateTransitionStateFactory(validationFunctions) { /** - * @typedef validateStateTransitionData + * @typedef {validateStateTransitionState} * @param {AbstractStateTransition} stateTransition * @return {ValidationResult} */ - async function validateStateTransitionData(stateTransition) { + async function validateStateTransitionState(stateTransition) { const result = new ValidationResult(); const validationFunction = validationFunctions[stateTransition.getType()]; @@ -28,7 +28,7 @@ function validateStateTransitionStateFactory(validationFunctions) { return validationFunction(stateTransition); } - return validateStateTransitionData; + return validateStateTransitionState; } module.exports = validateStateTransitionStateFactory; diff --git a/test/integration/identity/stateTransition/identityCreateTransition/validateIdentityCreateTransitionStructureFactory.spec.js b/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js similarity index 70% rename from test/integration/identity/stateTransition/identityCreateTransition/validateIdentityCreateTransitionStructureFactory.spec.js rename to test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js index 03dc4f57f..347172bfa 100644 --- a/test/integration/identity/stateTransition/identityCreateTransition/validateIdentityCreateTransitionStructureFactory.spec.js +++ b/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js @@ -1,31 +1,30 @@ const { default: getRE2Class } = require('@dashevo/re2-wasm'); -const createAjv = require('../../../../../lib/ajv/createAjv'); +const createAjv = require('../../../../../../../lib/ajv/createAjv'); -const JsonSchemaValidator = require('../../../../../lib/validation/JsonSchemaValidator'); +const JsonSchemaValidator = require('../../../../../../../lib/validation/JsonSchemaValidator'); -const getIdentityCreateTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityCreateTransitionFixture'); +const getIdentityCreateTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityCreateTransitionFixture'); -const validateIdentityCreateTransitionStructureFactory = require( - '../../../../../lib/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory', +const validateIdentityCreateTransitionBasicFactory = require( + '../../../../../../../lib/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory', ); const { expectJsonSchemaError, expectValidationError, -} = require('../../../../../lib/test/expect/expectError'); +} = require('../../../../../../../lib/test/expect/expectError'); -const ValidationResult = require('../../../../../lib/validation/ValidationResult'); -const ConsensusError = require('../../../../../lib/errors/ConsensusError'); -const InstantAssetLockProof = require('../../../../../lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); -const ChainAssetLockProof = require('../../../../../lib/identity/stateTransition/assetLockProof/chain/ChainAssetLockProof'); +const ValidationResult = require('../../../../../../../lib/validation/ValidationResult'); +const ConsensusError = require('../../../../../../../lib/errors/ConsensusError'); +const InstantAssetLockProof = require('../../../../../../../lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); +const ChainAssetLockProof = require('../../../../../../../lib/identity/stateTransition/assetLockProof/chain/ChainAssetLockProof'); -describe('validateIdentityCreateTransitionStructureFactory', () => { - let validateIdentityCreateTransitionStructure; +describe('validateIdentityCreateTransitionBasicFactory', () => { + let validateIdentityCreateTransitionBasic; let rawStateTransition; let stateTransition; let validatePublicKeysMock; - let validateSignatureAgainstAssetLockPublicKeyMock; let assetLockPublicKeyHash; let proofValidationFunctionsByTypeMock; @@ -39,9 +38,6 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { assetLockValidationResult.setData(assetLockPublicKeyHash); - validateSignatureAgainstAssetLockPublicKeyMock = this.sinonSandbox.stub() - .resolves(new ValidationResult()); - const RE2 = await getRE2Class(); const ajv = createAjv(RE2); @@ -55,10 +51,9 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { [ChainAssetLockProof.type]: this.sinonSandbox.stub().resolves(proofValidationResult), }; - validateIdentityCreateTransitionStructure = validateIdentityCreateTransitionStructureFactory( + validateIdentityCreateTransitionBasic = validateIdentityCreateTransitionBasicFactory( jsonSchemaValidator, validatePublicKeysMock, - validateSignatureAgainstAssetLockPublicKeyMock, proofValidationFunctionsByTypeMock, ); @@ -75,7 +70,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.protocolVersion; - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -89,7 +84,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be an integer', async () => { rawStateTransition.protocolVersion = '1'; - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -102,7 +97,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should not be less than 0', async () => { rawStateTransition.protocolVersion = -1; - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -115,7 +110,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should not be greater than current version (0)', async () => { rawStateTransition.protocolVersion = 1; - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -130,7 +125,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.type; - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -144,7 +139,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be equal to 2', async () => { rawStateTransition.type = 666; - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -160,7 +155,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.assetLockProof; - const result = await validateIdentityCreateTransitionStructure( + const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); @@ -176,7 +171,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be an object', async () => { rawStateTransition.assetLockProof = 1; - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result, 1); @@ -194,7 +189,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { proofValidationFunctionsByTypeMock[InstantAssetLockProof.type].resolves(assetLockResult); - const result = await validateIdentityCreateTransitionStructure( + const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); @@ -215,7 +210,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be present', async () => { rawStateTransition.publicKeys = undefined; - const result = await validateIdentityCreateTransitionStructure( + const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); @@ -231,7 +226,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should not be empty', async () => { rawStateTransition.publicKeys = []; - const result = await validateIdentityCreateTransitionStructure( + const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); @@ -250,7 +245,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { rawStateTransition.publicKeys.push(key); } - const result = await validateIdentityCreateTransitionStructure( + const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); @@ -265,7 +260,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be unique', async () => { rawStateTransition.publicKeys.push(rawStateTransition.publicKeys[0]); - const result = await validateIdentityCreateTransitionStructure( + const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); @@ -285,7 +280,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { validatePublicKeysMock.returns(publicKeysResult); - const result = await validateIdentityCreateTransitionStructure( + const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); @@ -303,7 +298,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.signature; - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -317,7 +312,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be a byte array', async () => { rawStateTransition.signature = new Array(65).fill('string'); - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result, 2); @@ -332,7 +327,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be not shorter than 65 bytes', async () => { rawStateTransition.signature = Buffer.alloc(64); - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -345,7 +340,7 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { it('should be not longer than 65 bytes', async () => { rawStateTransition.signature = Buffer.alloc(66); - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -354,34 +349,10 @@ describe('validateIdentityCreateTransitionStructureFactory', () => { expect(error.instancePath).to.equal('/signature'); expect(error.keyword).to.equal('maxItems'); }); - - it('should be valid', async () => { - const signatureError = new ConsensusError('test'); - const signatureResult = new ValidationResult([ - signatureError, - ]); - - validateSignatureAgainstAssetLockPublicKeyMock.returns(signatureResult); - - const result = await validateIdentityCreateTransitionStructure( - rawStateTransition, - ); - - expectValidationError(result); - - const [error] = result.getErrors(); - - expect(error).to.equal(signatureError); - - expect(validateSignatureAgainstAssetLockPublicKeyMock).to.be.calledOnceWithExactly( - rawStateTransition, - assetLockPublicKeyHash, - ); - }); }); it('should return valid result', async () => { - const result = await validateIdentityCreateTransitionStructure(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expect(result.isValid()).to.be.true(); diff --git a/test/integration/identity/stateTransition/identityTopUpTransition/validateIdentityTopUpTransitionStructureFactory.spec.js b/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js similarity index 70% rename from test/integration/identity/stateTransition/identityTopUpTransition/validateIdentityTopUpTransitionStructureFactory.spec.js rename to test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js index 0e84182ae..889a59acb 100644 --- a/test/integration/identity/stateTransition/identityTopUpTransition/validateIdentityTopUpTransitionStructureFactory.spec.js +++ b/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js @@ -1,34 +1,33 @@ const { default: getRE2Class } = require('@dashevo/re2-wasm'); -const createAjv = require('../../../../../lib/ajv/createAjv'); +const createAjv = require('../../../../../../../lib/ajv/createAjv'); -const JsonSchemaValidator = require('../../../../../lib/validation/JsonSchemaValidator'); +const JsonSchemaValidator = require('../../../../../../../lib/validation/JsonSchemaValidator'); -const getIdentityTopUpTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); +const getIdentityTopUpTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); -const validateIdentityTopUpTransitionStructureFactory = require( - '../../../../../lib/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory', +const validateIdentityTopUpTransitionBasicFactory = require( + '../../../../../../../lib/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory', ); const { expectJsonSchemaError, expectValidationError, -} = require('../../../../../lib/test/expect/expectError'); +} = require('../../../../../../../lib/test/expect/expectError'); -const ValidationResult = require('../../../../../lib/validation/ValidationResult'); +const ValidationResult = require('../../../../../../../lib/validation/ValidationResult'); -const ConsensusError = require('../../../../../lib/errors/ConsensusError'); -const IdentityNotFoundError = require('../../../../../lib/errors/IdentityNotFoundError'); -const Identifier = require('../../../../../lib/identifier/Identifier'); -const ChainAssetLockProof = require('../../../../../lib/identity/stateTransition/assetLockProof/chain/ChainAssetLockProof'); -const InstantAssetLockProof = require('../../../../../lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); +const ConsensusError = require('../../../../../../../lib/errors/ConsensusError'); +const IdentityNotFoundError = require('../../../../../../../lib/errors/IdentityNotFoundError'); +const Identifier = require('../../../../../../../lib/identifier/Identifier'); +const ChainAssetLockProof = require('../../../../../../../lib/identity/stateTransition/assetLockProof/chain/ChainAssetLockProof'); +const InstantAssetLockProof = require('../../../../../../../lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); -describe('validateIdentityTopUpTransitionStructureFactory', () => { +describe('validateIdentityTopUpTransitionBasicFactory', () => { let rawStateTransition; let stateTransition; let assetLockPublicKeyHash; - let validateIdentityTopUpTransitionStructure; - let validateSignatureAgainstAssetLockPublicKeyMock; + let validateIdentityTopUpTransitionBasic; let validateIdentityExistenceMock; let proofValidationFunctionsByTypeMock; @@ -45,18 +44,14 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { [ChainAssetLockProof.type]: this.sinonSandbox.stub().resolves(assetLockValidationResult), }; - validateSignatureAgainstAssetLockPublicKeyMock = this.sinonSandbox.stub() - .resolves(new ValidationResult()); - const RE2 = await getRE2Class(); const ajv = createAjv(RE2); const jsonSchemaValidator = new JsonSchemaValidator(ajv); - validateIdentityTopUpTransitionStructure = validateIdentityTopUpTransitionStructureFactory( + validateIdentityTopUpTransitionBasic = validateIdentityTopUpTransitionBasicFactory( jsonSchemaValidator, validateIdentityExistenceMock, - validateSignatureAgainstAssetLockPublicKeyMock, proofValidationFunctionsByTypeMock, ); @@ -73,7 +68,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.protocolVersion; - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -87,7 +82,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be an integer', async () => { rawStateTransition.protocolVersion = '1'; - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -100,7 +95,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should not be less than 0', async () => { rawStateTransition.protocolVersion = -1; - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -113,7 +108,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should not be greater than current version (0)', async () => { rawStateTransition.protocolVersion = 1; - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -128,7 +123,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.type; - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -142,7 +137,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be equal to 3', async () => { rawStateTransition.type = 666; - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -158,7 +153,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.assetLockProof; - const result = await validateIdentityTopUpTransitionStructure( + const result = await validateIdentityTopUpTransitionBasic( rawStateTransition, ); @@ -174,7 +169,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be an object', async () => { rawStateTransition.assetLockProof = 1; - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result, 1); @@ -192,7 +187,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { proofValidationFunctionsByTypeMock[InstantAssetLockProof.type].resolves(assetLockResult); - const result = await validateIdentityTopUpTransitionStructure( + const result = await validateIdentityTopUpTransitionBasic( rawStateTransition, ); @@ -213,7 +208,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.identityId; - const result = await validateIdentityTopUpTransitionStructure( + const result = await validateIdentityTopUpTransitionBasic( rawStateTransition, ); @@ -229,7 +224,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be a byte array', async () => { rawStateTransition.identityId = new Array(32).fill('string'); - const result = await validateIdentityTopUpTransitionStructure( + const result = await validateIdentityTopUpTransitionBasic( rawStateTransition, ); @@ -246,7 +241,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be no less than 32 bytes', async () => { rawStateTransition.identityId = Buffer.alloc(31); - const result = await validateIdentityTopUpTransitionStructure( + const result = await validateIdentityTopUpTransitionBasic( rawStateTransition, ); @@ -261,7 +256,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be no longer than 32 bytes', async () => { rawStateTransition.identityId = Buffer.alloc(33); - const result = await validateIdentityTopUpTransitionStructure( + const result = await validateIdentityTopUpTransitionBasic( rawStateTransition, ); @@ -280,7 +275,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { validateIdentityExistenceMock.resolves(identityNotFoundResult); - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectValidationError(result, IdentityNotFoundError); @@ -303,7 +298,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be present', async () => { delete rawStateTransition.signature; - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -317,7 +312,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be a byte array', async () => { rawStateTransition.signature = new Array(65).fill('string'); - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result, 2); @@ -332,7 +327,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be not shorter than 65 bytes', async () => { rawStateTransition.signature = Buffer.alloc(64); - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -345,7 +340,7 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { it('should be not longer than 65 bytes', async () => { rawStateTransition.signature = Buffer.alloc(66); - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expectJsonSchemaError(result); @@ -354,34 +349,10 @@ describe('validateIdentityTopUpTransitionStructureFactory', () => { expect(error.instancePath).to.equal('/signature'); expect(error.keyword).to.equal('maxItems'); }); - - it('should be valid', async () => { - const signatureError = new ConsensusError('test'); - const signatureResult = new ValidationResult([ - signatureError, - ]); - - validateSignatureAgainstAssetLockPublicKeyMock.returns(signatureResult); - - const result = await validateIdentityTopUpTransitionStructure( - rawStateTransition, - ); - - expectValidationError(result); - - const [error] = result.getErrors(); - - expect(error).to.equal(signatureError); - - expect(validateSignatureAgainstAssetLockPublicKeyMock).to.be.calledOnceWithExactly( - rawStateTransition, - assetLockPublicKeyHash, - ); - }); }); it('should return valid result', async () => { - const result = await validateIdentityTopUpTransitionStructure(rawStateTransition); + const result = await validateIdentityTopUpTransitionBasic(rawStateTransition); expect(result.isValid()).to.be.true(); diff --git a/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js b/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js index d3d0dbc0c..18290cd06 100644 --- a/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +++ b/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js @@ -57,7 +57,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { }; validateInstantAssetLockProofStructureFactory = rewiremock.proxy( - '../../../../../../lib/identity/stateTransitions/assetLockProof/instant/validateInstantAssetLockProofStructureFactory', + '../../../../../../lib/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory', { '../../../../../../node_modules/@dashevo/dashcore-lib': { InstantLock: InstantLockClassMock, diff --git a/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js b/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js index 89e37802d..8aa8f62d2 100644 --- a/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +++ b/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js @@ -11,7 +11,7 @@ const InvalidIdentityAssetLockTransactionOutputError = require('../../../../../l function getValidateAssetLockTransactionFactoryMock(TransactionClassMock) { return rewiremock.proxy( - '../../../../../lib/identity/stateTransitions/assetLockProof/validateAssetLockTransactionFactory', + '../../../../../lib/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory', { '../../../../../node_modules/@dashevo/dashcore-lib': { Transaction: TransactionClassMock, diff --git a/test/integration/identity/stateTransition/identityTopUpTransition/validateIdentityTopUpTransitionDataFactory.spec.js b/test/integration/identity/stateTransition/identityTopUpTransition/validateIdentityTopUpTransitionDataFactory.spec.js deleted file mode 100644 index e366dbc22..000000000 --- a/test/integration/identity/stateTransition/identityTopUpTransition/validateIdentityTopUpTransitionDataFactory.spec.js +++ /dev/null @@ -1,22 +0,0 @@ -const getIdentityTopUpTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); - -const validateIdentityTopUpTransitionDataFactory = require( - '../../../../../lib/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory', -); - -describe('validateIdentityTopUpTransitionDataFactory', () => { - let validateIdentityTopUpTransitionData; - let stateTransition; - - beforeEach(() => { - validateIdentityTopUpTransitionData = validateIdentityTopUpTransitionDataFactory(); - - stateTransition = getIdentityTopUpTransitionFixture(); - }); - - it('should return valid result', async () => { - const result = await validateIdentityTopUpTransitionData(stateTransition); - - expect(result.isValid()).to.be.true(); - }); -}); diff --git a/test/integration/stateTransition/StateTransitionFacade.spec.js b/test/integration/stateTransition/StateTransitionFacade.spec.js index 80f169c79..0313936f9 100644 --- a/test/integration/stateTransition/StateTransitionFacade.spec.js +++ b/test/integration/stateTransition/StateTransitionFacade.spec.js @@ -172,7 +172,58 @@ describe('StateTransitionFacade', () => { expect(validateDataSpy).to.not.be.called(); }); - it('should validate Data Contract ST structure and data', async function it() { + it('should return invalid result if State Transition signature is invalid', async function it() { + const validateDataSpy = this.sinonSandbox.spy( + dpp.stateTransition, + 'validateData', + ); + + const rawStateTransition = dataContractCreateTransition.toObject(); + delete rawStateTransition.protocolVersion; + + const result = await dpp.stateTransition.validate(rawStateTransition); + + expect(result).to.be.an.instanceOf(ValidationResult); + expect(result.isValid()).to.be.false(); + + expect(validateDataSpy).to.not.be.called(); + }); + + it('should return invalid result if not enough balance to pay fee for State Transition', async function it() { + const validateDataSpy = this.sinonSandbox.spy( + dpp.stateTransition, + 'validateData', + ); + + const rawStateTransition = dataContractCreateTransition.toObject(); + delete rawStateTransition.protocolVersion; + + const result = await dpp.stateTransition.validate(rawStateTransition); + + expect(result).to.be.an.instanceOf(ValidationResult); + expect(result.isValid()).to.be.false(); + + expect(validateDataSpy).to.not.be.called(); + }); + + it('should return invalid result if State Transition is invalid against state', async function it() { + const validateDataSpy = this.sinonSandbox.spy( + dpp.stateTransition, + 'validateData', + ); + + const rawStateTransition = dataContractCreateTransition.toObject(); + delete rawStateTransition.protocolVersion; + + const result = await dpp.stateTransition.validate(rawStateTransition); + + expect(result).to.be.an.instanceOf(ValidationResult); + expect(result.isValid()).to.be.false(); + + expect(validateDataSpy).to.not.be.called(); + }); + + it('should validate DataContractCreateTransition', async function it() { const validateStructureSpy = this.sinonSandbox.spy( dpp.stateTransition, 'validateStructure', @@ -194,7 +245,7 @@ describe('StateTransitionFacade', () => { expect(validateDataSpy).to.be.calledOnceWith(dataContractCreateTransition); }); - it('should validate Documents Batch Transition structure and data', async function it() { + it('should validate DocumentsBatchTransition', async function it() { stateRepositoryMock.fetchDocuments.resolves([]); stateRepositoryMock.fetchDataContract.resolves(dataContract); @@ -224,7 +275,7 @@ describe('StateTransitionFacade', () => { }); }); - describe('validateStructure', () => { + describe('validateBasic', () => { it('should throw MissingOption if stateRepository is not set', async () => { dpp = new DashPlatformProtocol(); await dpp.initialize(); @@ -251,14 +302,14 @@ describe('StateTransitionFacade', () => { }); }); - describe('validateData', () => { + describe('validateSignature', () => { it('should throw MissingOption if stateRepository is not set', async () => { dpp = new DashPlatformProtocol(); await dpp.initialize(); try { - await dpp.stateTransition.validateData( - dataContractCreateTransition, + await dpp.stateTransition.validateStructure( + dataContractCreateTransition.toObject(), ); expect.fail('MissingOption should be thrown'); @@ -269,8 +320,8 @@ describe('StateTransitionFacade', () => { }); it('should validate State Transition', async () => { - const result = await dpp.stateTransition.validateData( - dataContractCreateTransition, + const result = await dpp.stateTransition.validateStructure( + dataContractCreateTransition.toObject(), ); expect(result).to.be.an.instanceOf(ValidationResult); @@ -304,4 +355,31 @@ describe('StateTransitionFacade', () => { expect(result.isValid()).to.be.true(); }); }); + + describe('validateState', () => { + it('should throw MissingOption if stateRepository is not set', async () => { + dpp = new DashPlatformProtocol(); + await dpp.initialize(); + + try { + await dpp.stateTransition.validateData( + dataContractCreateTransition, + ); + + expect.fail('MissingOption should be thrown'); + } catch (e) { + expect(e).to.be.an.instanceOf(MissingOptionError); + expect(e.getOptionName()).to.equal('stateRepository'); + } + }); + + it('should validate State Transition', async () => { + const result = await dpp.stateTransition.validateData( + dataContractCreateTransition, + ); + + expect(result).to.be.an.instanceOf(ValidationResult); + expect(result.isValid()).to.be.true(); + }); + }); }); diff --git a/test/unit/dataContract/DataContractFactory.spec.js b/test/unit/dataContract/DataContractFactory.spec.js index 26be94e73..72f2fa89b 100644 --- a/test/unit/dataContract/DataContractFactory.spec.js +++ b/test/unit/dataContract/DataContractFactory.spec.js @@ -43,7 +43,7 @@ describe('DataContractFactory', () => { DataContractFactory = rewiremock.proxy('../../../lib/dataContract/DataContractFactory', { '../../../lib/util/serializer': { decode: decodeMock }, '../../../lib/util/generateEntropy': generateEntropyMock, - '../../../lib/dataContract/stateTransition/DataContractCreateTransition': DataContractCreateTransition, + '../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition': DataContractCreateTransition, '../../../lib/dataContract/DataContract': DataContractMock, }); diff --git a/test/unit/dataContract/stateTransition/DataContractCreateTransition.spec.js b/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js similarity index 88% rename from test/unit/dataContract/stateTransition/DataContractCreateTransition.spec.js rename to test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js index 226d7f763..001fab0fa 100644 --- a/test/unit/dataContract/stateTransition/DataContractCreateTransition.spec.js +++ b/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js @@ -1,10 +1,10 @@ const rewiremock = require('rewiremock/node'); -const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture'); -const stateTransitionTypes = require('../../../../lib/stateTransition/stateTransitionTypes'); +const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); +const stateTransitionTypes = require('../../../../../lib/stateTransition/stateTransitionTypes'); -const Identifier = require('../../../../lib/identifier/Identifier'); -const { protocolVersion } = require('../../../../lib/protocolVersion'); +const Identifier = require('../../../../../lib/identifier/Identifier'); +const { protocolVersion } = require('../../../../../lib/protocolVersion'); describe('DataContractCreateTransition', () => { let stateTransition; @@ -17,9 +17,9 @@ describe('DataContractCreateTransition', () => { const serializerMock = { encode: this.sinonSandbox.stub() }; encodeMock = serializerMock.encode; - const DataContractCreateTransition = rewiremock.proxy('../../../../lib/dataContract/stateTransition/DataContractCreateTransition', { - '../../../../lib/util/hash': hashMock, - '../../../../lib/util/serializer': serializerMock, + const DataContractCreateTransition = rewiremock.proxy('../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition', { + '../../../../../lib/util/hash': hashMock, + '../../../../../lib/util/serializer': serializerMock, }); dataContract = getDataContractFixture(); diff --git a/test/unit/dataContract/stateTransition/applyDataContractCreateTransitionFactory.spec.js b/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js similarity index 69% rename from test/unit/dataContract/stateTransition/applyDataContractCreateTransitionFactory.spec.js rename to test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js index 2aca8ba73..3774387e5 100644 --- a/test/unit/dataContract/stateTransition/applyDataContractCreateTransitionFactory.spec.js +++ b/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js @@ -1,14 +1,14 @@ const DataContractCreateTransition = require( - '../../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition', + '../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition', ); -const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture'); +const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); const applyDataContractCreateTransitionFactory = require( - '../../../../lib/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory', + '../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory', ); -const createStateRepositoryMock = require('../../../../lib/test/mocks/createStateRepositoryMock'); +const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock'); describe('applyDataContractCreateTransitionFactory', () => { let stateTransition; diff --git a/test/unit/dataContract/stateTransition/validation/validateDataContractCreateTransitionDataFactory.spec.js b/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js similarity index 50% rename from test/unit/dataContract/stateTransition/validation/validateDataContractCreateTransitionDataFactory.spec.js rename to test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js index e4ee0d3ab..8471d1874 100644 --- a/test/unit/dataContract/stateTransition/validation/validateDataContractCreateTransitionDataFactory.spec.js +++ b/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js @@ -1,17 +1,17 @@ -const validateDataContractCreateTransitionDataFactory = require('../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory'); -const DataContractCreateTransition = require('../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition'); +const validateDataContractCreateTransitionStateFactory = require('../../../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory'); +const DataContractCreateTransition = require('../../../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition'); -const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock'); -const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); +const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock'); +const getDataContractFixture = require('../../../../../../../lib/test/fixtures/getDataContractFixture'); -const { expectValidationError } = require('../../../../../lib/test/expect/expectError'); +const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError'); -const ValidationResult = require('../../../../../lib/validation/ValidationResult'); +const ValidationResult = require('../../../../../../../lib/validation/ValidationResult'); -const DataContractAlreadyPresentError = require('../../../../../lib/errors/DataContractAlreadyPresentError'); +const DataContractAlreadyPresentError = require('../../../../../../../lib/errors/DataContractAlreadyPresentError'); -describe('validateDataContractCreateTransitionDataFactory', () => { - let validateDataContractCreateTransitionData; +describe('validateDataContractCreateTransitionStateFactory', () => { + let validateDataContractCreateTransitionState; let dataContract; let stateTransition; let stateRepositoryMock; @@ -25,7 +25,7 @@ describe('validateDataContractCreateTransitionDataFactory', () => { entropy: dataContract.getEntropy(), }); - validateDataContractCreateTransitionData = validateDataContractCreateTransitionDataFactory( + validateDataContractCreateTransitionState = validateDataContractCreateTransitionStateFactory( stateRepositoryMock, ); }); @@ -33,7 +33,7 @@ describe('validateDataContractCreateTransitionDataFactory', () => { it('should return invalid result if Data Contract with specified contractId is already exist', async () => { stateRepositoryMock.fetchDataContract.resolves(dataContract); - const result = await validateDataContractCreateTransitionData(stateTransition); + const result = await validateDataContractCreateTransitionState(stateTransition); expectValidationError(result, DataContractAlreadyPresentError); @@ -45,7 +45,7 @@ describe('validateDataContractCreateTransitionDataFactory', () => { }); it('should return valid result', async () => { - const result = await validateDataContractCreateTransitionData(stateTransition); + const result = await validateDataContractCreateTransitionState(stateTransition); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); diff --git a/test/unit/dataContract/stateTransition/validation/validateDataContractMaxDepthFactory.spec.js b/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js similarity index 83% rename from test/unit/dataContract/stateTransition/validation/validateDataContractMaxDepthFactory.spec.js rename to test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js index c21323e64..5a354309d 100644 --- a/test/unit/dataContract/stateTransition/validation/validateDataContractMaxDepthFactory.spec.js +++ b/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js @@ -1,9 +1,9 @@ -const validateDataContractMaxDepthFactory = require('../../../../../lib/dataContract/validation/validateDataContractMaxDepthFactory'); -const ValidationResult = require('../../../../../lib/validation/ValidationResult'); -const { expectValidationError } = require('../../../../../lib/test/expect/expectError'); -const DataContractMaxDepthExceedError = require('../../../../../lib/errors/DataContractMaxDepthExceedError'); -const JsonSchemaError = require('../../../../../lib/errors/JsonSchemaError'); -const generateDeepJson = require('../../../../../lib/test/utils/generateDeepJson'); +const validateDataContractMaxDepthFactory = require('../../../../lib/dataContract/validation/validateDataContractMaxDepthFactory'); +const ValidationResult = require('../../../../lib/validation/ValidationResult'); +const { expectValidationError } = require('../../../../lib/test/expect/expectError'); +const DataContractMaxDepthExceedError = require('../../../../lib/errors/DataContractMaxDepthExceedError'); +const JsonSchemaError = require('../../../../lib/errors/JsonSchemaError'); +const generateDeepJson = require('../../../../lib/test/utils/generateDeepJson'); describe('validateDataContractMaxDepthFactory', () => { let refParserMock; diff --git a/test/unit/dataContract/validateDataContractPatternsFactory.spec.js b/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js similarity index 84% rename from test/unit/dataContract/validateDataContractPatternsFactory.spec.js rename to test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js index 6c40c24e2..05310184f 100644 --- a/test/unit/dataContract/validateDataContractPatternsFactory.spec.js +++ b/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js @@ -1,10 +1,10 @@ const getRE2Class = require('@dashevo/re2-wasm').default; -const validateDataContractPatternsFactory = require('../../../lib/dataContract/validation/validateDataContractPatternsFactory'); +const validateDataContractPatternsFactory = require('../../../../lib/dataContract/validation/validateDataContractPatternsFactory'); const { expectValidationError } = require( - '../../../lib/test/expect/expectError', + '../../../../lib/test/expect/expectError', ); -const IncompatibleRe2PatternError = require('../../../lib/document/errors/IncompatibleRe2PatternError'); +const IncompatibleRe2PatternError = require('../../../../lib/document/errors/IncompatibleRe2PatternError'); describe('validateDataContractPatternsFactory', () => { let validateDataContractPatterns; diff --git a/test/unit/document/DocumentFactory.spec.js b/test/unit/document/DocumentFactory.spec.js index b4872ef35..62bd9088d 100644 --- a/test/unit/document/DocumentFactory.spec.js +++ b/test/unit/document/DocumentFactory.spec.js @@ -69,7 +69,7 @@ describe('DocumentFactory', () => { '../../../lib/util/serializer': { decode: decodeMock }, '../../../lib/util/generateEntropy': generateEntropyMock, '../../../lib/document/Document': Document, - '../../../lib/document/stateTransition/DocumentsBatchTransition': DocumentsBatchTransition, + '../../../lib/document/stateTransition/DocumentsBatchTransition/DocumentsBatchTransition': DocumentsBatchTransition, }); factory = new DocumentFactory( diff --git a/test/unit/document/stateTransition/DocumentsBatchTransition.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js similarity index 89% rename from test/unit/document/stateTransition/DocumentsBatchTransition.spec.js rename to test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js index fe04d546f..ac84692db 100644 --- a/test/unit/document/stateTransition/DocumentsBatchTransition.spec.js +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js @@ -1,9 +1,9 @@ const rewiremock = require('rewiremock/node'); -const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('../../../../lib/test/fixtures/getDocumentsFixture'); -const stateTransitionTypes = require('../../../../lib/stateTransition/stateTransitionTypes'); -const createDPPMock = require('../../../../lib/test/mocks/createDPPMock'); +const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); +const getDocumentsFixture = require('../../../../../lib/test/fixtures/getDocumentsFixture'); +const stateTransitionTypes = require('../../../../../lib/stateTransition/stateTransitionTypes'); +const createDPPMock = require('../../../../../lib/test/mocks/createDPPMock'); describe('DocumentsBatchTransition', () => { let stateTransition; @@ -20,9 +20,9 @@ describe('DocumentsBatchTransition', () => { const serializerMock = { encode: this.sinonSandbox.stub() }; encodeMock = serializerMock.encode; - const DocumentFactory = rewiremock.proxy('../../../../lib/document/DocumentFactory', { - '../../../../lib/util/hash': hashMock, - '../../../../lib/util/serializer': serializerMock, + const DocumentFactory = rewiremock.proxy('../../../../../lib/document/DocumentFactory', { + '../../../../../lib/util/hash': hashMock, + '../../../../../lib/util/serializer': serializerMock, }); const factory = new DocumentFactory(createDPPMock(), undefined, undefined); diff --git a/test/unit/document/stateTransition/applyDocumentsBatchTransitionFactory.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js similarity index 78% rename from test/unit/document/stateTransition/applyDocumentsBatchTransitionFactory.spec.js rename to test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js index 6dac0d994..7c9ca4fb9 100644 --- a/test/unit/document/stateTransition/applyDocumentsBatchTransitionFactory.spec.js +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js @@ -1,23 +1,23 @@ -const Document = require('../../../../lib/document/Document'); +const Document = require('../../../../../lib/document/Document'); const DocumentsBatchTransition = require( - '../../../../lib/document/stateTransition/DocumentsBatchTransition/DocumentsBatchTransition', + '../../../../../lib/document/stateTransition/DocumentsBatchTransition/DocumentsBatchTransition', ); const applyDocumentsBatchTransitionFactory = require( - '../../../../lib/document/stateTransition/DocumentsBatchTransition/applyDocumentsBatchTransitionFactory', + '../../../../../lib/document/stateTransition/DocumentsBatchTransition/applyDocumentsBatchTransitionFactory', ); -const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('../../../../lib/test/fixtures/getDocumentsFixture'); +const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); +const getDocumentsFixture = require('../../../../../lib/test/fixtures/getDocumentsFixture'); const getDocumentTransitionsFixture = require( - '../../../../lib/test/fixtures/getDocumentTransitionsFixture', + '../../../../../lib/test/fixtures/getDocumentTransitionsFixture', ); -const DocumentNotProvidedError = require('../../../../lib/document/errors/DocumentNotProvidedError'); +const DocumentNotProvidedError = require('../../../../../lib/document/errors/DocumentNotProvidedError'); -const createStateRepositoryMock = require('../../../../lib/test/mocks/createStateRepositoryMock'); +const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock'); -const { protocolVersion } = require('../../../../lib/protocolVersion'); +const { protocolVersion } = require('../../../../../lib/protocolVersion'); describe('applyDocumentsBatchTransitionFactory', () => { let documents; diff --git a/test/unit/document/stateTransition/documentTransition/DocumentCreateTransition.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js similarity index 87% rename from test/unit/document/stateTransition/documentTransition/DocumentCreateTransition.spec.js rename to test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js index 259953629..4eba297f3 100644 --- a/test/unit/document/stateTransition/documentTransition/DocumentCreateTransition.spec.js +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js @@ -1,4 +1,4 @@ -const getDocumentTransitionsFixture = require('../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); +const getDocumentTransitionsFixture = require('../../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); describe('DocumentCreateTransition', () => { let documentTransition; diff --git a/test/unit/document/stateTransition/structure/findDuplicatesById.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js similarity index 74% rename from test/unit/document/stateTransition/structure/findDuplicatesById.spec.js rename to test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js index a4fda5973..4ffaacb5f 100644 --- a/test/unit/document/stateTransition/structure/findDuplicatesById.spec.js +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js @@ -1,6 +1,6 @@ -const findDuplicateDocuments = require('../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/basic/findDuplicatesById'); +const findDuplicateDocuments = require('../../../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/basic/findDuplicatesById'); -const getDocumentTransitionsFixture = require('../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); +const getDocumentTransitionsFixture = require('../../../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); describe('findDuplicatesById', () => { let rawDocumentTransitions; diff --git a/test/unit/document/stateTransition/structure/findDuplicatesByIndices.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js similarity index 82% rename from test/unit/document/stateTransition/structure/findDuplicatesByIndices.spec.js rename to test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js index 406c2b6fd..f30136d68 100644 --- a/test/unit/document/stateTransition/structure/findDuplicatesByIndices.spec.js +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js @@ -1,12 +1,12 @@ -const Document = require('../../../../../lib/document/Document'); +const Document = require('../../../../../../../lib/document/Document'); -const findDuplicateDocumentsByIndices = require('../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/basic/findDuplicatesByIndices'); +const findDuplicateDocumentsByIndices = require('../../../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/basic/findDuplicatesByIndices'); -const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('../../../../../lib/test/fixtures/getDocumentsFixture'); -const getDocumentTransitionsFixture = require('../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); +const getDataContractFixture = require('../../../../../../../lib/test/fixtures/getDataContractFixture'); +const getDocumentsFixture = require('../../../../../../../lib/test/fixtures/getDocumentsFixture'); +const getDocumentTransitionsFixture = require('../../../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); -const generateEntropy = require('../../../../../lib/util/generateEntropy'); +const generateEntropy = require('../../../../../../../lib/util/generateEntropy'); describe('findDuplicatesByIndices', () => { let documents; diff --git a/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js new file mode 100644 index 000000000..24107d2db --- /dev/null +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js @@ -0,0 +1,71 @@ +const validatePartialCompoundIndices = require('../../../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validatePartialCompoundIndices'); +const InconsistentCompoundIndexDataError = require('../../../../../../../lib/errors/InconsistentCompoundIndexDataError'); + +const getDocumentsFixture = require('../../../../../../../lib/test/fixtures/getDocumentsFixture'); +const getContractFixture = require('../../../../../../../lib/test/fixtures/getDataContractFixture'); +const getDocumentTransitionsFixture = require('../../../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); + +const ValidationResult = require('../../../../../../../lib/validation/ValidationResult'); +const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError'); + +describe('validatePartialCompoundIndices', () => { + let documents; + let rawDocumentTransitions; + let dataContract; + let ownerId; + + beforeEach(() => { + dataContract = getContractFixture(); + ownerId = dataContract.getOwnerId(); + }); + + it('should return invalid result if compound index contains not all fields', () => { + const document = getDocumentsFixture(dataContract)[9]; + document.set('lastName', undefined); + + documents = [document]; + rawDocumentTransitions = getDocumentTransitionsFixture({ + create: documents, + }).map((documentTransition) => documentTransition.toObject()); + + const result = validatePartialCompoundIndices(ownerId, rawDocumentTransitions, dataContract); + + expectValidationError(result, InconsistentCompoundIndexDataError); + + const { optionalUniqueIndexedDocument } = dataContract.getDocuments(); + const [error] = result.getErrors(); + + expect(error.getIndexDefinition()).to.deep.equal( + optionalUniqueIndexedDocument.indices[1], + ); + expect(error.getDocumentType()).to.equal('optionalUniqueIndexedDocument'); + }); + + it('should return valid result if compound index contains no fields', () => { + const document = getDocumentsFixture(dataContract)[8]; + document.setData({ }); + + documents = [document]; + + rawDocumentTransitions = getDocumentTransitionsFixture({ + create: documents, + }).map((documentTransition) => documentTransition.toObject()); + + const result = validatePartialCompoundIndices(ownerId, rawDocumentTransitions, dataContract); + + expect(result).to.be.an.instanceOf(ValidationResult); + expect(result.isValid()).to.be.true(); + }); + + it('should return valid result if compound index contains all fields', () => { + documents = [getDocumentsFixture(dataContract)[8]]; + rawDocumentTransitions = getDocumentTransitionsFixture({ + create: documents, + }).map((documentTransition) => documentTransition.toObject()); + + const result = validatePartialCompoundIndices(ownerId, rawDocumentTransitions, dataContract); + + expect(result).to.be.an.instanceOf(ValidationResult); + expect(result.isValid()).to.be.true(); + }); +}); diff --git a/test/unit/document/stateTransition/data/fetchDocumentsFactory.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js similarity index 81% rename from test/unit/document/stateTransition/data/fetchDocumentsFactory.spec.js rename to test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js index b3597198c..5bb687fb7 100644 --- a/test/unit/document/stateTransition/data/fetchDocumentsFactory.spec.js +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js @@ -1,11 +1,11 @@ -const getDocumentsFixture = require('../../../../../lib/test/fixtures/getDocumentsFixture'); -const getDocumentTransitionsFixture = require('../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); +const getDocumentsFixture = require('../../../../../../../lib/test/fixtures/getDocumentsFixture'); +const getDocumentTransitionsFixture = require('../../../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); -const fetchDocumentsFactory = require('../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/state/fetchDocumentsFactory'); +const fetchDocumentsFactory = require('../../../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/state/fetchDocumentsFactory'); -const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock'); +const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock'); -const generateRandomIdentifier = require('../../../../../lib/test/utils/generateRandomIdentifier'); +const generateRandomIdentifier = require('../../../../../../../lib/test/utils/generateRandomIdentifier'); describe('fetchDocumentsFactory', () => { let fetchDocuments; diff --git a/test/unit/document/stateTransition/data/validateDocumentsBatchTransitionDataFactory.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js similarity index 76% rename from test/unit/document/stateTransition/data/validateDocumentsBatchTransitionDataFactory.spec.js rename to test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js index ee7d4761d..190ada82f 100644 --- a/test/unit/document/stateTransition/data/validateDocumentsBatchTransitionDataFactory.spec.js +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js @@ -1,35 +1,35 @@ -const validateDocumentsBatchTransitionDataFactory = require('../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory'); +const validateDocumentsBatchTransitionStateFactory = require('../../../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory'); -const Document = require('../../../../../lib/document/Document'); -const DocumentsBatchTransition = require('../../../../../lib/document/stateTransition/DocumentsBatchTransition/DocumentsBatchTransition'); +const Document = require('../../../../../../../lib/document/Document'); +const DocumentsBatchTransition = require('../../../../../../../lib/document/stateTransition/DocumentsBatchTransition/DocumentsBatchTransition'); -const DataTriggerExecutionContext = require('../../../../../lib/dataTrigger/DataTriggerExecutionContext'); -const DataTriggerExecutionError = require('../../../../../lib/errors/DataTriggerExecutionError'); -const DataTriggerExecutionResult = require('../../../../../lib/dataTrigger/DataTriggerExecutionResult'); +const DataTriggerExecutionContext = require('../../../../../../../lib/dataTrigger/DataTriggerExecutionContext'); +const DataTriggerExecutionError = require('../../../../../../../lib/errors/DataTriggerExecutionError'); +const DataTriggerExecutionResult = require('../../../../../../../lib/dataTrigger/DataTriggerExecutionResult'); -const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); -const getDocumentsFixture = require('../../../../../lib/test/fixtures/getDocumentsFixture'); -const getDocumentTransitionsFixture = require('../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); -const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock'); +const getDataContractFixture = require('../../../../../../../lib/test/fixtures/getDataContractFixture'); +const getDocumentsFixture = require('../../../../../../../lib/test/fixtures/getDocumentsFixture'); +const getDocumentTransitionsFixture = require('../../../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); +const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock'); -const ValidationResult = require('../../../../../lib/validation/ValidationResult'); +const ValidationResult = require('../../../../../../../lib/validation/ValidationResult'); -const { expectValidationError } = require('../../../../../lib/test/expect/expectError'); +const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError'); -const DataContractNotPresentError = require('../../../../../lib/errors/DataContractNotPresentError'); -const DocumentAlreadyPresentError = require('../../../../../lib/errors/DocumentAlreadyPresentError'); -const DocumentNotFoundError = require('../../../../../lib/errors/DocumentNotFoundError'); -const InvalidDocumentRevisionError = require('../../../../../lib/errors/InvalidDocumentRevisionError'); -const ConsensusError = require('../../../../../lib/errors/ConsensusError'); -const InvalidDocumentActionError = require('../../../../../lib/document/errors/InvalidDocumentActionError'); -const DocumentOwnerIdMismatchError = require('../../../../../lib/errors/DocumentOwnerIdMismatchError'); -const DocumentTimestampsMismatchError = require('../../../../../lib/errors/DocumentTimestampsMismatchError'); -const DocumentTimestampWindowViolationError = require('../../../../../lib/errors/DocumentTimestampWindowViolationError'); +const DataContractNotPresentError = require('../../../../../../../lib/errors/DataContractNotPresentError'); +const DocumentAlreadyPresentError = require('../../../../../../../lib/errors/DocumentAlreadyPresentError'); +const DocumentNotFoundError = require('../../../../../../../lib/errors/DocumentNotFoundError'); +const InvalidDocumentRevisionError = require('../../../../../../../lib/errors/InvalidDocumentRevisionError'); +const ConsensusError = require('../../../../../../../lib/errors/ConsensusError'); +const InvalidDocumentActionError = require('../../../../../../../lib/document/errors/InvalidDocumentActionError'); +const DocumentOwnerIdMismatchError = require('../../../../../../../lib/errors/DocumentOwnerIdMismatchError'); +const DocumentTimestampsMismatchError = require('../../../../../../../lib/errors/DocumentTimestampsMismatchError'); +const DocumentTimestampWindowViolationError = require('../../../../../../../lib/errors/DocumentTimestampWindowViolationError'); -const generateRandomIdentifier = require('../../../../../lib/test/utils/generateRandomIdentifier'); +const generateRandomIdentifier = require('../../../../../../../lib/test/utils/generateRandomIdentifier'); -describe('validateDocumentsBatchTransitionDataFactory', () => { - let validateData; +describe('validateDocumentsBatchTransitionStateFactory', () => { + let validateDocumentsBatchTransitionState; let fetchDocumentsMock; let stateTransition; let documents; @@ -41,7 +41,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { let documentTransitions; let abciHeader; let fakeTime; - let validatePartialCompoundIndicesMock; beforeEach(function beforeEach() { dataContract = getDataContractFixture(); @@ -82,14 +81,10 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { validateDocumentsUniquenessByIndicesMock = this.sinonSandbox.stub(); validateDocumentsUniquenessByIndicesMock.resolves(new ValidationResult()); - validatePartialCompoundIndicesMock = this.sinonSandbox.stub(); - validatePartialCompoundIndicesMock.returns(new ValidationResult()); - - validateData = validateDocumentsBatchTransitionDataFactory( + validateDocumentsBatchTransitionState = validateDocumentsBatchTransitionStateFactory( stateRepositoryMock, fetchDocumentsMock, validateDocumentsUniquenessByIndicesMock, - validatePartialCompoundIndicesMock, executeDataTriggersMock, ); @@ -103,7 +98,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { it('should return invalid result if data contract was not found', async () => { stateRepositoryMock.fetchDataContract.resolves(null); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DataContractNotPresentError); @@ -117,14 +112,13 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { expect(fetchDocumentsMock).to.have.not.been.called(); expect(validateDocumentsUniquenessByIndicesMock).to.have.not.been.called(); - expect(validatePartialCompoundIndicesMock).to.have.not.been.called(); expect(executeDataTriggersMock).to.have.not.been.called(); }); it('should return invalid result if document transition with action "create" is already present', async () => { fetchDocumentsMock.resolves([documents[0]]); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DocumentAlreadyPresentError); @@ -142,7 +136,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { ); expect(validateDocumentsUniquenessByIndicesMock).to.have.not.been.called(); - expect(validatePartialCompoundIndicesMock).to.have.not.been.called(); expect(executeDataTriggersMock).to.have.not.been.called(); }); @@ -158,7 +151,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { transitions: documentTransitions.map((t) => t.toObject()), }, [dataContract]); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DocumentNotFoundError); @@ -175,7 +168,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { ); expect(validateDocumentsUniquenessByIndicesMock).to.have.not.been.called(); - expect(validatePartialCompoundIndicesMock).to.have.not.been.called(); expect(executeDataTriggersMock).to.have.not.been.called(); }); @@ -191,7 +183,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { transitions: documentTransitions.map((t) => t.toObject()), }, [dataContract]); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DocumentNotFoundError); @@ -208,7 +200,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { ); expect(validateDocumentsUniquenessByIndicesMock).to.have.not.been.called(); - expect(validatePartialCompoundIndicesMock).to.have.not.been.called(); expect(executeDataTriggersMock).to.have.not.been.called(); }); @@ -230,7 +221,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { documents[0].setCreatedAt(replaceDocument.getCreatedAt()); fetchDocumentsMock.resolves([documents[0]]); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, InvalidDocumentRevisionError); @@ -248,7 +239,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { ); expect(validateDocumentsUniquenessByIndicesMock).to.have.not.been.called(); - expect(validatePartialCompoundIndicesMock).to.have.not.been.called(); expect(executeDataTriggersMock).to.have.not.been.called(); }); @@ -272,7 +262,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { fetchDocumentsMock.resolves([fetchedDocument]); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DocumentOwnerIdMismatchError); @@ -290,7 +280,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { ); expect(validateDocumentsUniquenessByIndicesMock).to.have.not.been.called(); - expect(validatePartialCompoundIndicesMock).to.have.not.been.called(); expect(executeDataTriggersMock).to.have.not.been.called(); }); @@ -306,7 +295,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { fetchDocumentsMock.resolves([documents[0]]); try { - await validateData(stateTransition); + await validateDocumentsBatchTransitionState(stateTransition); expect.fail('InvalidDocumentActionError should be thrown'); } catch (e) { @@ -324,7 +313,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { ); expect(validateDocumentsUniquenessByIndicesMock).to.have.not.been.called(); - expect(validatePartialCompoundIndicesMock).to.have.not.been.called(); expect(executeDataTriggersMock).to.have.not.been.called(); } }); @@ -336,7 +324,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { new ValidationResult([duplicateDocumentsError]), ); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result); @@ -368,8 +356,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { dataContract, ]); expect(executeDataTriggersMock).to.have.not.been.called(); - - expect(validatePartialCompoundIndicesMock).to.have.been.calledOnce(); }); it('should return invalid result if data triggers execution failed', async () => { @@ -390,7 +376,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { new DataTriggerExecutionResult([dataTriggerExecutionError]), ]); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DataTriggerExecutionError); @@ -435,8 +421,6 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { documentTransitions.map((t) => t.toObject()), dataTriggersExecutionContext, ]); - - expect(validatePartialCompoundIndicesMock).to.have.been.calledOnce(); }); describe('Timestamps', () => { @@ -457,7 +441,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { t.updatedAt = new Date(); }); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DocumentTimestampsMismatchError); @@ -486,7 +470,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { t.updatedAt = undefined; }); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DocumentTimestampWindowViolationError); @@ -519,7 +503,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { t.createdAt = undefined; }); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DocumentTimestampWindowViolationError); @@ -559,7 +543,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { t.updatedAt.setMinutes(t.updatedAt.getMinutes() - 6); }); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expectValidationError(result, DocumentTimestampWindowViolationError); @@ -609,7 +593,7 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { new DataTriggerExecutionResult(), ]); - const result = await validateData(stateTransition); + const result = await validateDocumentsBatchTransitionState(stateTransition); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); @@ -628,64 +612,9 @@ describe('validateDocumentsBatchTransitionDataFactory', () => { dataContract, ); - expect(validatePartialCompoundIndicesMock).to.have.been.calledOnceWithExactly( - ownerId, - [documentTransitions[0]], - dataContract, - ); - expect(executeDataTriggersMock).to.have.been.calledOnceWithExactly( documentTransitions, dataTriggersExecutionContext, ); }); - - it('should return invalid result if document has partially set compound index data', async () => { - const inconsistentCompoundIndexDataError = new ConsensusError('error'); - - validatePartialCompoundIndicesMock.returns( - new ValidationResult([inconsistentCompoundIndexDataError]), - ); - - const fetchedDocuments = [ - new Document(documents[1].toObject(), dataContract), - new Document(documents[2].toObject(), dataContract), - ]; - - fetchDocumentsMock.resolves(fetchedDocuments); - - documentTransitions = getDocumentTransitionsFixture({ - create: [], - replace: [documents[1]], - delete: [documents[2]], - }); - - stateTransition = new DocumentsBatchTransition({ - ownerId, - contractId: dataContract.getId(), - transitions: documentTransitions.map((t) => t.toObject()), - }, [dataContract]); - - const result = await validateData(stateTransition); - - expectValidationError(result); - - const [error] = result.getErrors(); - - expect(error).to.equal(inconsistentCompoundIndexDataError); - - expect(validatePartialCompoundIndicesMock).to.have.been.calledOnceWithExactly( - ownerId, - [documentTransitions[0]], - dataContract, - ); - - expect(validateDocumentsUniquenessByIndicesMock).to.have.been.calledOnceWithExactly( - ownerId, - [documentTransitions[0]], - dataContract, - ); - - expect(executeDataTriggersMock).to.have.not.been.called(); - }); }); diff --git a/test/unit/document/stateTransition/data/validateDocumentsUniquenessByIndicesFactory.spec.js b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js similarity index 88% rename from test/unit/document/stateTransition/data/validateDocumentsUniquenessByIndicesFactory.spec.js rename to test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js index 70f242a36..0c84b340e 100644 --- a/test/unit/document/stateTransition/data/validateDocumentsUniquenessByIndicesFactory.spec.js +++ b/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js @@ -1,15 +1,15 @@ -const verifyDocumentsUniquenessByIndicesFactory = require('../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory'); +const verifyDocumentsUniquenessByIndicesFactory = require('../../../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory'); -const getDocumentsFixture = require('../../../../../lib/test/fixtures/getDocumentsFixture'); -const getContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); -const getDocumentTransitionsFixture = require('../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); +const getDocumentsFixture = require('../../../../../../../lib/test/fixtures/getDocumentsFixture'); +const getContractFixture = require('../../../../../../../lib/test/fixtures/getDataContractFixture'); +const getDocumentTransitionsFixture = require('../../../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); -const { expectValidationError } = require('../../../../../lib/test/expect/expectError'); -const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock'); +const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError'); +const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock'); -const ValidationResult = require('../../../../../lib/validation/ValidationResult'); +const ValidationResult = require('../../../../../../../lib/validation/ValidationResult'); -const DuplicateDocumentError = require('../../../../../lib/errors/DuplicateDocumentError'); +const DuplicateDocumentError = require('../../../../../../../lib/errors/DuplicateDocumentError'); describe('validateDocumentsUniquenessByIndices', () => { let stateRepositoryMock; diff --git a/test/unit/document/stateTransition/data/validatePartialCompoundIndices.spec.js b/test/unit/document/stateTransition/data/validatePartialCompoundIndices.spec.js deleted file mode 100644 index 4bc2f219e..000000000 --- a/test/unit/document/stateTransition/data/validatePartialCompoundIndices.spec.js +++ /dev/null @@ -1,71 +0,0 @@ -const validatePartialCompoundIndices = require('../../../../../lib/document/stateTransition/DocumentsBatchTransition/validation/basic/validatePartialCompoundIndices'); -const InconsistentCompoundIndexDataError = require('../../../../../lib/errors/InconsistentCompoundIndexDataError'); - -const getDocumentsFixture = require('../../../../../lib/test/fixtures/getDocumentsFixture'); -const getContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture'); -const getDocumentTransitionsFixture = require('../../../../../lib/test/fixtures/getDocumentTransitionsFixture'); - -const ValidationResult = require('../../../../../lib/validation/ValidationResult'); -const { expectValidationError } = require('../../../../../lib/test/expect/expectError'); - -describe('validatePartialCompoundIndices', () => { - let documents; - let documentTransitions; - let dataContract; - let ownerId; - - beforeEach(() => { - dataContract = getContractFixture(); - ownerId = '5bGvpuiXVW3yK8np1u51Y2LFk2WCvztpa8yYy6VJpguc'; - }); - - it('should return invalid result if compound index contains not all fields', () => { - const document = getDocumentsFixture(dataContract)[9]; - document.set('lastName', undefined); - - documents = [document]; - documentTransitions = getDocumentTransitionsFixture({ - create: documents, - }); - - const result = validatePartialCompoundIndices(ownerId, documentTransitions, dataContract); - - expectValidationError(result, InconsistentCompoundIndexDataError); - - const { optionalUniqueIndexedDocument } = dataContract.getDocuments(); - const [error] = result.getErrors(); - - expect(error.getIndexDefinition()).to.deep.equal( - optionalUniqueIndexedDocument.indices[1], - ); - expect(error.getDocumentType()).to.equal('optionalUniqueIndexedDocument'); - }); - - it('should return valid result if compound index contains no fields', () => { - const document = getDocumentsFixture(dataContract)[8]; - document.setData({ }); - - documents = [document]; - - documentTransitions = getDocumentTransitionsFixture({ - create: documents, - }); - - const result = validatePartialCompoundIndices(ownerId, documentTransitions, dataContract); - - expect(result).to.be.an.instanceOf(ValidationResult); - expect(result.isValid()).to.be.true(); - }); - - it('should return valid result if compound index contains all fields', () => { - documents = [getDocumentsFixture(dataContract)[8]]; - documentTransitions = getDocumentTransitionsFixture({ - create: documents, - }); - - const result = validatePartialCompoundIndices(ownerId, documentTransitions, dataContract); - - expect(result).to.be.an.instanceOf(ValidationResult); - expect(result.isValid()).to.be.true(); - }); -}); diff --git a/test/unit/identity/IdentityFactory.spec.js b/test/unit/identity/IdentityFactory.spec.js index 9220df73d..952117208 100644 --- a/test/unit/identity/IdentityFactory.spec.js +++ b/test/unit/identity/IdentityFactory.spec.js @@ -43,8 +43,8 @@ describe('IdentityFactory', () => { decode: decodeMock, }, '../../../lib/identity/Identity': Identity, - '../../../lib/identity/stateTransitions/identityCreateTransition/IdentityCreateTransition': IdentityCreateTransition, - '../../../lib/identity/stateTransitions/identityTopUpTransition/IdentityTopUpTransition': IdentityTopUpTransition, + '../../../lib/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition': IdentityCreateTransition, + '../../../lib/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition': IdentityTopUpTransition, }, ); diff --git a/test/unit/identity/stateTransitions/identityCreateTransition/IdentityCreateTransition.spec.js b/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js similarity index 100% rename from test/unit/identity/stateTransitions/identityCreateTransition/IdentityCreateTransition.spec.js rename to test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js diff --git a/test/unit/identity/stateTransitions/identityCreateTransition/applyIdentityCreateTransitionFactory.spec.js b/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js similarity index 100% rename from test/unit/identity/stateTransitions/identityCreateTransition/applyIdentityCreateTransitionFactory.spec.js rename to test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js diff --git a/test/integration/identity/stateTransition/identityCreateTransition/validateIdentityCreateTransitionDataFactory.spec.js b/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js similarity index 68% rename from test/integration/identity/stateTransition/identityCreateTransition/validateIdentityCreateTransitionDataFactory.spec.js rename to test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js index 5a4769dbf..91c5b289e 100644 --- a/test/integration/identity/stateTransition/identityCreateTransition/validateIdentityCreateTransitionDataFactory.spec.js +++ b/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js @@ -1,23 +1,23 @@ const { expectValidationError } = require( - '../../../../../lib/test/expect/expectError', + '../../../../../../../lib/test/expect/expectError', ); -const validateIdentityCreateTransitionDataFactory = require( - '../../../../../lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory', +const validateIdentityCreateTransitionStateFactory = require( + '../../../../../../../lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory', ); -const getIdentityCreateTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityCreateTransitionFixture'); +const getIdentityCreateTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityCreateTransitionFixture'); const IdentityAlreadyExistsError = require( - '../../../../../lib/errors/IdentityAlreadyExistsError', + '../../../../../../../lib/errors/IdentityAlreadyExistsError', ); -const ValidationResult = require('../../../../../lib/validation/ValidationResult'); +const ValidationResult = require('../../../../../../../lib/validation/ValidationResult'); -const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock'); +const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock'); -describe('validateIdentityCreateTransitionDataFactory', () => { - let validateIdentityCreateTransitionData; +describe('validateIdentityCreateTransitionStateFactory', () => { + let validateIdentityCreateTransitionState; let stateTransition; let stateRepositoryMock; let validateIdentityPublicKeyUniquenessMock; @@ -28,7 +28,7 @@ describe('validateIdentityCreateTransitionDataFactory', () => { validateIdentityPublicKeyUniquenessMock = this.sinonSandbox.stub() .returns(new ValidationResult()); - validateIdentityCreateTransitionData = validateIdentityCreateTransitionDataFactory( + validateIdentityCreateTransitionState = validateIdentityCreateTransitionStateFactory( stateRepositoryMock, validateIdentityPublicKeyUniquenessMock, ); @@ -45,7 +45,7 @@ describe('validateIdentityCreateTransitionDataFactory', () => { it('should return invalid result if identity already exists', async () => { stateRepositoryMock.fetchIdentity.resolves({}); - const result = await validateIdentityCreateTransitionData(stateTransition); + const result = await validateIdentityCreateTransitionState(stateTransition); expectValidationError(result, IdentityAlreadyExistsError, 1); @@ -64,14 +64,14 @@ describe('validateIdentityCreateTransitionDataFactory', () => { validateIdentityPublicKeyUniquenessMock.returns(validationResult); - const result = await validateIdentityCreateTransitionData(stateTransition); + const result = await validateIdentityCreateTransitionState(stateTransition); const [error] = result.getErrors(); expect(error).to.deep.equal(validationError); }); it('should return valid result if state transition is valid', async () => { - const result = await validateIdentityCreateTransitionData(stateTransition); + const result = await validateIdentityCreateTransitionState(stateTransition); expect(result.isValid()).to.be.true(); }); diff --git a/test/unit/identity/stateTransitions/identityCreateTransition/validateIdentityPublicKeysUniquenessFactory.spec.js b/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityPublicKeysUniquenessFactory.spec.js similarity index 75% rename from test/unit/identity/stateTransitions/identityCreateTransition/validateIdentityPublicKeysUniquenessFactory.spec.js rename to test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityPublicKeysUniquenessFactory.spec.js index ab231e5bf..8b384e1f6 100644 --- a/test/unit/identity/stateTransitions/identityCreateTransition/validateIdentityPublicKeysUniquenessFactory.spec.js +++ b/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityPublicKeysUniquenessFactory.spec.js @@ -1,16 +1,16 @@ const validateIdentityPublicKeyUniquenessFactory = require( - '../../../../../lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityPublicKeysUniquenessFactory', + '../../../../../../../lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityPublicKeysUniquenessFactory', ); const IdentityPublicKeyAlreadyExistsError = require( - '../../../../../lib/errors/IdentityPublicKeyAlreadyExistsError', + '../../../../../../../lib/errors/IdentityPublicKeyAlreadyExistsError', ); -const getIdentityFixture = require('../../../../../lib/test/fixtures/getIdentityFixture'); -const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock'); +const getIdentityFixture = require('../../../../../../../lib/test/fixtures/getIdentityFixture'); +const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock'); const { expectValidationError } = require( - '../../../../../lib/test/expect/expectError', + '../../../../../../../lib/test/expect/expectError', ); describe('validateIdentityPublicKeysUniquenessFactory', () => { diff --git a/test/unit/identity/stateTransitions/identityTopUpTransition/IdentityTopUpTransition.spec.js b/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js similarity index 100% rename from test/unit/identity/stateTransitions/identityTopUpTransition/IdentityTopUpTransition.spec.js rename to test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js diff --git a/test/unit/identity/stateTransitions/identityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js b/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js similarity index 100% rename from test/unit/identity/stateTransitions/identityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js rename to test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js diff --git a/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js b/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js new file mode 100644 index 000000000..954e7ff4b --- /dev/null +++ b/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js @@ -0,0 +1,22 @@ +const getIdentityTopUpTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); + +const validateIdentityTopUpTransitionStateFactory = require( + '../../../../../../../lib/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory', +); + +describe('validateIdentityTopUpTransitionStateFactory', () => { + let validateIdentityTopUpTransitionState; + let stateTransition; + + beforeEach(() => { + validateIdentityTopUpTransitionState = validateIdentityTopUpTransitionStateFactory(); + + stateTransition = getIdentityTopUpTransitionFixture(); + }); + + it('should return valid result', async () => { + const result = await validateIdentityTopUpTransitionState(stateTransition); + + expect(result.isValid()).to.be.true(); + }); +}); diff --git a/test/unit/identity/stateTransitions/assetLockProof/createAssetLockProofInstance.spec.js b/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js similarity index 100% rename from test/unit/identity/stateTransitions/assetLockProof/createAssetLockProofInstance.spec.js rename to test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js diff --git a/test/unit/identity/validation/validateIdentityExistenceFactory.spec.js b/test/unit/identity/validation/validateIdentityExistenceFactory.spec.js index 6991d1867..8ce0d2bd9 100644 --- a/test/unit/identity/validation/validateIdentityExistenceFactory.spec.js +++ b/test/unit/identity/validation/validateIdentityExistenceFactory.spec.js @@ -1,6 +1,4 @@ -const generateRandomIdentifier = require('../../../../lib/test/utils/generateRandomIdentifier'); - -const IdentityPublicKey = require('../../../../lib/identity/IdentityPublicKey'); +const getIdentityFixture = require('../../../../lib/test/fixtures/getIdentityFixture'); const validateIdentityExistenceFactory = require('../../../../lib/identity/validation/validateIdentityExistenceFactory'); @@ -15,8 +13,7 @@ const IdentityNotFoundError = require('../../../../lib/errors/IdentityNotFoundEr describe('validateIdentityExistence', () => { let validateIdentityExistence; let stateRepositoryMock; - let ownerId; - let rawIdentityUser; + let identity; beforeEach(function beforeEach() { stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); @@ -25,34 +22,23 @@ describe('validateIdentityExistence', () => { stateRepositoryMock, ); - ownerId = generateRandomIdentifier(); - - rawIdentityUser = { - id: ownerId, - publicKeys: [ - { - id: 0, - type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, - data: Buffer.from('z3HAPrJkpgffXX0b3w0lb/PZs6A5IXzHj1p8Fnzmgmk=', 'base64'), - }, - ], - }; + identity = getIdentityFixture(); }); it('should return invalid result if identity is not found', async () => { - const result = await validateIdentityExistence(ownerId); + const result = await validateIdentityExistence(identity.getId()); expectValidationError(result, IdentityNotFoundError); const [error] = result.getErrors(); - expect(error.getIdentityId()).to.equal(ownerId); + expect(error.getIdentityId()).to.equal(identity.getId()); }); it('should return valid result', async () => { - stateRepositoryMock.fetchIdentity.resolves(rawIdentityUser); + stateRepositoryMock.fetchIdentity.resolves(identity); - const result = await validateIdentityExistence(ownerId); + const result = await validateIdentityExistence(identity.getId()); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); diff --git a/test/unit/stateTransition/StateTransitionFactory.spec.js b/test/unit/stateTransition/StateTransitionFactory.spec.js index 7321a91b0..0bffa26ed 100644 --- a/test/unit/stateTransition/StateTransitionFactory.spec.js +++ b/test/unit/stateTransition/StateTransitionFactory.spec.js @@ -14,7 +14,7 @@ const SerializedObjectParsingError = require('../../../lib/errors/SerializedObje describe('StateTransitionFactory', () => { let StateTransitionFactory; let decodeMock; - let validateStateTransitionStructureMock; + let validateStateTransitionBasicMock; let createStateTransitionMock; let factory; let stateTransition; @@ -31,7 +31,7 @@ describe('StateTransitionFactory', () => { decodeMock = this.sinonSandbox.stub(); - validateStateTransitionStructureMock = this.sinonSandbox.stub(); + validateStateTransitionBasicMock = this.sinonSandbox.stub(); createStateTransitionMock = this.sinonSandbox.stub().returns(stateTransition); // Require Factory module for webpack @@ -43,20 +43,20 @@ describe('StateTransitionFactory', () => { }); factory = new StateTransitionFactory( - validateStateTransitionStructureMock, + validateStateTransitionBasicMock, createStateTransitionMock, ); }); describe('createFromObject', () => { it('should return new State Transition with data from passed object', async () => { - validateStateTransitionStructureMock.returns(new ValidationResult()); + validateStateTransitionBasicMock.returns(new ValidationResult()); const result = await factory.createFromObject(rawStateTransition); expect(result).to.equal(stateTransition); - expect(validateStateTransitionStructureMock).to.have.been.calledOnceWith(rawStateTransition); + expect(validateStateTransitionBasicMock).to.have.been.calledOnceWith(rawStateTransition); expect(createStateTransitionMock).to.have.been.calledOnceWith(rawStateTransition); }); @@ -66,7 +66,7 @@ describe('StateTransitionFactory', () => { expect(result).to.equal(stateTransition); - expect(validateStateTransitionStructureMock).to.have.not.been.called(); + expect(validateStateTransitionBasicMock).to.have.not.been.called(); expect(createStateTransitionMock).to.have.been.calledOnceWith(rawStateTransition); }); @@ -74,7 +74,7 @@ describe('StateTransitionFactory', () => { it('should throw InvalidStateTransitionError if passed object is not valid', async () => { const validationError = new ConsensusError('test'); - validateStateTransitionStructureMock.returns(new ValidationResult([validationError])); + validateStateTransitionBasicMock.returns(new ValidationResult([validationError])); try { await factory.createFromObject(rawStateTransition); @@ -90,7 +90,7 @@ describe('StateTransitionFactory', () => { expect(consensusError).to.equal(validationError); - expect(validateStateTransitionStructureMock).to.have.been.calledOnceWith( + expect(validateStateTransitionBasicMock).to.have.been.calledOnceWith( rawStateTransition, ); } diff --git a/test/unit/stateTransition/validation/validateStateTransitionStructureFactory.spec.js b/test/unit/stateTransition/validation/validateStateTransitionBasicFactory.spec.js similarity index 84% rename from test/unit/stateTransition/validation/validateStateTransitionStructureFactory.spec.js rename to test/unit/stateTransition/validation/validateStateTransitionBasicFactory.spec.js index f78ae7c39..15086126a 100644 --- a/test/unit/stateTransition/validation/validateStateTransitionStructureFactory.spec.js +++ b/test/unit/stateTransition/validation/validateStateTransitionBasicFactory.spec.js @@ -1,4 +1,4 @@ -const validateStateTransitionStructureFactory = require('../../../../lib/stateTransition/validation/validateStateTransitionBasicFactory'); +const validateStateTransitionBasicFactory = require('../../../../lib/stateTransition/validation/validateStateTransitionBasicFactory'); const DataContractFactory = require('../../../../lib/dataContract/DataContractFactory'); @@ -19,8 +19,8 @@ const MissingStateTransitionTypeError = require('../../../../lib/errors/MissingS const InvalidStateTransitionTypeError = require('../../../../lib/errors/InvalidStateTransitionTypeError'); const createDPPMock = require('../../../../lib/test/mocks/createDPPMock'); -describe('validateStateTransitionStructureFactory', () => { - let validateStateTransitionStructure; +describe('validateStateTransitionBasicFactory', () => { + let validateStateTransitionBasic; let validationFunctionMock; let rawStateTransition; let dataContract; @@ -48,7 +48,7 @@ describe('validateStateTransitionStructureFactory', () => { createStateTransitionMock = this.sinonSandbox.stub().resolves(stateTransition); - validateStateTransitionStructure = validateStateTransitionStructureFactory( + validateStateTransitionBasic = validateStateTransitionBasicFactory( validationFunctionsByType, createStateTransitionMock, ); @@ -57,7 +57,7 @@ describe('validateStateTransitionStructureFactory', () => { it('should return invalid result if ST type is missing', async () => { delete rawStateTransition.type; - const result = await validateStateTransitionStructure(rawStateTransition); + const result = await validateStateTransitionBasic(rawStateTransition); expectValidationError(result); @@ -71,7 +71,7 @@ describe('validateStateTransitionStructureFactory', () => { it('should return invalid result if ST type is not valid', async () => { rawStateTransition.type = 666; - const result = await validateStateTransitionStructure(rawStateTransition); + const result = await validateStateTransitionBasic(rawStateTransition); expectValidationError(result); @@ -90,7 +90,7 @@ describe('validateStateTransitionStructureFactory', () => { validationFunctionMock.returns(extensionResult); - const result = await validateStateTransitionStructure(rawStateTransition); + const result = await validateStateTransitionBasic(rawStateTransition); expectValidationError(result); @@ -111,7 +111,7 @@ describe('validateStateTransitionStructureFactory', () => { stateTransition.dataContract.documents[`anotherContract${i}`] = rawStateTransition.dataContract.documents.niceDocument; } - const result = await validateStateTransitionStructure( + const result = await validateStateTransitionBasic( rawStateTransition, ); @@ -123,7 +123,7 @@ describe('validateStateTransitionStructureFactory', () => { validationFunctionMock.returns(extensionResult); - const result = await validateStateTransitionStructure(rawStateTransition); + const result = await validateStateTransitionBasic(rawStateTransition); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); diff --git a/test/unit/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.spec.js b/test/unit/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.spec.js index 7cd0b5753..93764106d 100644 --- a/test/unit/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.spec.js +++ b/test/unit/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.spec.js @@ -1,20 +1,23 @@ const validateStateTransitionSignatureFactory = require('../../../../lib/stateTransition/validation/validateStateTransitionIdentitySignatureFactory'); -const createStateRepositoryMock = require('../../../../lib/test/mocks/createStateRepositoryMock'); const ValidationResult = require('../../../../lib/validation/ValidationResult'); const IdentityPublicKey = require('../../../../lib/identity/IdentityPublicKey'); const InvalidIdentityPublicKeyTypeError = require('../../../../lib/errors/InvalidIdentityPublicKeyTypeError'); const InvalidStateTransitionSignatureError = require('../../../../lib/errors/InvalidStateTransitionSignatureError'); const MissingPublicKeyError = require('../../../../lib/errors/MissingPublicKeyError'); const generateRandomIdentifier = require('../../../../lib/test/utils/generateRandomIdentifier'); +const ConsensusError = require('../../../../lib/errors/ConsensusError'); + +const { expectValidationError } = require('../../../../lib/test/expect/expectError'); describe('validateStateTransitionIdentitySignatureFactory', () => { - let validateStateTransitionSignature; - let stateRepositoryMock; + let validateStateTransitionIdentitySignature; let stateTransition; let ownerId; let identity; let identityPublicKey; let publicKeyId; + let validateIdentityExistenceResult; + let validateIdentityExistenceMock; beforeEach(function beforeEach() { ownerId = generateRandomIdentifier(); @@ -23,6 +26,7 @@ describe('validateStateTransitionIdentitySignatureFactory', () => { verifySignature: this.sinonSandbox.stub().returns(true), getSignaturePublicKeyId: this.sinonSandbox.stub().returns(publicKeyId), getSignature: this.sinonSandbox.stub(), + getOwnerId: this.sinonSandbox.stub().returns(ownerId), }; identityPublicKey = { @@ -35,18 +39,21 @@ describe('validateStateTransitionIdentitySignatureFactory', () => { getPublicKeyById, }; - stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - stateRepositoryMock.fetchIdentity.resolves(identity); + validateIdentityExistenceResult = new ValidationResult(); + validateIdentityExistenceResult.setData(identity); + + validateIdentityExistenceMock = this.sinonSandbox.stub().resolves( + validateIdentityExistenceResult, + ); - validateStateTransitionSignature = validateStateTransitionSignatureFactory( - stateRepositoryMock, + validateStateTransitionIdentitySignature = validateStateTransitionSignatureFactory( + validateIdentityExistenceMock, ); }); it('should pass properly signed state transition', async () => { - const result = await validateStateTransitionSignature( + const result = await validateStateTransitionIdentitySignature( stateTransition, - ownerId, ); expect(result).to.be.instanceOf(ValidationResult); @@ -55,11 +62,35 @@ describe('validateStateTransitionIdentitySignatureFactory', () => { expect(result.getErrors()).to.be.an('array'); expect(result.getErrors()).to.be.empty(); - expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(ownerId); + expect(validateIdentityExistenceMock).to.be.calledOnceWithExactly(ownerId); expect(identity.getPublicKeyById).to.be.calledOnceWithExactly(publicKeyId); expect(identityPublicKey.getType).to.be.calledOnce(); expect(stateTransition.getSignaturePublicKeyId).to.be.calledOnce(); expect(stateTransition.verifySignature).to.be.calledOnceWithExactly(identityPublicKey); + expect(stateTransition.getOwnerId).to.be.calledOnceWithExactly(); + }); + + it('should return invalid result if owner id doesn\'t exist', async () => { + const consensusError = new ConsensusError('error'); + + validateIdentityExistenceResult.addError(consensusError); + + const result = await validateStateTransitionIdentitySignature( + stateTransition, + ); + + expectValidationError(result); + + const [error] = result.getErrors(); + + expect(error).to.equal(consensusError); + + expect(validateIdentityExistenceMock).to.be.calledOnceWithExactly(ownerId); + expect(identity.getPublicKeyById).to.not.be.called(); + expect(identityPublicKey.getType).to.not.be.called(); + expect(stateTransition.getSignaturePublicKeyId).to.not.be.called(); + expect(stateTransition.verifySignature).to.not.be.called(); + expect(stateTransition.getOwnerId).to.be.calledOnceWithExactly(); }); it("should return MissingPublicKeyError if the identity doesn't have a matching public key", async () => { @@ -67,14 +98,13 @@ describe('validateStateTransitionIdentitySignatureFactory', () => { identityPublicKey.getType.returns(type); identity.getPublicKeyById.returns(undefined); - const result = await validateStateTransitionSignature( + const result = await validateStateTransitionIdentitySignature( stateTransition, - ownerId, ); expect(result).to.be.instanceOf(ValidationResult); expect(result.isValid()).to.be.false(); - expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(ownerId); + expect(validateIdentityExistenceMock).to.be.calledOnceWithExactly(ownerId); expect(identity.getPublicKeyById).to.be.calledOnceWithExactly(publicKeyId); expect(stateTransition.getSignaturePublicKeyId).to.be.calledTwice(); expect(stateTransition.verifySignature).to.not.be.called(); @@ -92,14 +122,13 @@ describe('validateStateTransitionIdentitySignatureFactory', () => { const type = IdentityPublicKey.TYPES.ECDSA_SECP256K1 + 1; identityPublicKey.getType.returns(type); - const result = await validateStateTransitionSignature( + const result = await validateStateTransitionIdentitySignature( stateTransition, - ownerId, ); expect(result).to.be.instanceOf(ValidationResult); expect(result.isValid()).to.be.false(); - expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(ownerId); + expect(validateIdentityExistenceMock).to.be.calledOnceWithExactly(ownerId); expect(identity.getPublicKeyById).to.be.calledOnceWithExactly(publicKeyId); expect(identityPublicKey.getType).to.be.calledTwice(); expect(stateTransition.getSignaturePublicKeyId).to.be.calledOnce(); @@ -117,9 +146,8 @@ describe('validateStateTransitionIdentitySignatureFactory', () => { it('should return InvalidStateTransitionSignatureError if signature is invalid', async () => { stateTransition.verifySignature.returns(false); - const result = await validateStateTransitionSignature( + const result = await validateStateTransitionIdentitySignature( stateTransition, - ownerId, ); expect(result).to.be.instanceOf(ValidationResult); @@ -133,7 +161,7 @@ describe('validateStateTransitionIdentitySignatureFactory', () => { expect(error).to.be.instanceOf(InvalidStateTransitionSignatureError); expect(error.getRawStateTransition()).to.equal(stateTransition); - expect(stateRepositoryMock.fetchIdentity).to.be.calledOnceWithExactly(ownerId); + expect(validateIdentityExistenceMock).to.be.calledOnceWithExactly(ownerId); expect(identity.getPublicKeyById).to.be.calledOnceWithExactly(publicKeyId); expect(identityPublicKey.getType).to.be.calledOnce(); expect(stateTransition.getSignaturePublicKeyId).to.be.calledOnce(); diff --git a/test/unit/identity/stateTransitions/validateSignatureAgainstAssetLockPublicKeyFactory.spec.js b/test/unit/stateTransition/validation/validateStateTransitionKeySignature.spec.js similarity index 97% rename from test/unit/identity/stateTransitions/validateSignatureAgainstAssetLockPublicKeyFactory.spec.js rename to test/unit/stateTransition/validation/validateStateTransitionKeySignature.spec.js index 726ac7ee1..bfcc7d362 100644 --- a/test/unit/identity/stateTransitions/validateSignatureAgainstAssetLockPublicKeyFactory.spec.js +++ b/test/unit/stateTransition/validation/validateStateTransitionKeySignature.spec.js @@ -7,7 +7,7 @@ const { expectValidationError } = require('../../../../lib/test/expect/expectErr const ValidationResult = require('../../../../lib/validation/ValidationResult'); -describe('validateSignatureAgainstAssetLockPublicKeyFactory', () => { +describe('validateStateTransitionKeySignature', () => { let publicKeyHash; let stateTransition; let stateTransitionHash; diff --git a/test/unit/stateTransition/validation/validateStateTransitionDataFactory.spec.js b/test/unit/stateTransition/validation/validateStateTransitionStateFactory.spec.js similarity index 83% rename from test/unit/stateTransition/validation/validateStateTransitionDataFactory.spec.js rename to test/unit/stateTransition/validation/validateStateTransitionStateFactory.spec.js index be9b070c9..046e8ff73 100644 --- a/test/unit/stateTransition/validation/validateStateTransitionDataFactory.spec.js +++ b/test/unit/stateTransition/validation/validateStateTransitionStateFactory.spec.js @@ -1,6 +1,6 @@ const stateTransitionTypes = require('../../../../lib/stateTransition/stateTransitionTypes'); -const validateStateTransitionDataFactory = require('../../../../lib/stateTransition/validation/validateStateTransitionStateFactory'); +const validateStateTransitionStateFactory = require('../../../../lib/stateTransition/validation/validateStateTransitionStateFactory'); const { expectValidationError } = require('../../../../lib/test/expect/expectError'); @@ -14,9 +14,9 @@ const InvalidStateTransitionTypeError = require('../../../../lib/errors/InvalidS const ConsensusError = require('../../../../lib/errors/ConsensusError'); const createDPPMock = require('../../../../lib/test/mocks/createDPPMock'); -describe('validateStateTransitionDataFactory', () => { +describe('validateStateTransitionStateFactory', () => { let validateDataContractSTDataMock; - let validateStateTransitionData; + let validateStateTransitionState; let stateTransition; beforeEach(function beforeEach() { @@ -27,7 +27,7 @@ describe('validateStateTransitionDataFactory', () => { const dataContract = getDataContractFixture(); stateTransition = dataContractFactory.createStateTransition(dataContract); - validateStateTransitionData = validateStateTransitionDataFactory({ + validateStateTransitionState = validateStateTransitionStateFactory({ [stateTransitionTypes.DATA_CONTRACT_CREATE]: validateDataContractSTDataMock, }); }); @@ -43,7 +43,7 @@ describe('validateStateTransitionDataFactory', () => { }, }; - const result = await validateStateTransitionData(stateTransition); + const result = await validateStateTransitionState(stateTransition); expectValidationError(result, InvalidStateTransitionTypeError); @@ -62,7 +62,7 @@ describe('validateStateTransitionDataFactory', () => { validateDataContractSTDataMock.resolves(dataContractResult); - const result = await validateStateTransitionData(stateTransition); + const result = await validateStateTransitionState(stateTransition); expectValidationError(result); @@ -78,7 +78,7 @@ describe('validateStateTransitionDataFactory', () => { validateDataContractSTDataMock.resolves(dataContractResult); - const result = await validateStateTransitionData(stateTransition); + const result = await validateStateTransitionState(stateTransition); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true();