@dashevo/wasm-dpp 0.23.0-dev.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +5 -0
- package/.editorconfig +13 -0
- package/.eslintignore +1 -0
- package/.eslintrc +15 -0
- package/.mocharc.yml +4 -0
- package/CHANGELOG.md +397 -0
- package/LICENSE +20 -0
- package/README.md +37 -0
- package/karma.conf.js +53 -0
- package/package.json +107 -0
- package/test/.eslintrc +12 -0
- package/test/integration/DashPlatformProtocol.spec.js +53 -0
- package/test/integration/ajv/keywords/byteArray/addByteArrayKeyword.spec.js +148 -0
- package/test/integration/dataContract/DataContractFacade.spec.js +84 -0
- package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +357 -0
- package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +444 -0
- package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +2191 -0
- package/test/integration/document/Document.spec.js +90 -0
- package/test/integration/document/DocumentFacade.spec.js +155 -0
- package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +83 -0
- package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +1146 -0
- package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +294 -0
- package/test/integration/document/validation/validateDocumentFactory.spec.js +447 -0
- package/test/integration/error/consensus/createConsensusError.spec.js +21 -0
- package/test/integration/identity/IdentityFacade.spec.js +187 -0
- package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +422 -0
- package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +361 -0
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +595 -0
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +299 -0
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +66 -0
- package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +415 -0
- package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +134 -0
- package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +401 -0
- package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +205 -0
- package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +127 -0
- package/test/integration/identity/validation/validateIdentityFactory.spec.js +370 -0
- package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +497 -0
- package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +507 -0
- package/test/integration/stateTransition/StateTransitionFacade.spec.js +418 -0
- package/test/integration/stateTransition/calculateStateTransitionFee.spec.js +35 -0
- package/test/integration/util/generateEntropy.spec.js +17 -0
- package/test/integration/util/serializer.spec.js +24 -0
- package/test/unit/DashPlatformProtocol.spec.js +79 -0
- package/test/unit/Identifier.spec.js +123 -0
- package/test/unit/Metadata.spec.js +37 -0
- package/test/unit/dataContract/DataContract.spec.js +407 -0
- package/test/unit/dataContract/DataContractFactory.spec.js +178 -0
- package/test/unit/dataContract/createDataContract.spec.js +57 -0
- package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +46 -0
- package/test/unit/dataContract/generateDataContractId.spec.js +19 -0
- package/test/unit/dataContract/getBinaryPropertiesFromSchema.spec.js +103 -0
- package/test/unit/dataContract/getPropertyDefinitionByPath.spec.js +84 -0
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +160 -0
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +48 -0
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +85 -0
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +158 -0
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +47 -0
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +121 -0
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +111 -0
- package/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js +93 -0
- package/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js +64 -0
- package/test/unit/dataTrigger/DataTrigger.spec.js +132 -0
- package/test/unit/dataTrigger/DataTriggerExecutionContext.spec.js +29 -0
- package/test/unit/dataTrigger/dashpayDataTriggers/createContactRequestDataTrigger.spec.js +109 -0
- package/test/unit/dataTrigger/dpnsTriggers/createDomainDataTrigger.spec.js +382 -0
- package/test/unit/dataTrigger/featureFlagDataTriggers/createFeatureFlagDataTrigger.spec.js +101 -0
- package/test/unit/dataTrigger/getDataTriggersFactory.spec.js +113 -0
- package/test/unit/dataTrigger/rejectDataTrigger.spec.js +51 -0
- package/test/unit/dataTrigger/rewardShareDataTriggers/createMasternodeRewardSharesDataTrigger.spec.js +200 -0
- package/test/unit/decodeProtocolEntityFactory.spec.js +75 -0
- package/test/unit/document/Document.spec.js +444 -0
- package/test/unit/document/DocumentFactory.spec.js +376 -0
- package/test/unit/document/errors/InvalidDocumentError.spec.js +46 -0
- package/test/unit/document/fetchAndValidateDataContractFactory.spec.js +66 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +168 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +171 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js +25 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +31 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js +122 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js +75 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js +128 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +811 -0
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +279 -0
- package/test/unit/errors/consensus/codes.spec.js +102 -0
- package/test/unit/identity/Identity.spec.js +243 -0
- package/test/unit/identity/IdentityFactory.spec.js +274 -0
- package/test/unit/identity/IdentityPublicKey.spec.js +273 -0
- package/test/unit/identity/creditsConverter.spec.js +34 -0
- package/test/unit/identity/errors/InvalidIdentityError.spec.js +46 -0
- package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +184 -0
- package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +90 -0
- package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +71 -0
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +137 -0
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +108 -0
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +22 -0
- package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +219 -0
- package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +149 -0
- package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +21 -0
- package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +36 -0
- package/test/unit/identity/validation/validateRequiredPurposeAndSecurityLevelFactory.spec.js +47 -0
- package/test/unit/stateTransition/StateTransitionFactory.spec.js +160 -0
- package/test/unit/stateTransition/createStateTransitionFactory.spec.js +72 -0
- package/test/unit/stateTransition/errors/InvalidStateTransitionError.spec.js +51 -0
- package/test/unit/stateTransition/validation/validateStateTransitionBasicFactory.spec.js +138 -0
- package/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +372 -0
- package/test/unit/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.spec.js +339 -0
- package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +86 -0
- package/test/unit/stateTransition/validation/validateStateTransitionStateFactory.spec.js +89 -0
- package/test/unit/version/validateProtocolVersionFactory.spec.js +80 -0
- package/webpack.config.js +49 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const InvalidDataContractError = require('../../../../lib/dataContract/errors/InvalidDataContractError');
|
|
2
|
+
const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture');
|
|
3
|
+
|
|
4
|
+
describe('InvalidDataContractError', () => {
|
|
5
|
+
let rawDataContract;
|
|
6
|
+
let error;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
error = new Error('Some error');
|
|
10
|
+
|
|
11
|
+
const dataContract = getDataContractFixture();
|
|
12
|
+
rawDataContract = dataContract.toObject();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should return errors', () => {
|
|
16
|
+
const errors = [error];
|
|
17
|
+
|
|
18
|
+
const invalidDataContractError = new InvalidDataContractError(errors, rawDataContract);
|
|
19
|
+
|
|
20
|
+
expect(invalidDataContractError.getErrors()).to.deep.equal(errors);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should return Data Contract', async () => {
|
|
24
|
+
const errors = [error];
|
|
25
|
+
|
|
26
|
+
const invalidDataContractError = new InvalidDataContractError(errors, rawDataContract);
|
|
27
|
+
|
|
28
|
+
expect(invalidDataContractError.getRawDataContract()).to.deep.equal(rawDataContract);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('should contain message for 1 error', async () => {
|
|
32
|
+
const errors = [error];
|
|
33
|
+
|
|
34
|
+
const invalidDataContractError = new InvalidDataContractError(errors, rawDataContract);
|
|
35
|
+
|
|
36
|
+
expect(invalidDataContractError.message).to.equal(`Invalid Data Contract: "${error.message}"`);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should contain message for multiple errors', async () => {
|
|
40
|
+
const errors = [error, error];
|
|
41
|
+
|
|
42
|
+
const invalidDataContractError = new InvalidDataContractError(errors, rawDataContract);
|
|
43
|
+
|
|
44
|
+
expect(invalidDataContractError.message).to.equal(`Invalid Data Contract: "${error.message}" and 1 more`);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const bs58 = require('bs58');
|
|
2
|
+
const generateDataContractId = require('../../../lib/dataContract/generateDataContractId');
|
|
3
|
+
|
|
4
|
+
describe('generateDataContractId', () => {
|
|
5
|
+
let ownerId;
|
|
6
|
+
let entropy;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
ownerId = bs58.decode('23wdhodag');
|
|
10
|
+
entropy = bs58.decode('5dz916pTe1');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should generate bs58 id based on ', () => {
|
|
14
|
+
const id = bs58.decode('CnS7cz4z1qoPsNfEgpgyVnKdtH2u7bgzZXHLcCQt24US');
|
|
15
|
+
const generatedId = generateDataContractId(ownerId, entropy);
|
|
16
|
+
|
|
17
|
+
expect(Buffer.compare(id, generatedId)).to.equal(0);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
const { getBinaryPropertiesFromSchema } = require(
|
|
2
|
+
'../../../lib/dataContract/getBinaryPropertiesFromSchema',
|
|
3
|
+
);
|
|
4
|
+
|
|
5
|
+
describe('getBinaryPropertiesFromSchema', () => {
|
|
6
|
+
let documentSchema;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
documentSchema = {
|
|
10
|
+
properties: {
|
|
11
|
+
simple: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
},
|
|
14
|
+
withByteArray: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
byteArray: true,
|
|
17
|
+
},
|
|
18
|
+
nestedObject: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
simple: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
},
|
|
24
|
+
withByteArray: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
byteArray: true,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
arrayOfObject: {
|
|
31
|
+
type: 'array',
|
|
32
|
+
items: {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
simple: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
},
|
|
38
|
+
withByteArray: {
|
|
39
|
+
type: 'object',
|
|
40
|
+
byteArray: true,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
arrayOfObjects: {
|
|
46
|
+
type: 'array',
|
|
47
|
+
items: [
|
|
48
|
+
{
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: {
|
|
51
|
+
simple: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
},
|
|
54
|
+
withByteArray: {
|
|
55
|
+
type: 'object',
|
|
56
|
+
byteArray: true,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
type: 'string',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
type: 'array',
|
|
65
|
+
items: [
|
|
66
|
+
{
|
|
67
|
+
type: 'object',
|
|
68
|
+
properties: {
|
|
69
|
+
simple: {
|
|
70
|
+
type: 'string',
|
|
71
|
+
},
|
|
72
|
+
withByteArray: {
|
|
73
|
+
type: 'object',
|
|
74
|
+
byteArray: true,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('should return an empty object if not `properties` property found', () => {
|
|
87
|
+
const result = getBinaryPropertiesFromSchema({});
|
|
88
|
+
|
|
89
|
+
expect(result).to.deep.equal({});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('should return flat object with properties having contentEncoding keyword', () => {
|
|
93
|
+
const result = getBinaryPropertiesFromSchema(documentSchema);
|
|
94
|
+
|
|
95
|
+
expect(result).to.deep.equal({
|
|
96
|
+
withByteArray: { type: 'object', byteArray: true },
|
|
97
|
+
'nestedObject.withByteArray': { type: 'object', byteArray: true },
|
|
98
|
+
'arrayOfObject.withByteArray': { type: 'object', byteArray: true },
|
|
99
|
+
'arrayOfObjects[0].withByteArray': { type: 'object', byteArray: true },
|
|
100
|
+
'arrayOfObjects[2][0].withByteArray': { type: 'object', byteArray: true },
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const getPropertyDefinitionByPath = require(
|
|
2
|
+
'../../../lib/dataContract/getPropertyDefinitionByPath',
|
|
3
|
+
);
|
|
4
|
+
|
|
5
|
+
describe('getPropertyDefinitionByPath', () => {
|
|
6
|
+
let schema;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
schema = {
|
|
10
|
+
properties: {
|
|
11
|
+
a: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
},
|
|
14
|
+
b: {
|
|
15
|
+
type: 'array',
|
|
16
|
+
items: {
|
|
17
|
+
type: 'object',
|
|
18
|
+
properties: {
|
|
19
|
+
inner: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
properties: {
|
|
22
|
+
abc: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
c: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
inner: {
|
|
34
|
+
type: 'object',
|
|
35
|
+
patternProperties: {
|
|
36
|
+
'[a-z]': {
|
|
37
|
+
type: 'string',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('should return `undefined` if property not found', () => {
|
|
48
|
+
const definition = getPropertyDefinitionByPath(schema, 'nope');
|
|
49
|
+
|
|
50
|
+
expect(definition).to.be.undefined();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should return definition immediately if path is one-level', () => {
|
|
54
|
+
const definition = getPropertyDefinitionByPath(schema, 'a');
|
|
55
|
+
|
|
56
|
+
expect(definition).to.deep.equal({
|
|
57
|
+
type: 'string',
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should return nested definition from an array', () => {
|
|
62
|
+
const definition = getPropertyDefinitionByPath(schema, 'b.inner');
|
|
63
|
+
|
|
64
|
+
expect(definition).to.deep.equal(schema.properties.b.items.properties.inner);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should return nested definition from object', () => {
|
|
68
|
+
const definition = getPropertyDefinitionByPath(schema, 'c.inner');
|
|
69
|
+
|
|
70
|
+
expect(definition).to.deep.equal(schema.properties.c.properties.inner);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('should return `undefined` if path does not match a pattern', () => {
|
|
74
|
+
const definition = getPropertyDefinitionByPath(schema, 'c.inner.NOPE');
|
|
75
|
+
|
|
76
|
+
expect(definition).to.be.undefined();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should return `undefined` if first item in a path is not an object or array', () => {
|
|
80
|
+
const definition = getPropertyDefinitionByPath(schema, 'a.someOther');
|
|
81
|
+
|
|
82
|
+
expect(definition).to.be.undefined();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture');
|
|
2
|
+
const stateTransitionTypes = require('../../../../../lib/stateTransition/stateTransitionTypes');
|
|
3
|
+
|
|
4
|
+
const Identifier = require('../../../../../lib/identifier/Identifier');
|
|
5
|
+
const protocolVersion = require('../../../../../lib/version/protocolVersion');
|
|
6
|
+
const DataContractCreateTransition = require('../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition');
|
|
7
|
+
const hash = require('../../../../../lib/util/hash');
|
|
8
|
+
const serializer = require('../../../../../lib/util/serializer');
|
|
9
|
+
|
|
10
|
+
describe('DataContractCreateTransition', () => {
|
|
11
|
+
let stateTransition;
|
|
12
|
+
let dataContract;
|
|
13
|
+
let hashMock;
|
|
14
|
+
let encodeMock;
|
|
15
|
+
|
|
16
|
+
beforeEach(function beforeEach() {
|
|
17
|
+
dataContract = getDataContractFixture();
|
|
18
|
+
|
|
19
|
+
encodeMock = this.sinonSandbox.stub(serializer, 'encode');
|
|
20
|
+
hashMock = this.sinonSandbox.stub(hash, 'hash');
|
|
21
|
+
|
|
22
|
+
stateTransition = new DataContractCreateTransition({
|
|
23
|
+
protocolVersion: protocolVersion.latestVersion,
|
|
24
|
+
dataContract: dataContract.toObject(),
|
|
25
|
+
entropy: dataContract.getEntropy(),
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
encodeMock.restore();
|
|
31
|
+
hashMock.restore();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe('#getProtocolVersion', () => {
|
|
35
|
+
it('should return the current protocol version', () => {
|
|
36
|
+
const result = stateTransition.getProtocolVersion();
|
|
37
|
+
|
|
38
|
+
expect(result).to.equal(protocolVersion.latestVersion);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe('#getType', () => {
|
|
43
|
+
it('should return State Transition type', () => {
|
|
44
|
+
const result = stateTransition.getType();
|
|
45
|
+
|
|
46
|
+
expect(result).to.equal(stateTransitionTypes.DATA_CONTRACT_CREATE);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('#getDataContract', () => {
|
|
51
|
+
it('should return Data Contract', () => {
|
|
52
|
+
const result = stateTransition.getDataContract();
|
|
53
|
+
|
|
54
|
+
expect(result.toObject()).to.deep.equal(dataContract.toObject());
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('#toJSON', () => {
|
|
59
|
+
it('should return State Transition as plain JS object', () => {
|
|
60
|
+
expect(stateTransition.toJSON()).to.deep.equal({
|
|
61
|
+
protocolVersion: protocolVersion.latestVersion,
|
|
62
|
+
type: stateTransitionTypes.DATA_CONTRACT_CREATE,
|
|
63
|
+
dataContract: dataContract.toJSON(),
|
|
64
|
+
signaturePublicKeyId: undefined,
|
|
65
|
+
signature: undefined,
|
|
66
|
+
entropy: dataContract.getEntropy().toString('base64'),
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('#toBuffer', () => {
|
|
72
|
+
it('should return serialized State Transition', () => {
|
|
73
|
+
const serializedStateTransition = Buffer.from('123');
|
|
74
|
+
|
|
75
|
+
encodeMock.returns(serializedStateTransition);
|
|
76
|
+
|
|
77
|
+
const protocolVersionUInt32 = Buffer.alloc(4);
|
|
78
|
+
protocolVersionUInt32.writeUInt32LE(stateTransition.protocolVersion, 0);
|
|
79
|
+
|
|
80
|
+
const result = stateTransition.toBuffer();
|
|
81
|
+
|
|
82
|
+
expect(result).to.deep.equal(
|
|
83
|
+
Buffer.concat([protocolVersionUInt32, serializedStateTransition]),
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
const dataToEncode = stateTransition.toObject();
|
|
87
|
+
delete dataToEncode.protocolVersion;
|
|
88
|
+
|
|
89
|
+
expect(encodeMock.getCall(0).args).to.have.deep.members([
|
|
90
|
+
dataToEncode,
|
|
91
|
+
]);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('#hash', () => {
|
|
96
|
+
it('should return State Transition hash as hex', () => {
|
|
97
|
+
const serializedDocument = Buffer.from('123');
|
|
98
|
+
const hashedDocument = '456';
|
|
99
|
+
|
|
100
|
+
encodeMock.returns(serializedDocument);
|
|
101
|
+
hashMock.returns(hashedDocument);
|
|
102
|
+
|
|
103
|
+
const result = stateTransition.hash();
|
|
104
|
+
|
|
105
|
+
expect(result).to.equal(hashedDocument);
|
|
106
|
+
|
|
107
|
+
const dataToEncode = stateTransition.toObject();
|
|
108
|
+
delete dataToEncode.protocolVersion;
|
|
109
|
+
|
|
110
|
+
expect(encodeMock.getCall(0).args).to.have.deep.members([
|
|
111
|
+
dataToEncode,
|
|
112
|
+
]);
|
|
113
|
+
|
|
114
|
+
const protocolVersionUInt32 = Buffer.alloc(4);
|
|
115
|
+
protocolVersionUInt32.writeUInt32LE(stateTransition.protocolVersion, 0);
|
|
116
|
+
|
|
117
|
+
expect(hashMock).to.have.been.calledOnceWith(
|
|
118
|
+
Buffer.concat([protocolVersionUInt32, serializedDocument]),
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('#getOwnerId', () => {
|
|
124
|
+
it('should return owner id', async () => {
|
|
125
|
+
const result = stateTransition.getOwnerId();
|
|
126
|
+
|
|
127
|
+
expect(result).to.equal(stateTransition.getDataContract().getOwnerId());
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('#getModifiedDataIds', () => {
|
|
132
|
+
it('should return ids of affected data contracts', () => {
|
|
133
|
+
const result = stateTransition.getModifiedDataIds();
|
|
134
|
+
|
|
135
|
+
expect(result.length).to.be.equal(1);
|
|
136
|
+
const contractId = result[0];
|
|
137
|
+
|
|
138
|
+
expect(contractId).to.be.an.instanceOf(Identifier);
|
|
139
|
+
expect(contractId).to.be.deep.equal(dataContract.getId());
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
describe('#isDataContractStateTransition', () => {
|
|
144
|
+
it('should return true', () => {
|
|
145
|
+
expect(stateTransition.isDataContractStateTransition()).to.be.true();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
describe('#isDocumentStateTransition', () => {
|
|
150
|
+
it('should return false', () => {
|
|
151
|
+
expect(stateTransition.isDocumentStateTransition()).to.be.false();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe('#isIdentityStateTransition', () => {
|
|
156
|
+
it('should return false', () => {
|
|
157
|
+
expect(stateTransition.isIdentityStateTransition()).to.be.false();
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const DataContractCreateTransition = require(
|
|
2
|
+
'../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition',
|
|
3
|
+
);
|
|
4
|
+
|
|
5
|
+
const getDataContractFixture = require('../../../../../lib/test/fixtures/getDataContractFixture');
|
|
6
|
+
|
|
7
|
+
const applyDataContractCreateTransitionFactory = require(
|
|
8
|
+
'../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory',
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
const createStateRepositoryMock = require('../../../../../lib/test/mocks/createStateRepositoryMock');
|
|
12
|
+
const StateTransitionExecutionContext = require('../../../../../lib/stateTransition/StateTransitionExecutionContext');
|
|
13
|
+
|
|
14
|
+
describe('applyDataContractCreateTransitionFactory', () => {
|
|
15
|
+
let stateTransition;
|
|
16
|
+
let dataContract;
|
|
17
|
+
let stateRepositoryMock;
|
|
18
|
+
let applyDataContractCreateTransition;
|
|
19
|
+
let executionContext;
|
|
20
|
+
|
|
21
|
+
beforeEach(function beforeEach() {
|
|
22
|
+
dataContract = getDataContractFixture();
|
|
23
|
+
|
|
24
|
+
stateTransition = new DataContractCreateTransition({
|
|
25
|
+
dataContract: dataContract.toObject(),
|
|
26
|
+
entropy: Buffer.alloc(32),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
executionContext = new StateTransitionExecutionContext();
|
|
30
|
+
|
|
31
|
+
stateTransition.setExecutionContext(executionContext);
|
|
32
|
+
|
|
33
|
+
stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
|
|
34
|
+
|
|
35
|
+
applyDataContractCreateTransition = applyDataContractCreateTransitionFactory(
|
|
36
|
+
stateRepositoryMock,
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('should store a data contract from state transition in the repository', async () => {
|
|
41
|
+
await applyDataContractCreateTransition(stateTransition);
|
|
42
|
+
|
|
43
|
+
expect(stateRepositoryMock.storeDataContract).to.have.been.calledOnceWithExactly(
|
|
44
|
+
stateTransition.getDataContract(),
|
|
45
|
+
executionContext,
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const validateDataContractCreateTransitionStateFactory = require('../../../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory');
|
|
2
|
+
const DataContractCreateTransition = require('../../../../../../../lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition');
|
|
3
|
+
|
|
4
|
+
const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock');
|
|
5
|
+
const getDataContractFixture = require('../../../../../../../lib/test/fixtures/getDataContractFixture');
|
|
6
|
+
|
|
7
|
+
const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError');
|
|
8
|
+
|
|
9
|
+
const ValidationResult = require('../../../../../../../lib/validation/ValidationResult');
|
|
10
|
+
|
|
11
|
+
const DataContractAlreadyPresentError = require('../../../../../../../lib/errors/consensus/state/dataContract/DataContractAlreadyPresentError');
|
|
12
|
+
const StateTransitionExecutionContext = require('../../../../../../../lib/stateTransition/StateTransitionExecutionContext');
|
|
13
|
+
|
|
14
|
+
describe('validateDataContractCreateTransitionStateFactory', () => {
|
|
15
|
+
let validateDataContractCreateTransitionState;
|
|
16
|
+
let dataContract;
|
|
17
|
+
let stateTransition;
|
|
18
|
+
let stateRepositoryMock;
|
|
19
|
+
let executionContext;
|
|
20
|
+
|
|
21
|
+
beforeEach(function beforeEach() {
|
|
22
|
+
stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
|
|
23
|
+
|
|
24
|
+
dataContract = getDataContractFixture();
|
|
25
|
+
stateTransition = new DataContractCreateTransition({
|
|
26
|
+
dataContract: dataContract.toObject(),
|
|
27
|
+
entropy: dataContract.getEntropy(),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
executionContext = new StateTransitionExecutionContext();
|
|
31
|
+
|
|
32
|
+
stateTransition.setExecutionContext(executionContext);
|
|
33
|
+
|
|
34
|
+
validateDataContractCreateTransitionState = validateDataContractCreateTransitionStateFactory(
|
|
35
|
+
stateRepositoryMock,
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should return invalid result if Data Contract with specified contractId is already exist', async () => {
|
|
40
|
+
stateRepositoryMock.fetchDataContract.resolves(dataContract);
|
|
41
|
+
|
|
42
|
+
const result = await validateDataContractCreateTransitionState(stateTransition);
|
|
43
|
+
|
|
44
|
+
expectValidationError(result, DataContractAlreadyPresentError);
|
|
45
|
+
|
|
46
|
+
const [error] = result.getErrors();
|
|
47
|
+
|
|
48
|
+
expect(error.getCode()).to.equal(4000);
|
|
49
|
+
expect(Buffer.isBuffer(error.getDataContractId())).to.be.true();
|
|
50
|
+
expect(error.getDataContractId()).to.deep.equal(dataContract.getId().toBuffer());
|
|
51
|
+
|
|
52
|
+
expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWithExactly(
|
|
53
|
+
dataContract.getId(),
|
|
54
|
+
executionContext,
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should return valid result', async () => {
|
|
59
|
+
const result = await validateDataContractCreateTransitionState(stateTransition);
|
|
60
|
+
|
|
61
|
+
expect(result).to.be.an.instanceOf(ValidationResult);
|
|
62
|
+
expect(result.isValid()).to.be.true();
|
|
63
|
+
|
|
64
|
+
expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWithExactly(
|
|
65
|
+
dataContract.getId(),
|
|
66
|
+
executionContext,
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('should return valid result on dry run', async () => {
|
|
71
|
+
stateRepositoryMock.fetchDataContract.resolves(dataContract);
|
|
72
|
+
|
|
73
|
+
executionContext.enableDryRun();
|
|
74
|
+
const result = await validateDataContractCreateTransitionState(stateTransition);
|
|
75
|
+
executionContext.disableDryRun();
|
|
76
|
+
|
|
77
|
+
expect(result).to.be.an.instanceOf(ValidationResult);
|
|
78
|
+
expect(result.isValid()).to.be.true();
|
|
79
|
+
|
|
80
|
+
expect(stateRepositoryMock.fetchDataContract).to.be.calledOnceWithExactly(
|
|
81
|
+
dataContract.getId(),
|
|
82
|
+
executionContext,
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
});
|