@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,595 @@
1
+ const { getRE2Class } = require('@dashevo/wasm-re2');
2
+ const { PrivateKey } = require('@dashevo/dashcore-lib');
3
+ const validateIdentityUpdateTransitionBasicFactory = require(
4
+ '../../../../../../../lib/identity/stateTransition/IdentityUpdateTransition/validation/basic/validateIdentityUpdateTransitionBasicFactory',
5
+ );
6
+ const JsonSchemaValidator = require('../../../../../../../lib/validation/JsonSchemaValidator');
7
+ const createAjv = require('../../../../../../../lib/ajv/createAjv');
8
+ const ValidationResult = require('../../../../../../../lib/validation/ValidationResult');
9
+ const IdentityPublicKey = require('../../../../../../../lib/identity/IdentityPublicKey');
10
+ const getIdentityUpdateTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityUpdateTransitionFixture');
11
+ const { expectJsonSchemaError, expectValidationError } = require('../../../../../../../lib/test/expect/expectError');
12
+ const SomeConsensusError = require('../../../../../../../lib/test/mocks/SomeConsensusError');
13
+
14
+ describe('validateIdentityUpdateTransitionBasicFactory', () => {
15
+ let validateIdentityUpdateTransitionBasic;
16
+ let validateProtocolVersionMock;
17
+ let validatePublicKeysMock;
18
+ let rawStateTransition;
19
+ let stateTransition;
20
+ let publicKeyToAdd;
21
+ let validatePublicKeySignaturesMock;
22
+
23
+ beforeEach(async function beforeEach() {
24
+ const RE2 = await getRE2Class();
25
+ const ajv = createAjv(RE2);
26
+ const jsonSchemaValidator = new JsonSchemaValidator(ajv);
27
+
28
+ validateProtocolVersionMock = this.sinonSandbox.stub().returns(new ValidationResult());
29
+
30
+ validatePublicKeysMock = this.sinonSandbox.stub()
31
+ .returns(new ValidationResult());
32
+
33
+ validatePublicKeySignaturesMock = this.sinonSandbox.stub()
34
+ .returns(new ValidationResult());
35
+
36
+ validateIdentityUpdateTransitionBasic = validateIdentityUpdateTransitionBasicFactory(
37
+ jsonSchemaValidator,
38
+ validateProtocolVersionMock,
39
+ validatePublicKeysMock,
40
+ validatePublicKeySignaturesMock,
41
+ );
42
+
43
+ stateTransition = getIdentityUpdateTransitionFixture();
44
+
45
+ const privateKeyModel = new PrivateKey();
46
+ const privateKeyHex = privateKeyModel.toBuffer().toString('hex');
47
+ const publicKey = privateKeyModel.toPublicKey().toBuffer();
48
+
49
+ const identityPublicKey = new IdentityPublicKey()
50
+ .setId(1)
51
+ .setType(IdentityPublicKey.TYPES.ECDSA_SECP256K1)
52
+ .setData(publicKey)
53
+ .setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER)
54
+ .setPurpose(IdentityPublicKey.PURPOSES.AUTHENTICATION);
55
+
56
+ await stateTransition.sign(identityPublicKey, privateKeyHex);
57
+
58
+ rawStateTransition = stateTransition.toObject();
59
+
60
+ publicKeyToAdd = {
61
+ id: 0,
62
+ type: IdentityPublicKey.TYPES.ECDSA_SECP256K1,
63
+ data: Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64'),
64
+ purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION,
65
+ securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER,
66
+ readOnly: false,
67
+ };
68
+ });
69
+
70
+ describe('protocolVersion', () => {
71
+ it('should be present', async () => {
72
+ delete rawStateTransition.protocolVersion;
73
+
74
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
75
+
76
+ expectJsonSchemaError(result);
77
+
78
+ const [error] = result.getErrors();
79
+
80
+ expect(error.getInstancePath()).to.equal('');
81
+ expect(error.getKeyword()).to.equal('required');
82
+ expect(error.getParams().missingProperty).to.equal('protocolVersion');
83
+ });
84
+
85
+ it('should be integer', async () => {
86
+ rawStateTransition.protocolVersion = '1';
87
+
88
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
89
+
90
+ expectJsonSchemaError(result);
91
+
92
+ const [error] = result.getErrors();
93
+
94
+ expect(error.getInstancePath()).to.equal('/protocolVersion');
95
+ expect(error.getKeyword()).to.equal('type');
96
+ });
97
+
98
+ it('should be valid', async () => {
99
+ rawStateTransition.protocolVersion = -1;
100
+ const protocolVersionError = new SomeConsensusError('test');
101
+ const protocolVersionResult = new ValidationResult([
102
+ protocolVersionError,
103
+ ]);
104
+
105
+ validateProtocolVersionMock.returns(protocolVersionResult);
106
+
107
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
108
+
109
+ expectValidationError(result, SomeConsensusError);
110
+
111
+ const [error] = result.getErrors();
112
+
113
+ expect(error).to.equal(protocolVersionError);
114
+
115
+ expect(validateProtocolVersionMock).to.be.calledOnceWith(
116
+ rawStateTransition.protocolVersion,
117
+ );
118
+ });
119
+ });
120
+
121
+ describe('type', () => {
122
+ it('should be present', async () => {
123
+ delete rawStateTransition.type;
124
+
125
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
126
+
127
+ expectJsonSchemaError(result);
128
+
129
+ const [error] = result.getErrors();
130
+
131
+ expect(error.getInstancePath()).to.equal('');
132
+ expect(error.getKeyword()).to.equal('required');
133
+ expect(error.getParams().missingProperty).to.equal('type');
134
+ });
135
+
136
+ it('should be equal to 5', async () => {
137
+ rawStateTransition.type = 666;
138
+
139
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
140
+
141
+ expectJsonSchemaError(result);
142
+
143
+ const [error] = result.getErrors();
144
+
145
+ expect(error.getInstancePath()).to.equal('/type');
146
+ expect(error.getKeyword()).to.equal('const');
147
+ expect(error.getParams().allowedValue).to.equal(5);
148
+ });
149
+ });
150
+
151
+ describe('identityId', () => {
152
+ it('should be present', async () => {
153
+ delete rawStateTransition.identityId;
154
+
155
+ const result = await validateIdentityUpdateTransitionBasic(
156
+ rawStateTransition,
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('identityId');
166
+ });
167
+
168
+ it('should be a byte array', async () => {
169
+ rawStateTransition.identityId = new Array(32).fill('string');
170
+
171
+ const result = await validateIdentityUpdateTransitionBasic(
172
+ rawStateTransition,
173
+ );
174
+
175
+ expectJsonSchemaError(result, 2);
176
+
177
+ const [error, byteArrayError] = result.getErrors();
178
+
179
+ expect(error.getInstancePath()).to.equal('/identityId/0');
180
+ expect(error.getKeyword()).to.equal('type');
181
+
182
+ expect(byteArrayError.getKeyword()).to.equal('byteArray');
183
+ });
184
+
185
+ it('should be no less than 32 bytes', async () => {
186
+ rawStateTransition.identityId = Buffer.alloc(31);
187
+
188
+ const result = await validateIdentityUpdateTransitionBasic(
189
+ rawStateTransition,
190
+ );
191
+
192
+ expectJsonSchemaError(result);
193
+
194
+ const [error] = result.getErrors();
195
+
196
+ expect(error.instancePath).to.equal('/identityId');
197
+ expect(error.getKeyword()).to.equal('minItems');
198
+ });
199
+
200
+ it('should be no longer than 32 bytes', async () => {
201
+ rawStateTransition.identityId = Buffer.alloc(33);
202
+
203
+ const result = await validateIdentityUpdateTransitionBasic(
204
+ rawStateTransition,
205
+ );
206
+
207
+ expectJsonSchemaError(result);
208
+
209
+ const [error] = result.getErrors();
210
+
211
+ expect(error.instancePath).to.equal('/identityId');
212
+ expect(error.getKeyword()).to.equal('maxItems');
213
+ });
214
+ });
215
+
216
+ describe('signature', () => {
217
+ it('should be present', async () => {
218
+ delete rawStateTransition.signature;
219
+
220
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
221
+
222
+ expectJsonSchemaError(result);
223
+
224
+ const [error] = result.getErrors();
225
+
226
+ expect(error.instancePath).to.equal('');
227
+ expect(error.getKeyword()).to.equal('required');
228
+ expect(error.getParams().missingProperty).to.equal('signature');
229
+ });
230
+
231
+ it('should be a byte array', async () => {
232
+ rawStateTransition.signature = new Array(65).fill('string');
233
+
234
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
235
+
236
+ expectJsonSchemaError(result, 2);
237
+
238
+ const [error, byteArrayError] = result.getErrors();
239
+
240
+ expect(error.instancePath).to.equal('/signature/0');
241
+ expect(error.getKeyword()).to.equal('type');
242
+
243
+ expect(byteArrayError.getKeyword()).to.equal('byteArray');
244
+ });
245
+
246
+ it('should be not shorter than 65 bytes', async () => {
247
+ rawStateTransition.signature = Buffer.alloc(64);
248
+
249
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
250
+
251
+ expectJsonSchemaError(result);
252
+
253
+ const [error] = result.getErrors();
254
+
255
+ expect(error.instancePath).to.equal('/signature');
256
+ expect(error.getKeyword()).to.equal('minItems');
257
+ });
258
+
259
+ it('should be not longer than 96 bytes', async () => {
260
+ rawStateTransition.signature = Buffer.alloc(97);
261
+
262
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
263
+
264
+ expectJsonSchemaError(result);
265
+
266
+ const [error] = result.getErrors();
267
+
268
+ expect(error.instancePath).to.equal('/signature');
269
+ expect(error.getKeyword()).to.equal('maxItems');
270
+ });
271
+ });
272
+
273
+ describe('revision', () => {
274
+ it('should be present', async () => {
275
+ delete rawStateTransition.revision;
276
+
277
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
278
+
279
+ expectJsonSchemaError(result);
280
+
281
+ const [error] = result.getErrors();
282
+
283
+ expect(error.getInstancePath()).to.equal('');
284
+ expect(error.getKeyword()).to.equal('required');
285
+ expect(error.getParams().missingProperty).to.equal('revision');
286
+ });
287
+
288
+ it('should be integer', async () => {
289
+ rawStateTransition.revision = '1';
290
+
291
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
292
+
293
+ expectJsonSchemaError(result);
294
+
295
+ const [error] = result.getErrors();
296
+
297
+ expect(error.getInstancePath()).to.equal('/revision');
298
+ expect(error.getKeyword()).to.equal('type');
299
+ });
300
+
301
+ it('should be greater or equal 0', async () => {
302
+ rawStateTransition.revision = -1;
303
+
304
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
305
+
306
+ expectJsonSchemaError(result);
307
+
308
+ const [error] = result.getErrors();
309
+
310
+ expect(error.getKeyword()).to.equal('minimum');
311
+ expect(error.getInstancePath()).to.equal('/revision');
312
+ });
313
+ });
314
+
315
+ describe('addPublicKeys', async () => {
316
+ beforeEach(() => {
317
+ delete rawStateTransition.disablePublicKeys;
318
+ delete rawStateTransition.publicKeysDisabledAt;
319
+ });
320
+
321
+ it('should return valid result', async () => {
322
+ rawStateTransition.addPublicKeys = [publicKeyToAdd];
323
+
324
+ const result = await validateIdentityUpdateTransitionBasic(
325
+ rawStateTransition,
326
+ );
327
+
328
+ expect(result.isValid()).to.be.true();
329
+ });
330
+
331
+ it('should not be empty', async () => {
332
+ rawStateTransition.addPublicKeys = [];
333
+
334
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
335
+
336
+ expectJsonSchemaError(result);
337
+
338
+ const [error] = result.getErrors();
339
+ expect(error.getKeyword()).to.equal('minItems');
340
+ expect(error.getInstancePath()).to.equal('/addPublicKeys');
341
+ });
342
+
343
+ it('should not have more than 10 items', async () => {
344
+ rawStateTransition.addPublicKeys = [];
345
+
346
+ for (let i = 0; i <= 10; i++) {
347
+ rawStateTransition.addPublicKeys.push(publicKeyToAdd);
348
+ }
349
+
350
+ const result = await validateIdentityUpdateTransitionBasic(
351
+ rawStateTransition,
352
+ );
353
+
354
+ expectJsonSchemaError(result);
355
+
356
+ const [error] = result.getErrors();
357
+
358
+ expect(error.getKeyword()).to.equal('maxItems');
359
+ expect(error.getInstancePath()).to.equal('/addPublicKeys');
360
+ });
361
+
362
+ it('should be unique', async () => {
363
+ rawStateTransition.addPublicKeys = [publicKeyToAdd, publicKeyToAdd];
364
+
365
+ const result = await validateIdentityUpdateTransitionBasic(
366
+ rawStateTransition,
367
+ );
368
+
369
+ expectJsonSchemaError(result);
370
+
371
+ const [error] = result.getErrors();
372
+
373
+ expect(error.getKeyword()).to.equal('uniqueItems');
374
+ expect(error.getInstancePath()).to.equal('/addPublicKeys');
375
+ });
376
+
377
+ it('should be valid', async () => {
378
+ rawStateTransition.addPublicKeys = [publicKeyToAdd];
379
+
380
+ const publicKeysError = new SomeConsensusError('test');
381
+ const publicKeysResult = new ValidationResult([
382
+ publicKeysError,
383
+ ]);
384
+
385
+ validatePublicKeysMock.returns(publicKeysResult);
386
+
387
+ const result = await validateIdentityUpdateTransitionBasic(
388
+ rawStateTransition,
389
+ );
390
+
391
+ expectValidationError(result);
392
+
393
+ const [error] = result.getErrors();
394
+
395
+ expect(error).to.equal(publicKeysError);
396
+
397
+ expect(validatePublicKeysMock).to.be.calledOnceWithExactly(
398
+ rawStateTransition.addPublicKeys,
399
+ );
400
+ });
401
+
402
+ it('should have valid signatures', async () => {
403
+ const publicKeysError = new SomeConsensusError('test');
404
+ const publicKeysResult = new ValidationResult([
405
+ publicKeysError,
406
+ ]);
407
+
408
+ validatePublicKeySignaturesMock.resolves(publicKeysResult);
409
+
410
+ const result = await validateIdentityUpdateTransitionBasic(
411
+ rawStateTransition,
412
+ );
413
+
414
+ expectValidationError(result);
415
+
416
+ const [error] = result.getErrors();
417
+
418
+ expect(error).to.equal(publicKeysError);
419
+ });
420
+ });
421
+
422
+ describe('disablePublicKeys', async () => {
423
+ beforeEach(() => {
424
+ delete rawStateTransition.addPublicKeys;
425
+ });
426
+
427
+ it('should be used only with publicKeysDisabledAt', async () => {
428
+ delete rawStateTransition.publicKeysDisabledAt;
429
+
430
+ const result = await validateIdentityUpdateTransitionBasic(
431
+ rawStateTransition,
432
+ );
433
+
434
+ expectJsonSchemaError(result);
435
+
436
+ const [error] = result.getErrors();
437
+ expect(error.getKeyword()).to.equal('dependentRequired');
438
+ expect(error.params.missingProperty).to.equal('publicKeysDisabledAt');
439
+ });
440
+
441
+ it('should be valid', async () => {
442
+ rawStateTransition.disablePublicKeys = [0];
443
+ rawStateTransition.publicKeysDisabledAt = 0;
444
+
445
+ const result = await validateIdentityUpdateTransitionBasic(
446
+ rawStateTransition,
447
+ );
448
+
449
+ expect(result.isValid()).to.be.true();
450
+ });
451
+
452
+ it('should contain numbers >= 0', async () => {
453
+ rawStateTransition.disablePublicKeys = [-1, 0];
454
+ rawStateTransition.publicKeysDisabledAt = 0;
455
+
456
+ const result = await validateIdentityUpdateTransitionBasic(
457
+ rawStateTransition,
458
+ );
459
+
460
+ expectJsonSchemaError(result);
461
+
462
+ const [error] = result.getErrors();
463
+
464
+ expect(error.getInstancePath()).to.equal('/disablePublicKeys/0');
465
+ expect(error.getKeyword()).to.equal('minimum');
466
+ });
467
+
468
+ it('should contain integers', async () => {
469
+ rawStateTransition.publicKeysDisabledAt = 0;
470
+ rawStateTransition.disablePublicKeys = [1.1];
471
+
472
+ const result = await validateIdentityUpdateTransitionBasic(
473
+ rawStateTransition,
474
+ );
475
+
476
+ expectJsonSchemaError(result);
477
+
478
+ const [error] = result.getErrors();
479
+
480
+ expect(error.getInstancePath()).to.equal('/disablePublicKeys/0');
481
+ expect(error.getKeyword()).to.equal('type');
482
+ });
483
+
484
+ it('should not have more than 10 items', async () => {
485
+ rawStateTransition.publicKeysDisabledAt = 0;
486
+ rawStateTransition.disablePublicKeys = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
487
+
488
+ const result = await validateIdentityUpdateTransitionBasic(
489
+ rawStateTransition,
490
+ );
491
+
492
+ expectJsonSchemaError(result);
493
+
494
+ const [error] = result.getErrors();
495
+
496
+ expect(error.getKeyword()).to.equal('maxItems');
497
+ expect(error.getInstancePath()).to.equal('/disablePublicKeys');
498
+ });
499
+
500
+ it('should be unique', async () => {
501
+ rawStateTransition.publicKeysDisabledAt = 0;
502
+ rawStateTransition.disablePublicKeys = [0, 0];
503
+
504
+ const result = await validateIdentityUpdateTransitionBasic(
505
+ rawStateTransition,
506
+ );
507
+
508
+ expectJsonSchemaError(result);
509
+
510
+ const [error] = result.getErrors();
511
+
512
+ expect(error.getKeyword()).to.equal('uniqueItems');
513
+ expect(error.getInstancePath()).to.equal('/disablePublicKeys');
514
+ });
515
+ });
516
+
517
+ describe('publicKeysDisabledAt', async () => {
518
+ it('should be used only with disablePublicKeys', async () => {
519
+ delete rawStateTransition.disablePublicKeys;
520
+
521
+ const result = await validateIdentityUpdateTransitionBasic(
522
+ rawStateTransition,
523
+ );
524
+
525
+ expectJsonSchemaError(result);
526
+
527
+ const [error] = result.getErrors();
528
+ expect(error.getKeyword()).to.equal('dependentRequired');
529
+ expect(error.params.missingProperty).to.equal('disablePublicKeys');
530
+ });
531
+
532
+ it('should be integer', async () => {
533
+ rawStateTransition.publicKeysDisabledAt = 1.1;
534
+ rawStateTransition.disablePublicKeys = [0];
535
+
536
+ const result = await validateIdentityUpdateTransitionBasic(
537
+ rawStateTransition,
538
+ );
539
+
540
+ expectJsonSchemaError(result);
541
+
542
+ const [error] = result.getErrors();
543
+
544
+ expect(error.getInstancePath()).to.equal('/publicKeysDisabledAt');
545
+ expect(error.getKeyword()).to.equal('type');
546
+ });
547
+
548
+ it('should be >= 0', async () => {
549
+ rawStateTransition.publicKeysDisabledAt = -1;
550
+ rawStateTransition.disablePublicKeys = [0];
551
+
552
+ const result = await validateIdentityUpdateTransitionBasic(
553
+ rawStateTransition,
554
+ );
555
+
556
+ expectJsonSchemaError(result);
557
+
558
+ const [error] = result.getErrors();
559
+
560
+ expect(error.getInstancePath()).to.equal('/publicKeysDisabledAt');
561
+ expect(error.getKeyword()).to.equal('minimum');
562
+ });
563
+ });
564
+
565
+ it('should return valid result', async () => {
566
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
567
+
568
+ expect(result.isValid()).to.be.true();
569
+
570
+ expect(validatePublicKeysMock)
571
+ .to.be.calledOnceWithExactly(
572
+ rawStateTransition.addPublicKeys,
573
+ );
574
+ });
575
+
576
+ it('should have either addPublicKeys or disablePublicKeys', async () => {
577
+ delete rawStateTransition.disablePublicKeys;
578
+ delete rawStateTransition.addPublicKeys;
579
+ delete rawStateTransition.publicKeysDisabledAt;
580
+
581
+ const result = await validateIdentityUpdateTransitionBasic(rawStateTransition);
582
+
583
+ expectJsonSchemaError(result, 3);
584
+
585
+ const [addPublicKeysError, disablePublicKeysError, error] = result.getErrors();
586
+
587
+ expect(error.getKeyword()).to.equal('anyOf');
588
+
589
+ expect(disablePublicKeysError.schemaPath).to.equal('#/anyOf/1/required');
590
+ expect(disablePublicKeysError.getKeyword()).to.equal('required');
591
+
592
+ expect(addPublicKeysError.schemaPath).to.equal('#/anyOf/0/required');
593
+ expect(addPublicKeysError.getKeyword()).to.equal('required');
594
+ });
595
+ });