@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.
Files changed (110) hide show
  1. package/.babelrc +5 -0
  2. package/.editorconfig +13 -0
  3. package/.eslintignore +1 -0
  4. package/.eslintrc +15 -0
  5. package/.mocharc.yml +4 -0
  6. package/CHANGELOG.md +397 -0
  7. package/LICENSE +20 -0
  8. package/README.md +37 -0
  9. package/karma.conf.js +53 -0
  10. package/package.json +107 -0
  11. package/test/.eslintrc +12 -0
  12. package/test/integration/DashPlatformProtocol.spec.js +53 -0
  13. package/test/integration/ajv/keywords/byteArray/addByteArrayKeyword.spec.js +148 -0
  14. package/test/integration/dataContract/DataContractFacade.spec.js +84 -0
  15. package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +357 -0
  16. package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +444 -0
  17. package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +2191 -0
  18. package/test/integration/document/Document.spec.js +90 -0
  19. package/test/integration/document/DocumentFacade.spec.js +155 -0
  20. package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +83 -0
  21. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +1146 -0
  22. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +294 -0
  23. package/test/integration/document/validation/validateDocumentFactory.spec.js +447 -0
  24. package/test/integration/error/consensus/createConsensusError.spec.js +21 -0
  25. package/test/integration/identity/IdentityFacade.spec.js +187 -0
  26. package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +422 -0
  27. package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +361 -0
  28. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory.spec.js +595 -0
  29. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +299 -0
  30. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +66 -0
  31. package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +415 -0
  32. package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +134 -0
  33. package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +401 -0
  34. package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +205 -0
  35. package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +127 -0
  36. package/test/integration/identity/validation/validateIdentityFactory.spec.js +370 -0
  37. package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +497 -0
  38. package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +507 -0
  39. package/test/integration/stateTransition/StateTransitionFacade.spec.js +418 -0
  40. package/test/integration/stateTransition/calculateStateTransitionFee.spec.js +35 -0
  41. package/test/integration/util/generateEntropy.spec.js +17 -0
  42. package/test/integration/util/serializer.spec.js +24 -0
  43. package/test/unit/DashPlatformProtocol.spec.js +79 -0
  44. package/test/unit/Identifier.spec.js +123 -0
  45. package/test/unit/Metadata.spec.js +37 -0
  46. package/test/unit/dataContract/DataContract.spec.js +407 -0
  47. package/test/unit/dataContract/DataContractFactory.spec.js +178 -0
  48. package/test/unit/dataContract/createDataContract.spec.js +57 -0
  49. package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +46 -0
  50. package/test/unit/dataContract/generateDataContractId.spec.js +19 -0
  51. package/test/unit/dataContract/getBinaryPropertiesFromSchema.spec.js +103 -0
  52. package/test/unit/dataContract/getPropertyDefinitionByPath.spec.js +84 -0
  53. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +160 -0
  54. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +48 -0
  55. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +85 -0
  56. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +158 -0
  57. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +47 -0
  58. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +121 -0
  59. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +111 -0
  60. package/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js +93 -0
  61. package/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js +64 -0
  62. package/test/unit/dataTrigger/DataTrigger.spec.js +132 -0
  63. package/test/unit/dataTrigger/DataTriggerExecutionContext.spec.js +29 -0
  64. package/test/unit/dataTrigger/dashpayDataTriggers/createContactRequestDataTrigger.spec.js +109 -0
  65. package/test/unit/dataTrigger/dpnsTriggers/createDomainDataTrigger.spec.js +382 -0
  66. package/test/unit/dataTrigger/featureFlagDataTriggers/createFeatureFlagDataTrigger.spec.js +101 -0
  67. package/test/unit/dataTrigger/getDataTriggersFactory.spec.js +113 -0
  68. package/test/unit/dataTrigger/rejectDataTrigger.spec.js +51 -0
  69. package/test/unit/dataTrigger/rewardShareDataTriggers/createMasternodeRewardSharesDataTrigger.spec.js +200 -0
  70. package/test/unit/decodeProtocolEntityFactory.spec.js +75 -0
  71. package/test/unit/document/Document.spec.js +444 -0
  72. package/test/unit/document/DocumentFactory.spec.js +376 -0
  73. package/test/unit/document/errors/InvalidDocumentError.spec.js +46 -0
  74. package/test/unit/document/fetchAndValidateDataContractFactory.spec.js +66 -0
  75. package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +168 -0
  76. package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +171 -0
  77. package/test/unit/document/stateTransition/DocumetsBatchTransition/documentTransition/DocumentCreateTransition.spec.js +25 -0
  78. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesById.spec.js +31 -0
  79. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/findDuplicatesByIndices.spec.js +122 -0
  80. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/basic/validatePartialCompoundIndices.spec.js +75 -0
  81. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/fetchDocumentsFactory.spec.js +128 -0
  82. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +811 -0
  83. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +279 -0
  84. package/test/unit/errors/consensus/codes.spec.js +102 -0
  85. package/test/unit/identity/Identity.spec.js +243 -0
  86. package/test/unit/identity/IdentityFactory.spec.js +274 -0
  87. package/test/unit/identity/IdentityPublicKey.spec.js +273 -0
  88. package/test/unit/identity/creditsConverter.spec.js +34 -0
  89. package/test/unit/identity/errors/InvalidIdentityError.spec.js +46 -0
  90. package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +184 -0
  91. package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +90 -0
  92. package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +71 -0
  93. package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +137 -0
  94. package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +108 -0
  95. package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +22 -0
  96. package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +219 -0
  97. package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +149 -0
  98. package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +21 -0
  99. package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +36 -0
  100. package/test/unit/identity/validation/validateRequiredPurposeAndSecurityLevelFactory.spec.js +47 -0
  101. package/test/unit/stateTransition/StateTransitionFactory.spec.js +160 -0
  102. package/test/unit/stateTransition/createStateTransitionFactory.spec.js +72 -0
  103. package/test/unit/stateTransition/errors/InvalidStateTransitionError.spec.js +51 -0
  104. package/test/unit/stateTransition/validation/validateStateTransitionBasicFactory.spec.js +138 -0
  105. package/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +372 -0
  106. package/test/unit/stateTransition/validation/validateStateTransitionIdentitySignatureFactory.spec.js +339 -0
  107. package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +86 -0
  108. package/test/unit/stateTransition/validation/validateStateTransitionStateFactory.spec.js +89 -0
  109. package/test/unit/version/validateProtocolVersionFactory.spec.js +80 -0
  110. package/webpack.config.js +49 -0
@@ -0,0 +1,444 @@
1
+ const lodashClone = require('lodash.clonedeep');
2
+
3
+ const jsonPatch = require('fast-json-patch');
4
+ const jsonSchemaDiffValidator = require('json-schema-diff-validator');
5
+
6
+ const { getRE2Class } = require('@dashevo/wasm-re2');
7
+
8
+ const createAjv = require('../../../../../../../lib/ajv/createAjv');
9
+
10
+ const JsonSchemaValidator = require('../../../../../../../lib/validation/JsonSchemaValidator');
11
+
12
+ const protocolVersion = require('../../../../../../../lib/version/protocolVersion');
13
+
14
+ const createStateRepositoryMock = require('../../../../../../../lib/test/mocks/createStateRepositoryMock');
15
+
16
+ const validateDataContractUpdateTransitionBasicFactory = require('../../../../../../../lib/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory');
17
+
18
+ const DataContractUpdateTransition = require('../../../../../../../lib/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition');
19
+
20
+ const getDataContractFixture = require('../../../../../../../lib/test/fixtures/getDataContractFixture');
21
+
22
+ const {
23
+ expectValidationError,
24
+ expectJsonSchemaError,
25
+ } = require('../../../../../../../lib/test/expect/expectError');
26
+
27
+ const ValidationResult = require('../../../../../../../lib/validation/ValidationResult');
28
+
29
+ const SomeConsensusError = require('../../../../../../../lib/test/mocks/SomeConsensusError');
30
+ const DataContractImmutablePropertiesUpdateError = require('../../../../../../../lib/errors/consensus/basic/dataContract/DataContractImmutablePropertiesUpdateError');
31
+ const IncompatibleDataContractSchemaError = require('../../../../../../../lib/errors/consensus/basic/dataContract/IncompatibleDataContractSchemaError');
32
+ const StateTransitionExecutionContext = require('../../../../../../../lib/stateTransition/StateTransitionExecutionContext');
33
+
34
+ describe('validateDataContractUpdateTransitionBasicFactory', () => {
35
+ let validateDataContractMock;
36
+ let validateDataContractUpdateTransitionBasic;
37
+ let stateTransition;
38
+ let rawStateTransition;
39
+ let dataContract;
40
+ let rawDataContract;
41
+ let validateProtocolVersionMock;
42
+ let validateIndicesAreNotChangedMock;
43
+ let stateRepositoryMock;
44
+ let executionContext;
45
+
46
+ beforeEach(async function beforeEach() {
47
+ validateDataContractMock = this.sinonSandbox.stub().returns(new ValidationResult());
48
+ validateProtocolVersionMock = this.sinonSandbox.stub().returns(new ValidationResult());
49
+
50
+ dataContract = getDataContractFixture();
51
+
52
+ rawDataContract = lodashClone(dataContract.toObject());
53
+ rawDataContract.version += 1;
54
+
55
+ stateTransition = new DataContractUpdateTransition({
56
+ protocolVersion: protocolVersion.latestVersion,
57
+ dataContract: rawDataContract,
58
+ signature: Buffer.alloc(65),
59
+ signaturePublicKeyId: 0,
60
+ });
61
+
62
+ rawStateTransition = stateTransition.toObject();
63
+
64
+ const RE2 = await getRE2Class();
65
+ const ajv = createAjv(RE2);
66
+
67
+ const jsonSchemaValidator = new JsonSchemaValidator(ajv);
68
+
69
+ validateIndicesAreNotChangedMock = this.sinonSandbox.stub();
70
+ validateIndicesAreNotChangedMock.returns(new ValidationResult());
71
+
72
+ stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
73
+ stateRepositoryMock.fetchDataContract.resolves(dataContract);
74
+
75
+ executionContext = new StateTransitionExecutionContext();
76
+
77
+ // eslint-disable-next-line max-len
78
+ validateDataContractUpdateTransitionBasic = validateDataContractUpdateTransitionBasicFactory(
79
+ jsonSchemaValidator,
80
+ validateDataContractMock,
81
+ validateProtocolVersionMock,
82
+ stateRepositoryMock,
83
+ jsonSchemaDiffValidator,
84
+ validateIndicesAreNotChangedMock,
85
+ jsonPatch,
86
+ );
87
+ });
88
+
89
+ describe('protocolVersion', () => {
90
+ it('should be present', async () => {
91
+ delete rawStateTransition.protocolVersion;
92
+
93
+ const result = await validateDataContractUpdateTransitionBasic(
94
+ rawStateTransition,
95
+ executionContext,
96
+ );
97
+
98
+ expectJsonSchemaError(result);
99
+
100
+ const [error] = result.getErrors();
101
+
102
+ expect(error.getInstancePath()).to.equal('');
103
+ expect(error.getKeyword()).to.equal('required');
104
+ expect(error.getParams().missingProperty).to.equal('protocolVersion');
105
+ });
106
+
107
+ it('should be an integer', async () => {
108
+ rawStateTransition.protocolVersion = '1';
109
+
110
+ const result = await validateDataContractUpdateTransitionBasic(
111
+ rawStateTransition,
112
+ executionContext,
113
+ );
114
+
115
+ expectJsonSchemaError(result);
116
+
117
+ const [error] = result.getErrors();
118
+
119
+ expect(error.getInstancePath()).to.equal('/protocolVersion');
120
+ expect(error.getKeyword()).to.equal('type');
121
+ });
122
+
123
+ it('should be valid', async () => {
124
+ rawStateTransition.protocolVersion = -1;
125
+
126
+ const protocolVersionError = new SomeConsensusError('test');
127
+ const protocolVersionResult = new ValidationResult([
128
+ protocolVersionError,
129
+ ]);
130
+
131
+ validateProtocolVersionMock.returns(protocolVersionResult);
132
+
133
+ const result = await validateDataContractUpdateTransitionBasic(
134
+ rawStateTransition,
135
+ executionContext,
136
+ );
137
+
138
+ expectValidationError(result, SomeConsensusError);
139
+
140
+ const [error] = result.getErrors();
141
+
142
+ expect(error).to.equal(protocolVersionError);
143
+
144
+ expect(validateProtocolVersionMock).to.be.calledOnceWith(
145
+ rawStateTransition.protocolVersion,
146
+ );
147
+ });
148
+ });
149
+
150
+ describe('type', () => {
151
+ it('should be present', async () => {
152
+ delete rawStateTransition.type;
153
+
154
+ const result = await validateDataContractUpdateTransitionBasic(
155
+ rawStateTransition,
156
+ executionContext,
157
+ );
158
+
159
+ expectJsonSchemaError(result);
160
+
161
+ const [error] = result.getErrors();
162
+
163
+ expect(error.getInstancePath()).to.equal('');
164
+ expect(error.getKeyword()).to.equal('required');
165
+ expect(error.getParams().missingProperty).to.equal('type');
166
+ });
167
+
168
+ it('should be equal to 4', async () => {
169
+ rawStateTransition.type = 666;
170
+
171
+ const result = await validateDataContractUpdateTransitionBasic(
172
+ rawStateTransition,
173
+ executionContext,
174
+ );
175
+
176
+ expectJsonSchemaError(result);
177
+
178
+ const [error] = result.getErrors();
179
+
180
+ expect(error.getInstancePath()).to.equal('/type');
181
+ expect(error.getKeyword()).to.equal('const');
182
+ expect(error.getParams().allowedValue).to.equal(4);
183
+ });
184
+ });
185
+
186
+ describe('dataContract', () => {
187
+ it('should be present', async () => {
188
+ delete rawStateTransition.dataContract;
189
+
190
+ const result = await validateDataContractUpdateTransitionBasic(
191
+ rawStateTransition,
192
+ executionContext,
193
+ );
194
+
195
+ expectJsonSchemaError(result);
196
+
197
+ const [error] = result.getErrors();
198
+
199
+ expect(error.getInstancePath()).to.equal('');
200
+ expect(error.getKeyword()).to.equal('required');
201
+ expect(error.getParams().missingProperty).to.equal('dataContract');
202
+ });
203
+
204
+ it('should have no existing documents removed', async () => {
205
+ rawStateTransition.dataContract.documents.indexedDocument = undefined;
206
+
207
+ const result = await validateDataContractUpdateTransitionBasic(
208
+ rawStateTransition,
209
+ executionContext,
210
+ );
211
+
212
+ expectValidationError(result);
213
+
214
+ const [error] = result.getErrors();
215
+
216
+ expect(error).to.be.an.instanceOf(IncompatibleDataContractSchemaError);
217
+ expect(error.getOperation()).to.equal('remove');
218
+ expect(error.getFieldPath()).to.equal('/additionalProperties');
219
+ expect(error.getNewSchema()).to.equal(undefined);
220
+ });
221
+
222
+ it('should allow making backward compatible changes to existing documents', async () => {
223
+ rawStateTransition.dataContract.documents.indexedDocument.properties.newProp = {
224
+ type: 'integer',
225
+ minimum: 0,
226
+ };
227
+
228
+ const result = await validateDataContractUpdateTransitionBasic(
229
+ rawStateTransition,
230
+ executionContext,
231
+ );
232
+
233
+ expect(result.isValid()).to.be.true();
234
+ });
235
+
236
+ it('should have existing documents schema backward compatible', async () => {
237
+ rawStateTransition.dataContract.documents.indexedDocument.properties.firstName = undefined;
238
+
239
+ const result = await validateDataContractUpdateTransitionBasic(
240
+ rawStateTransition,
241
+ executionContext,
242
+ );
243
+
244
+ expectValidationError(result);
245
+
246
+ const [error] = result.getErrors();
247
+
248
+ expect(error).to.be.an.instanceOf(IncompatibleDataContractSchemaError);
249
+ expect(error.getOperation()).to.equal('remove');
250
+ expect(error.getFieldPath()).to.equal('/properties/firstName');
251
+ });
252
+
253
+ it('should allow defining new document', async () => {
254
+ rawStateTransition.dataContract.documents.myNewAwesomeDoc = {
255
+ type: 'object',
256
+ properties: {
257
+ name: {
258
+ type: 'string',
259
+ },
260
+ },
261
+ required: ['name'],
262
+ };
263
+
264
+ const result = await validateDataContractUpdateTransitionBasic(
265
+ rawStateTransition,
266
+ executionContext,
267
+ );
268
+
269
+ expect(result.isValid()).to.be.true();
270
+ });
271
+
272
+ it('should not have root immutable properties changed', async () => {
273
+ rawStateTransition.dataContract.$schema = undefined;
274
+
275
+ const result = await validateDataContractUpdateTransitionBasic(
276
+ rawStateTransition,
277
+ executionContext,
278
+ );
279
+
280
+ expectValidationError(result);
281
+
282
+ const [error] = result.getErrors();
283
+
284
+ expect(error).to.be.an.instanceOf(DataContractImmutablePropertiesUpdateError);
285
+ expect(error.getOperation()).to.equal('remove');
286
+ expect(error.getFieldPath()).to.equal('/$schema');
287
+ });
288
+
289
+ it('should be valid', async () => {
290
+ const dataContractError = new SomeConsensusError('test');
291
+ const dataContractResult = new ValidationResult([
292
+ dataContractError,
293
+ ]);
294
+
295
+ validateDataContractMock.returns(dataContractResult);
296
+
297
+ const result = await validateDataContractUpdateTransitionBasic(
298
+ rawStateTransition,
299
+ executionContext,
300
+ );
301
+
302
+ expectValidationError(result);
303
+
304
+ const [error] = result.getErrors();
305
+
306
+ expect(error).to.equal(dataContractError);
307
+
308
+ expect(validateDataContractMock.getCall(0).args).to.have.deep.members([rawDataContract]);
309
+ });
310
+ });
311
+
312
+ describe('signature', () => {
313
+ it('should be present', async () => {
314
+ delete rawStateTransition.signature;
315
+
316
+ const result = await validateDataContractUpdateTransitionBasic(
317
+ rawStateTransition,
318
+ executionContext,
319
+ );
320
+
321
+ expectJsonSchemaError(result);
322
+
323
+ const [error] = result.getErrors();
324
+
325
+ expect(error.getInstancePath()).to.equal('');
326
+ expect(error.getKeyword()).to.equal('required');
327
+ expect(error.getParams().missingProperty).to.equal('signature');
328
+ });
329
+
330
+ it('should be a byte array', async () => {
331
+ rawStateTransition.signature = new Array(65).fill('string');
332
+
333
+ const result = await validateDataContractUpdateTransitionBasic(
334
+ rawStateTransition,
335
+ executionContext,
336
+ );
337
+
338
+ expectJsonSchemaError(result, 2);
339
+
340
+ const [error, byteArrayError] = result.getErrors();
341
+
342
+ expect(error.getInstancePath()).to.equal('/signature/0');
343
+ expect(error.getKeyword()).to.equal('type');
344
+
345
+ expect(byteArrayError.getKeyword()).to.equal('byteArray');
346
+ });
347
+
348
+ it('should be not less than 65 bytes', async () => {
349
+ rawStateTransition.signature = Buffer.alloc(64);
350
+
351
+ const result = await validateDataContractUpdateTransitionBasic(
352
+ rawStateTransition,
353
+ executionContext,
354
+ );
355
+
356
+ expectJsonSchemaError(result);
357
+
358
+ const [error] = result.getErrors();
359
+
360
+ expect(error.getInstancePath()).to.equal('/signature');
361
+ expect(error.getKeyword()).to.equal('minItems');
362
+ expect(error.getParams().limit).to.equal(65);
363
+ });
364
+
365
+ it('should be not longer than 96 bytes', async () => {
366
+ rawStateTransition.signature = Buffer.alloc(97);
367
+
368
+ const result = await validateDataContractUpdateTransitionBasic(
369
+ rawStateTransition,
370
+ executionContext,
371
+ );
372
+
373
+ expectJsonSchemaError(result);
374
+
375
+ const [error] = result.getErrors();
376
+
377
+ expect(error.getInstancePath()).to.equal('/signature');
378
+ expect(error.getKeyword()).to.equal('maxItems');
379
+ expect(error.getParams().limit).to.equal(96);
380
+ });
381
+ });
382
+
383
+ describe('signaturePublicKeyId', () => {
384
+ it('should be an integer', async () => {
385
+ rawStateTransition.signaturePublicKeyId = 1.4;
386
+
387
+ const result = await validateDataContractUpdateTransitionBasic(
388
+ rawStateTransition,
389
+ executionContext,
390
+ );
391
+
392
+ expectJsonSchemaError(result, 1);
393
+
394
+ const [error] = result.getErrors();
395
+
396
+ expect(error.instancePath).to.equal('/signaturePublicKeyId');
397
+ expect(error.getKeyword()).to.equal('type');
398
+ });
399
+
400
+ it('should not be < 0', async () => {
401
+ rawStateTransition.signaturePublicKeyId = -1;
402
+
403
+ const result = await validateDataContractUpdateTransitionBasic(
404
+ rawStateTransition,
405
+ executionContext,
406
+ );
407
+
408
+ expectJsonSchemaError(result, 1);
409
+
410
+ const [error] = result.getErrors();
411
+
412
+ expect(error.instancePath).to.equal('/signaturePublicKeyId');
413
+ expect(error.getKeyword()).to.equal('minimum');
414
+ });
415
+ });
416
+
417
+ it('should return valid result', async () => {
418
+ const result = await validateDataContractUpdateTransitionBasic(
419
+ rawStateTransition,
420
+ executionContext,
421
+ );
422
+
423
+ expect(result).to.be.an.instanceOf(ValidationResult);
424
+ expect(result.isValid()).to.be.true();
425
+
426
+ expect(validateDataContractMock).to.be.calledOnceWith(rawDataContract);
427
+ });
428
+
429
+ it('should not check Data Contract on dry run', async () => {
430
+ stateRepositoryMock.fetchDataContract.resolves(null);
431
+
432
+ executionContext.enableDryRun();
433
+
434
+ const result = await validateDataContractUpdateTransitionBasic(
435
+ rawStateTransition,
436
+ executionContext,
437
+ );
438
+
439
+ executionContext.disableDryRun();
440
+
441
+ expect(result).to.be.an.instanceOf(ValidationResult);
442
+ expect(result.isValid()).to.be.true();
443
+ });
444
+ });