@dashevo/wasm-dpp 0.24.0-dev.11 → 0.24.0-dev.13
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/Cargo.toml +3 -0
- package/README.md +5 -1
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +9 -0
- package/dist/lib/dpp.d.ts +9 -0
- package/dist/lib/errors/AbstractConsensusError.d.ts +10 -0
- package/dist/lib/errors/DPPError.d.ts +5 -0
- package/dist/lib/errors/patchConsensusErrors.d.ts +1 -0
- package/dist/lib/{patchIdentifier.d.ts → identifier/patchIdentifier.d.ts} +1 -1
- package/dist/{index.d.ts → lib/index.d.ts} +1 -1
- package/dist/lib/utils/extend.d.ts +1 -0
- package/dist/wasm/wasm_dpp.d.ts +1595 -518
- package/karma.conf.js +5 -0
- package/lib/dpp.ts +24 -0
- package/lib/errors/AbstractConsensusError.ts +13 -0
- package/lib/errors/DPPError.ts +15 -0
- package/lib/errors/patchConsensusErrors.ts +175 -0
- package/lib/{patchIdentifier.ts → identifier/patchIdentifier.ts} +6 -5
- package/{index.ts → lib/index.ts} +5 -4
- package/lib/test/bootstrap.js +5 -0
- package/lib/test/expect/expectError.js +4 -2
- package/lib/test/mocks/getBlsAdapterMock.js +36 -0
- package/lib/test/utils/newDocumentsContainer.js +36 -0
- package/lib/utils/extend.ts +6 -0
- package/package.json +9 -6
- package/src/bls_adapter.rs +16 -1
- package/src/data_contract/data_contract.rs +35 -7
- package/src/data_contract/errors/invalid_data_contract.rs +21 -0
- package/src/data_contract/errors/invalid_document_type.rs +1 -1
- package/src/data_contract/index.rs +56 -1
- package/src/data_contract/mod.rs +1 -0
- package/src/data_contract/state_transition/data_contract_create_transition/mod.rs +6 -8
- package/src/data_contract/state_transition/data_contract_create_transition/validation.rs +4 -4
- package/src/data_contract/state_transition/data_contract_update_transition/apply.rs +44 -0
- package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +145 -0
- package/src/data_contract/state_transition/data_contract_update_transition/validation.rs +49 -0
- package/src/data_contract/state_transition/mod.rs +2 -0
- package/src/data_contract_factory/data_contract_factory.rs +25 -12
- package/src/document/errors/invalid_document_error.rs +10 -9
- package/src/document/errors/invalid_initial_revision_error.rs +1 -1
- package/src/document/errors/mismatch_owners_ids_error.rs +14 -4
- package/src/document/errors/mod.rs +17 -13
- package/src/document/errors/no_documents_supplied_error.rs +4 -4
- package/src/document/factory.rs +192 -0
- package/src/document/mod.rs +222 -30
- package/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +47 -1
- package/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs +25 -1
- package/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +65 -0
- package/src/document/state_transition/document_batch_transition/document_transition/mod.rs +123 -3
- package/src/document/state_transition/document_batch_transition/mod.rs +378 -0
- package/src/document/validator.rs +30 -0
- package/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs +5 -5
- package/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +4 -4
- package/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +36 -0
- package/src/errors/consensus/basic/document/missing_document_transition_type_error.rs +20 -0
- package/src/errors/consensus/basic/document/mod.rs +4 -0
- package/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +2 -2
- package/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +2 -2
- package/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +6 -2
- package/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +5 -2
- package/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +3 -3
- package/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +2 -2
- package/src/errors/consensus/basic/json_schema_error.rs +1 -1
- package/src/errors/consensus_error.rs +15 -8
- package/src/errors/dpp_error.rs +17 -0
- package/src/errors/from.rs +6 -1
- package/src/errors/js_conversion.rs +19 -4
- package/src/errors/mod.rs +3 -0
- package/src/errors/protocol_error.rs +15 -0
- package/src/{identifier.rs → identifier/mod.rs} +48 -3
- package/src/identity/errors/asset_lock_output_not_found_error.rs +11 -0
- package/src/identity/errors/asset_lock_transaction_is_not_found_error.rs +20 -0
- package/src/identity/errors/mod.rs +7 -0
- package/src/identity/errors/unknown_asset_lock_proof_type_error.rs +26 -0
- package/src/{identity_facade.rs → identity/identity_facade.rs} +3 -5
- package/src/{identity_public_key → identity/identity_public_key}/key_type.rs +0 -0
- package/src/{identity_public_key → identity/identity_public_key}/mod.rs +41 -10
- package/src/{identity_public_key → identity/identity_public_key}/purpose.rs +0 -0
- package/src/{identity_public_key → identity/identity_public_key}/security_level.rs +0 -0
- package/src/{identity.rs → identity/mod.rs} +20 -12
- package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +132 -0
- package/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +72 -0
- package/src/identity/state_transition/asset_lock_proof/chain/mod.rs +4 -0
- package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +177 -0
- package/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +72 -0
- package/src/identity/state_transition/asset_lock_proof/instant/mod.rs +4 -0
- package/src/identity/state_transition/asset_lock_proof/mod.rs +269 -0
- package/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs +26 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +335 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs +153 -0
- package/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +37 -0
- package/src/identity/state_transition/identity_create_transition/mod.rs +8 -0
- package/src/identity/state_transition/identity_create_transition/to_object.rs +46 -0
- package/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +31 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +280 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_basic_validator.rs +113 -0
- package/src/identity/state_transition/identity_topup_transition/identity_topup_transition_state_validator.rs +37 -0
- package/src/identity/state_transition/identity_topup_transition/mod.rs +8 -0
- package/src/identity/state_transition/identity_topup_transition/to_object.rs +42 -0
- package/src/identity/state_transition/mod.rs +9 -0
- package/src/identity/state_transition/validate_public_key_signatures.rs +59 -0
- package/src/identity/validation/mod.rs +3 -0
- package/src/identity/validation/public_keys_validator.rs +76 -0
- package/src/identity_public_key/public_keys_validator.rs +1 -1
- package/src/lib.rs +3 -6
- package/src/lodash.rs +7 -0
- package/src/state_repository.rs +188 -36
- package/src/state_transition/mod.rs +12 -0
- package/src/utils.rs +102 -7
- package/src/validation/json_schema_validator.rs +41 -0
- package/src/validation/mod.rs +5 -0
- package/src/{validation_result.rs → validation/validation_result.rs} +23 -5
- package/src/version/mod.rs +2 -0
- package/src/version/protocol_version.rs +26 -0
- package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +579 -502
- package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +175 -165
- package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +83 -114
- package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +1 -1
- package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +82 -91
- package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +75 -31
- package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +93 -148
- package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +63 -75
- package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +48 -19
- package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +79 -114
- package/test/integration/stateTransition/AbstractStateTransitionIdentitySigned.spec.js +0 -11
- package/test/integration/stateTransition/StateTransitionFacade.spec.js +1 -1
- package/test/integration/stateTransition/calculateStateTransitionFeeFactory.spec.js +135 -0
- package/test/unit/dataContract/DataContract.spec.js +5 -9
- package/test/unit/dataContract/DataContractFactory.spec.js +13 -6
- package/test/unit/dataContract/createDataContract.spec.js +0 -1
- package/test/unit/dataContract/errors/InvalidDataContractError.spec.js +11 -3
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +3 -3
- package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +20 -16
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +24 -60
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +27 -23
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +29 -12
- package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +66 -49
- package/test/unit/dataContract/validation/validateDataContractPatterns.spec.js +73 -0
- package/test/unit/decodeProtocolEntityFactory.spec.js +2 -2
- package/test/unit/document/Document.spec.js +147 -155
- package/test/unit/document/DocumentFactory.spec.js +325 -91
- package/test/unit/document/stateTransition/DocumetsBatchTransition/DocumentsBatchTransition.spec.js +142 -64
- package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +1 -1
- package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +1 -1
- package/test/unit/identity/Identity.spec.js +2 -2
- package/test/unit/identity/IdentityPublicKey.spec.js +25 -31
- package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +69 -30
- package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +32 -32
- package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +56 -25
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +36 -16
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +48 -46
- package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +24 -6
- package/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +63 -0
- package/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +90 -0
- package/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +18 -3
- package/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +38 -11
- package/tsconfig.json +1 -1
- package/wasm/package.json +5 -0
- package/wasm/wasm_dpp.d.ts +1595 -518
- package/wasm/wasm_dpp.js +5007 -2172
- package/wasm/wasm_dpp_bg.js +1 -1
- package/wasm/wasm_dpp_bg.wasm +0 -0
- package/wasm/wasm_dpp_bg.wasm.d.ts +566 -365
- package/webpack.config.js +10 -1
- package/test/integration/stateTransition/calculateStateTransitionFee.spec.js +0 -32
- package/test/unit/dataContract/validation/validateDataContractMaxDepthFactory.spec.js +0 -93
- package/test/unit/dataContract/validation/validateDataContractPatternsFactory.spec.js +0 -64
|
@@ -1,86 +1,65 @@
|
|
|
1
|
-
const { getRE2Class } = require('@dashevo/wasm-re2');
|
|
2
1
|
const lodashCloneDeep = require('lodash/cloneDeep');
|
|
3
|
-
|
|
4
|
-
const $RefParser = require('@apidevtools/json-schema-ref-parser');
|
|
5
|
-
|
|
6
|
-
const createAjv = require('@dashevo/dpp/lib/ajv/createAjv');
|
|
7
|
-
|
|
8
|
-
const JsonSchemaValidator = require('@dashevo/dpp/lib/validation/JsonSchemaValidator');
|
|
9
|
-
|
|
10
|
-
const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult');
|
|
11
|
-
|
|
12
|
-
const validateDataContractFactory = require('@dashevo/dpp/lib/dataContract/validation/validateDataContractFactory');
|
|
13
|
-
const validateDataContractMaxDepthFactory = require('@dashevo/dpp/lib/dataContract/validation/validateDataContractMaxDepthFactory');
|
|
14
|
-
const enrichDataContractWithBaseSchema = require('@dashevo/dpp/lib/dataContract/enrichDataContractWithBaseSchema');
|
|
15
|
-
const validateDataContractPatternsFactory = require('@dashevo/dpp/lib/dataContract/validation/validateDataContractPatternsFactory');
|
|
16
|
-
|
|
17
2
|
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
|
|
3
|
+
const { expectJsonSchemaError, expectValidationError } = require('../../../../lib/test/expect/expectError');
|
|
18
4
|
|
|
19
|
-
const {
|
|
20
|
-
|
|
21
|
-
const DuplicateIndexError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/DuplicateIndexError');
|
|
22
|
-
const UndefinedIndexPropertyError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/UndefinedIndexPropertyError');
|
|
23
|
-
const InvalidIndexPropertyTypeError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/InvalidIndexPropertyTypeError');
|
|
24
|
-
const SystemPropertyIndexAlreadyPresentError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/SystemPropertyIndexAlreadyPresentError');
|
|
25
|
-
const UniqueIndicesLimitReachedError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/UniqueIndicesLimitReachedError');
|
|
26
|
-
const InvalidIndexedPropertyConstraintError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/InvalidIndexedPropertyConstraintError');
|
|
27
|
-
const InvalidCompoundIndexError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/InvalidCompoundIndexError');
|
|
28
|
-
const IncompatibleRe2PatternError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/IncompatibleRe2PatternError');
|
|
29
|
-
const InvalidJsonSchemaRefError = require('@dashevo/dpp/lib/errors/consensus/basic/dataContract/InvalidJsonSchemaRefError');
|
|
30
|
-
const JsonSchemaCompilationError = require('@dashevo/dpp/lib/errors/consensus/basic/JsonSchemaCompilationError');
|
|
31
|
-
const SomeConsensusError = require('@dashevo/dpp/lib/test/mocks/SomeConsensusError');
|
|
32
|
-
const getPropertyDefinitionByPath = require('@dashevo/dpp/lib/dataContract/getPropertyDefinitionByPath');
|
|
33
|
-
|
|
34
|
-
describe('validateDataContractFactory', function main() {
|
|
35
|
-
this.timeout(15000);
|
|
5
|
+
const { default: loadWasmDpp } = require('../../../../dist');
|
|
36
6
|
|
|
7
|
+
describe('validateDataContractFactory', () => {
|
|
37
8
|
let dataContract;
|
|
38
|
-
let rawDataContract;
|
|
39
9
|
let validateDataContract;
|
|
40
|
-
|
|
41
|
-
let
|
|
10
|
+
|
|
11
|
+
let DataContractValidator;
|
|
12
|
+
let ValidationResult;
|
|
13
|
+
let JsonSchemaCompilationError;
|
|
14
|
+
let IncompatibleRe2PatternError;
|
|
15
|
+
let DuplicateIndexError;
|
|
16
|
+
let UndefinedIndexPropertyError;
|
|
17
|
+
let UniqueIndicesLimitReachedError;
|
|
18
|
+
let SystemPropertyIndexAlreadyPresentError;
|
|
19
|
+
let InvalidIndexPropertyTypeError;
|
|
20
|
+
let InvalidCompoundIndexError;
|
|
21
|
+
let InvalidIndexedPropertyConstraintError;
|
|
22
|
+
let InvalidJsonSchemaRefError;
|
|
42
23
|
|
|
43
24
|
before(async () => {
|
|
44
|
-
|
|
25
|
+
({
|
|
26
|
+
DataContractValidator,
|
|
27
|
+
ValidationResult,
|
|
28
|
+
JsonSchemaCompilationError,
|
|
29
|
+
IncompatibleRe2PatternError,
|
|
30
|
+
DuplicateIndexError,
|
|
31
|
+
UndefinedIndexPropertyError,
|
|
32
|
+
UniqueIndicesLimitReachedError,
|
|
33
|
+
SystemPropertyIndexAlreadyPresentError,
|
|
34
|
+
InvalidIndexPropertyTypeError,
|
|
35
|
+
InvalidCompoundIndexError,
|
|
36
|
+
InvalidIndexedPropertyConstraintError,
|
|
37
|
+
InvalidJsonSchemaRefError,
|
|
38
|
+
} = await loadWasmDpp());
|
|
45
39
|
});
|
|
46
40
|
|
|
47
|
-
beforeEach(async
|
|
41
|
+
beforeEach(async () => {
|
|
48
42
|
dataContract = getDataContractFixture();
|
|
49
|
-
rawDataContract = dataContract.toObject();
|
|
50
|
-
|
|
51
|
-
const ajv = createAjv(RE2);
|
|
52
|
-
const jsonSchemaValidator = new JsonSchemaValidator(ajv);
|
|
53
43
|
|
|
54
|
-
const
|
|
44
|
+
const dataContractValidator = new DataContractValidator();
|
|
55
45
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
validateProtocolVersionMock = this.sinonSandbox.stub().returns(new ValidationResult());
|
|
46
|
+
validateDataContract = (contract) => dataContractValidator.validate(contract);
|
|
47
|
+
});
|
|
59
48
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
validateDataContractPatterns,
|
|
65
|
-
validateProtocolVersionMock,
|
|
66
|
-
getPropertyDefinitionByPath,
|
|
67
|
-
);
|
|
49
|
+
it('should pass validation if created from a fixture', () => {
|
|
50
|
+
const rawDataContract = dataContract.toObject();
|
|
51
|
+
const result = validateDataContract(rawDataContract);
|
|
52
|
+
expect(result.isValid()).to.be.true();
|
|
68
53
|
});
|
|
69
54
|
|
|
70
55
|
describe('protocolVersion', () => {
|
|
71
56
|
it('should be present', async () => {
|
|
72
|
-
rawDataContract =
|
|
73
|
-
documents: {
|
|
74
|
-
someDocument: {
|
|
75
|
-
type: 'object',
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
};
|
|
57
|
+
const rawDataContract = dataContract.toObject();
|
|
79
58
|
delete rawDataContract.protocolVersion;
|
|
80
59
|
|
|
81
|
-
const result =
|
|
60
|
+
const result = validateDataContract(rawDataContract);
|
|
82
61
|
|
|
83
|
-
expectJsonSchemaError(result);
|
|
62
|
+
await expectJsonSchemaError(result);
|
|
84
63
|
|
|
85
64
|
const [error] = result.getErrors();
|
|
86
65
|
|
|
@@ -90,11 +69,13 @@ describe('validateDataContractFactory', function main() {
|
|
|
90
69
|
});
|
|
91
70
|
|
|
92
71
|
it('should be an integer', async () => {
|
|
72
|
+
const rawDataContract = dataContract.toObject();
|
|
73
|
+
|
|
93
74
|
rawDataContract.protocolVersion = '1';
|
|
94
75
|
|
|
95
76
|
const result = await validateDataContract(rawDataContract);
|
|
96
77
|
|
|
97
|
-
expectJsonSchemaError(result);
|
|
78
|
+
await expectJsonSchemaError(result);
|
|
98
79
|
|
|
99
80
|
const [error] = result.getErrors();
|
|
100
81
|
|
|
@@ -102,37 +83,28 @@ describe('validateDataContractFactory', function main() {
|
|
|
102
83
|
expect(error.getKeyword()).to.equal('type');
|
|
103
84
|
});
|
|
104
85
|
|
|
105
|
-
it('should be
|
|
86
|
+
it('should be an unsigned integer', async () => {
|
|
87
|
+
const rawDataContract = dataContract.toObject();
|
|
106
88
|
rawDataContract.protocolVersion = -1;
|
|
107
89
|
|
|
108
|
-
const protocolVersionError = new SomeConsensusError('test');
|
|
109
|
-
const protocolVersionResult = new ValidationResult([
|
|
110
|
-
protocolVersionError,
|
|
111
|
-
]);
|
|
112
|
-
|
|
113
|
-
validateProtocolVersionMock.returns(protocolVersionResult);
|
|
114
|
-
|
|
115
90
|
const result = await validateDataContract(rawDataContract);
|
|
116
|
-
|
|
117
|
-
expectValidationError(result, SomeConsensusError);
|
|
91
|
+
await expectJsonSchemaError(result);
|
|
118
92
|
|
|
119
93
|
const [error] = result.getErrors();
|
|
120
94
|
|
|
121
|
-
expect(error).to.equal(
|
|
122
|
-
|
|
123
|
-
expect(validateProtocolVersionMock).to.be.calledOnceWith(
|
|
124
|
-
rawDataContract.protocolVersion,
|
|
125
|
-
);
|
|
95
|
+
expect(error.getInstancePath()).to.equal('/protocolVersion');
|
|
96
|
+
expect(error.getKeyword()).to.equal('minimum');
|
|
126
97
|
});
|
|
127
98
|
});
|
|
128
99
|
|
|
129
100
|
describe('$schema', () => {
|
|
130
101
|
it('should be present', async () => {
|
|
102
|
+
const rawDataContract = dataContract.toObject();
|
|
131
103
|
delete rawDataContract.$schema;
|
|
132
104
|
|
|
133
105
|
const result = await validateDataContract(rawDataContract);
|
|
134
106
|
|
|
135
|
-
expectJsonSchemaError(result);
|
|
107
|
+
await expectJsonSchemaError(result);
|
|
136
108
|
|
|
137
109
|
const [error] = result.getErrors();
|
|
138
110
|
|
|
@@ -142,24 +114,29 @@ describe('validateDataContractFactory', function main() {
|
|
|
142
114
|
});
|
|
143
115
|
|
|
144
116
|
it('should be a string', async () => {
|
|
117
|
+
const rawDataContract = dataContract.toObject();
|
|
145
118
|
rawDataContract.$schema = 1;
|
|
146
119
|
|
|
147
120
|
const result = await validateDataContract(rawDataContract);
|
|
148
121
|
|
|
149
|
-
expectJsonSchemaError(result);
|
|
122
|
+
await expectJsonSchemaError(result, 2);
|
|
150
123
|
|
|
151
|
-
const [
|
|
124
|
+
const [typeError, constError] = result.getErrors();
|
|
152
125
|
|
|
153
|
-
expect(
|
|
154
|
-
expect(
|
|
126
|
+
expect(typeError.getInstancePath()).to.equal('/$schema');
|
|
127
|
+
expect(typeError.getKeyword()).to.equal('type');
|
|
128
|
+
|
|
129
|
+
expect(constError.getInstancePath()).to.equal('/$schema');
|
|
130
|
+
expect(constError.getKeyword()).to.equal('const');
|
|
155
131
|
});
|
|
156
132
|
|
|
157
133
|
it('should be a particular url', async () => {
|
|
134
|
+
const rawDataContract = dataContract.toObject();
|
|
158
135
|
rawDataContract.$schema = 'wrong';
|
|
159
136
|
|
|
160
137
|
const result = await validateDataContract(rawDataContract);
|
|
161
138
|
|
|
162
|
-
expectJsonSchemaError(result);
|
|
139
|
+
await expectJsonSchemaError(result);
|
|
163
140
|
|
|
164
141
|
const [error] = result.getErrors();
|
|
165
142
|
|
|
@@ -170,11 +147,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
170
147
|
|
|
171
148
|
describe('ownerId', () => {
|
|
172
149
|
it('should be present', async () => {
|
|
150
|
+
const rawDataContract = dataContract.toObject();
|
|
173
151
|
delete rawDataContract.ownerId;
|
|
174
152
|
|
|
175
153
|
const result = await validateDataContract(rawDataContract);
|
|
176
154
|
|
|
177
|
-
expectJsonSchemaError(result);
|
|
155
|
+
await expectJsonSchemaError(result);
|
|
178
156
|
|
|
179
157
|
const [error] = result.getErrors();
|
|
180
158
|
|
|
@@ -184,26 +162,26 @@ describe('validateDataContractFactory', function main() {
|
|
|
184
162
|
});
|
|
185
163
|
|
|
186
164
|
it('should be a byte array', async () => {
|
|
165
|
+
const rawDataContract = dataContract.toObject();
|
|
187
166
|
rawDataContract.ownerId = new Array(32).fill('string');
|
|
188
167
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
expect(byteArrayError.getKeyword()).to.equal('byteArray');
|
|
168
|
+
// We decided to keep protocol error because of failed parse rather than doing hacks
|
|
169
|
+
// too keep it until validator will refuse it
|
|
170
|
+
try {
|
|
171
|
+
await validateDataContract(rawDataContract);
|
|
172
|
+
expect.fail('Should throw an error');
|
|
173
|
+
} catch (e) {
|
|
174
|
+
expect(e).to.have.string('invalid type: string');
|
|
175
|
+
}
|
|
199
176
|
});
|
|
200
177
|
|
|
201
178
|
it('should be no less than 32 bytes', async () => {
|
|
179
|
+
const rawDataContract = dataContract.toObject();
|
|
202
180
|
rawDataContract.ownerId = Buffer.alloc(31);
|
|
203
181
|
|
|
204
182
|
const result = await validateDataContract(rawDataContract);
|
|
205
183
|
|
|
206
|
-
expectJsonSchemaError(result);
|
|
184
|
+
await expectJsonSchemaError(result);
|
|
207
185
|
|
|
208
186
|
const [error] = result.getErrors();
|
|
209
187
|
|
|
@@ -212,11 +190,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
212
190
|
});
|
|
213
191
|
|
|
214
192
|
it('should be no longer than 32 bytes', async () => {
|
|
193
|
+
const rawDataContract = dataContract.toObject();
|
|
215
194
|
rawDataContract.ownerId = Buffer.alloc(33);
|
|
216
195
|
|
|
217
196
|
const result = await validateDataContract(rawDataContract);
|
|
218
197
|
|
|
219
|
-
expectJsonSchemaError(result);
|
|
198
|
+
await expectJsonSchemaError(result);
|
|
220
199
|
|
|
221
200
|
const [error] = result.getErrors();
|
|
222
201
|
|
|
@@ -227,11 +206,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
227
206
|
|
|
228
207
|
describe('$id', () => {
|
|
229
208
|
it('should be present', async () => {
|
|
209
|
+
const rawDataContract = dataContract.toObject();
|
|
230
210
|
delete rawDataContract.$id;
|
|
231
211
|
|
|
232
212
|
const result = await validateDataContract(rawDataContract);
|
|
233
213
|
|
|
234
|
-
expectJsonSchemaError(result);
|
|
214
|
+
await expectJsonSchemaError(result);
|
|
235
215
|
|
|
236
216
|
const [error] = result.getErrors();
|
|
237
217
|
|
|
@@ -241,26 +221,26 @@ describe('validateDataContractFactory', function main() {
|
|
|
241
221
|
});
|
|
242
222
|
|
|
243
223
|
it('should be a byte array', async () => {
|
|
224
|
+
const rawDataContract = dataContract.toObject();
|
|
244
225
|
rawDataContract.$id = new Array(32).fill('string');
|
|
245
226
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
expect(byteArrayError.getKeyword()).to.equal('byteArray');
|
|
227
|
+
// We decided to keep protocol error because of failed parse rather than doing hacks
|
|
228
|
+
// too keep it until validator will refuse it
|
|
229
|
+
try {
|
|
230
|
+
await validateDataContract(rawDataContract);
|
|
231
|
+
expect.fail('Should throw an error');
|
|
232
|
+
} catch (e) {
|
|
233
|
+
expect(e).to.have.string('invalid type: string');
|
|
234
|
+
}
|
|
256
235
|
});
|
|
257
236
|
|
|
258
237
|
it('should be no less than 32 bytes', async () => {
|
|
238
|
+
const rawDataContract = dataContract.toObject();
|
|
259
239
|
rawDataContract.$id = Buffer.alloc(31);
|
|
260
240
|
|
|
261
241
|
const result = await validateDataContract(rawDataContract);
|
|
262
242
|
|
|
263
|
-
expectJsonSchemaError(result);
|
|
243
|
+
await expectJsonSchemaError(result);
|
|
264
244
|
|
|
265
245
|
const [error] = result.getErrors();
|
|
266
246
|
|
|
@@ -269,11 +249,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
269
249
|
});
|
|
270
250
|
|
|
271
251
|
it('should be no longer than 32 bytes', async () => {
|
|
252
|
+
const rawDataContract = dataContract.toObject();
|
|
272
253
|
rawDataContract.$id = Buffer.alloc(33);
|
|
273
254
|
|
|
274
255
|
const result = await validateDataContract(rawDataContract);
|
|
275
256
|
|
|
276
|
-
expectJsonSchemaError(result);
|
|
257
|
+
await expectJsonSchemaError(result);
|
|
277
258
|
|
|
278
259
|
const [error] = result.getErrors();
|
|
279
260
|
|
|
@@ -284,6 +265,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
284
265
|
|
|
285
266
|
describe('$defs', () => {
|
|
286
267
|
it('may not be present', async () => {
|
|
268
|
+
const rawDataContract = dataContract.toObject();
|
|
287
269
|
delete rawDataContract.$defs;
|
|
288
270
|
delete rawDataContract.documents.prettyDocument;
|
|
289
271
|
|
|
@@ -294,11 +276,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
294
276
|
});
|
|
295
277
|
|
|
296
278
|
it('should be an object', async () => {
|
|
279
|
+
const rawDataContract = dataContract.toObject();
|
|
297
280
|
rawDataContract.$defs = 1;
|
|
298
281
|
|
|
299
282
|
const result = await validateDataContract(rawDataContract);
|
|
300
283
|
|
|
301
|
-
expectJsonSchemaError(result);
|
|
284
|
+
await expectJsonSchemaError(result);
|
|
302
285
|
|
|
303
286
|
const [error] = result.getErrors();
|
|
304
287
|
|
|
@@ -307,11 +290,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
307
290
|
});
|
|
308
291
|
|
|
309
292
|
it('should not be empty', async () => {
|
|
293
|
+
const rawDataContract = dataContract.toObject();
|
|
310
294
|
rawDataContract.$defs = {};
|
|
311
295
|
|
|
312
296
|
const result = await validateDataContract(rawDataContract);
|
|
313
297
|
|
|
314
|
-
expectJsonSchemaError(result);
|
|
298
|
+
await expectJsonSchemaError(result);
|
|
315
299
|
|
|
316
300
|
const [error] = result.getErrors();
|
|
317
301
|
|
|
@@ -320,24 +304,39 @@ describe('validateDataContractFactory', function main() {
|
|
|
320
304
|
});
|
|
321
305
|
|
|
322
306
|
it('should have no non-alphanumeric properties', async () => {
|
|
307
|
+
const rawDataContract = dataContract.toObject();
|
|
323
308
|
rawDataContract.$defs = {
|
|
324
309
|
$subSchema: {},
|
|
325
310
|
};
|
|
326
311
|
|
|
327
312
|
const result = await validateDataContract(rawDataContract);
|
|
328
313
|
|
|
329
|
-
expectJsonSchemaError(result
|
|
330
|
-
|
|
331
|
-
const [patternError, propertyNamesError] = result.getErrors();
|
|
314
|
+
await expectJsonSchemaError(result);
|
|
332
315
|
|
|
333
|
-
|
|
334
|
-
expect(patternError.getKeyword()).to.equal('pattern');
|
|
316
|
+
const [propertyNamesError] = result.getErrors();
|
|
335
317
|
|
|
336
318
|
expect(propertyNamesError.getInstancePath()).to.equal('/$defs');
|
|
337
319
|
expect(propertyNamesError.getKeyword()).to.equal('propertyNames');
|
|
338
320
|
});
|
|
339
321
|
|
|
322
|
+
it('should have valid properties\' values', async () => {
|
|
323
|
+
const rawDataContract = dataContract.toObject();
|
|
324
|
+
rawDataContract.$defs = {
|
|
325
|
+
yeet: '3a1u9a',
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
const result = await validateDataContract(rawDataContract);
|
|
329
|
+
|
|
330
|
+
await expectJsonSchemaError(result, 2);
|
|
331
|
+
|
|
332
|
+
const [valueTypeError] = result.getErrors();
|
|
333
|
+
|
|
334
|
+
expect(valueTypeError.getInstancePath()).to.equal('/$defs/yeet');
|
|
335
|
+
expect(valueTypeError.getKeyword()).to.equal('type');
|
|
336
|
+
});
|
|
337
|
+
|
|
340
338
|
it('should have no more than 100 properties', async () => {
|
|
339
|
+
const rawDataContract = dataContract.toObject();
|
|
341
340
|
rawDataContract.$defs = {};
|
|
342
341
|
|
|
343
342
|
Array(101).fill({ type: 'string' }).forEach((item, i) => {
|
|
@@ -346,7 +345,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
346
345
|
|
|
347
346
|
const result = await validateDataContract(rawDataContract);
|
|
348
347
|
|
|
349
|
-
expectJsonSchemaError(result);
|
|
348
|
+
await expectJsonSchemaError(result);
|
|
350
349
|
|
|
351
350
|
const [error] = result.getErrors();
|
|
352
351
|
|
|
@@ -361,20 +360,20 @@ describe('validateDataContractFactory', function main() {
|
|
|
361
360
|
|
|
362
361
|
await Promise.all(
|
|
363
362
|
validNames.map(async (name) => {
|
|
364
|
-
const
|
|
363
|
+
const rawDataContract = dataContract.toObject();
|
|
365
364
|
|
|
366
|
-
|
|
367
|
-
|
|
365
|
+
rawDataContract.$defs = {};
|
|
366
|
+
rawDataContract.$defs[name] = {
|
|
368
367
|
type: 'string',
|
|
369
368
|
};
|
|
370
369
|
|
|
371
|
-
|
|
370
|
+
rawDataContract.$defs[name] = {
|
|
372
371
|
type: 'string',
|
|
373
372
|
};
|
|
374
373
|
|
|
375
|
-
const result = await validateDataContract(
|
|
374
|
+
const result = await validateDataContract(rawDataContract);
|
|
376
375
|
|
|
377
|
-
expectJsonSchemaError(result, 0);
|
|
376
|
+
await expectJsonSchemaError(result, 0);
|
|
378
377
|
}),
|
|
379
378
|
);
|
|
380
379
|
});
|
|
@@ -384,21 +383,21 @@ describe('validateDataContractFactory', function main() {
|
|
|
384
383
|
|
|
385
384
|
await Promise.all(
|
|
386
385
|
invalidNames.map(async (name) => {
|
|
387
|
-
const
|
|
386
|
+
const rawDataContract = dataContract.toObject();
|
|
388
387
|
|
|
389
|
-
|
|
390
|
-
|
|
388
|
+
rawDataContract.$defs = {};
|
|
389
|
+
rawDataContract.$defs[name] = {
|
|
391
390
|
type: 'string',
|
|
392
391
|
};
|
|
393
392
|
|
|
394
|
-
const result = await validateDataContract(
|
|
393
|
+
const result = await validateDataContract(rawDataContract);
|
|
395
394
|
|
|
396
|
-
expectJsonSchemaError(result
|
|
395
|
+
await expectJsonSchemaError(result);
|
|
397
396
|
|
|
398
397
|
const [error] = result.getErrors();
|
|
399
398
|
|
|
400
399
|
expect(error.getInstancePath()).to.equal('/$defs');
|
|
401
|
-
expect(error.getKeyword()).to.equal('
|
|
400
|
+
expect(error.getKeyword()).to.equal('propertyNames');
|
|
402
401
|
}),
|
|
403
402
|
);
|
|
404
403
|
});
|
|
@@ -406,11 +405,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
406
405
|
|
|
407
406
|
describe('documents', () => {
|
|
408
407
|
it('should be present', async () => {
|
|
408
|
+
const rawDataContract = dataContract.toObject();
|
|
409
409
|
delete rawDataContract.documents;
|
|
410
410
|
|
|
411
411
|
const result = await validateDataContract(rawDataContract);
|
|
412
412
|
|
|
413
|
-
expectJsonSchemaError(result);
|
|
413
|
+
await expectJsonSchemaError(result);
|
|
414
414
|
|
|
415
415
|
const [error] = result.getErrors();
|
|
416
416
|
|
|
@@ -420,11 +420,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
420
420
|
});
|
|
421
421
|
|
|
422
422
|
it('should be an object', async () => {
|
|
423
|
+
const rawDataContract = dataContract.toObject();
|
|
423
424
|
rawDataContract.documents = 1;
|
|
424
425
|
|
|
425
426
|
const result = await validateDataContract(rawDataContract);
|
|
426
427
|
|
|
427
|
-
expectJsonSchemaError(result);
|
|
428
|
+
await expectJsonSchemaError(result);
|
|
428
429
|
|
|
429
430
|
const [error] = result.getErrors();
|
|
430
431
|
|
|
@@ -433,11 +434,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
433
434
|
});
|
|
434
435
|
|
|
435
436
|
it('should not be empty', async () => {
|
|
437
|
+
const rawDataContract = dataContract.toObject();
|
|
436
438
|
rawDataContract.documents = {};
|
|
437
439
|
|
|
438
440
|
const result = await validateDataContract(rawDataContract);
|
|
439
441
|
|
|
440
|
-
expectJsonSchemaError(result);
|
|
442
|
+
await expectJsonSchemaError(result);
|
|
441
443
|
|
|
442
444
|
const [error] = result.getErrors();
|
|
443
445
|
|
|
@@ -446,6 +448,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
446
448
|
});
|
|
447
449
|
|
|
448
450
|
it('should have valid property names (document types)', async () => {
|
|
451
|
+
const rawDataContract = dataContract.toObject();
|
|
449
452
|
const validNames = ['validName', 'valid_name', 'valid-name', 'abc', 'a123123bc', 'ab123c', 'ValidName', 'validName',
|
|
450
453
|
'abcdefghigklmnopqrstuvwxyz01234567890abcdefghigklmnopqrstuvwxyz', 'abc_gbf_gdb', 'abc-gbf-gdb'];
|
|
451
454
|
|
|
@@ -457,12 +460,13 @@ describe('validateDataContractFactory', function main() {
|
|
|
457
460
|
|
|
458
461
|
const result = await validateDataContract(clonedDataContract);
|
|
459
462
|
|
|
460
|
-
expectJsonSchemaError(result, 0);
|
|
463
|
+
await expectJsonSchemaError(result, 0);
|
|
461
464
|
}),
|
|
462
465
|
);
|
|
463
466
|
});
|
|
464
467
|
|
|
465
468
|
it('should return an invalid result if a property (document type) has invalid format', async () => {
|
|
469
|
+
const rawDataContract = dataContract.toObject();
|
|
466
470
|
const invalidNames = ['*(*&^', '$test', '.', '.a'];
|
|
467
471
|
|
|
468
472
|
await Promise.all(
|
|
@@ -473,17 +477,18 @@ describe('validateDataContractFactory', function main() {
|
|
|
473
477
|
|
|
474
478
|
const result = await validateDataContract(clonedDataContract);
|
|
475
479
|
|
|
476
|
-
expectJsonSchemaError(result
|
|
480
|
+
await expectJsonSchemaError(result);
|
|
477
481
|
|
|
478
482
|
const [error] = result.getErrors();
|
|
479
483
|
|
|
480
484
|
expect(error.getInstancePath()).to.equal('/documents');
|
|
481
|
-
expect(error.getKeyword()).to.equal('
|
|
485
|
+
expect(error.getKeyword()).to.equal('propertyNames');
|
|
482
486
|
}),
|
|
483
487
|
);
|
|
484
488
|
});
|
|
485
489
|
|
|
486
490
|
it('should have no more than 100 properties', async () => {
|
|
491
|
+
const rawDataContract = dataContract.toObject();
|
|
487
492
|
const niceDocumentDefinition = rawDataContract.documents.niceDocument;
|
|
488
493
|
|
|
489
494
|
rawDataContract.documents = {};
|
|
@@ -494,7 +499,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
494
499
|
|
|
495
500
|
const result = await validateDataContract(rawDataContract);
|
|
496
501
|
|
|
497
|
-
expectJsonSchemaError(result);
|
|
502
|
+
await expectJsonSchemaError(result);
|
|
498
503
|
|
|
499
504
|
const [error] = result.getErrors();
|
|
500
505
|
|
|
@@ -504,46 +509,50 @@ describe('validateDataContractFactory', function main() {
|
|
|
504
509
|
|
|
505
510
|
describe('Document schema', () => {
|
|
506
511
|
it('should not be empty', async () => {
|
|
512
|
+
const rawDataContract = dataContract.toObject();
|
|
507
513
|
rawDataContract.documents.niceDocument.properties = {};
|
|
508
514
|
|
|
509
515
|
const result = await validateDataContract(rawDataContract);
|
|
510
516
|
|
|
511
|
-
expectJsonSchemaError(result, 2);
|
|
517
|
+
await expectJsonSchemaError(result, 2);
|
|
512
518
|
|
|
513
519
|
const [error] = result.getErrors();
|
|
514
520
|
|
|
515
|
-
expect(error.
|
|
521
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/properties');
|
|
516
522
|
expect(error.getKeyword()).to.equal('minProperties');
|
|
517
523
|
});
|
|
518
524
|
|
|
519
525
|
it('should have type "object"', async () => {
|
|
526
|
+
const rawDataContract = dataContract.toObject();
|
|
520
527
|
rawDataContract.documents.niceDocument.type = 'string';
|
|
521
528
|
|
|
522
529
|
const result = await validateDataContract(rawDataContract);
|
|
523
530
|
|
|
524
|
-
expectJsonSchemaError(result);
|
|
531
|
+
await expectJsonSchemaError(result);
|
|
525
532
|
|
|
526
533
|
const [error] = result.getErrors();
|
|
527
534
|
|
|
528
|
-
expect(error.
|
|
535
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/type');
|
|
529
536
|
expect(error.getKeyword()).to.equal('const');
|
|
530
537
|
});
|
|
531
538
|
|
|
532
539
|
it('should have "properties"', async () => {
|
|
540
|
+
const rawDataContract = dataContract.toObject();
|
|
533
541
|
delete rawDataContract.documents.niceDocument.properties;
|
|
534
542
|
|
|
535
543
|
const result = await validateDataContract(rawDataContract);
|
|
536
544
|
|
|
537
|
-
expectJsonSchemaError(result);
|
|
545
|
+
await expectJsonSchemaError(result);
|
|
538
546
|
|
|
539
547
|
const [error] = result.getErrors();
|
|
540
548
|
|
|
541
|
-
expect(error.
|
|
549
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument');
|
|
542
550
|
expect(error.getKeyword()).to.equal('required');
|
|
543
551
|
expect(error.getParams().missingProperty).to.equal('properties');
|
|
544
552
|
});
|
|
545
553
|
|
|
546
554
|
it('should have nested "properties"', async () => {
|
|
555
|
+
const rawDataContract = dataContract.toObject();
|
|
547
556
|
rawDataContract.documents.niceDocument.properties.object = {
|
|
548
557
|
type: 'array',
|
|
549
558
|
prefixItems: [
|
|
@@ -562,16 +571,17 @@ describe('validateDataContractFactory', function main() {
|
|
|
562
571
|
|
|
563
572
|
const result = await validateDataContract(rawDataContract);
|
|
564
573
|
|
|
565
|
-
expectJsonSchemaError(result,
|
|
574
|
+
await expectJsonSchemaError(result, 8);
|
|
566
575
|
|
|
567
576
|
const [error] = result.getErrors();
|
|
568
577
|
|
|
569
|
-
expect(error.
|
|
578
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/properties/object/prefixItems/0/properties/something');
|
|
570
579
|
expect(error.getKeyword()).to.equal('required');
|
|
571
580
|
expect(error.getParams().missingProperty).to.equal('properties');
|
|
572
581
|
});
|
|
573
582
|
|
|
574
583
|
it('should have valid property names', async () => {
|
|
584
|
+
const rawDataContract = dataContract.toObject();
|
|
575
585
|
const validNames = ['validName', 'valid_name', 'valid-name', 'abc', 'a123bc', 'abc123', 'ValidName', 'validName',
|
|
576
586
|
'abcdefghigklmnopqrstuvwxyz01234567890abcdefghigklmnopqrstuvwxyz', 'abc_gbf_gdb', 'abc-gbf-gdb'];
|
|
577
587
|
|
|
@@ -585,12 +595,13 @@ describe('validateDataContractFactory', function main() {
|
|
|
585
595
|
|
|
586
596
|
const result = await validateDataContract(clonedDataContract);
|
|
587
597
|
|
|
588
|
-
expectJsonSchemaError(result, 0);
|
|
598
|
+
await expectJsonSchemaError(result, 0);
|
|
589
599
|
}),
|
|
590
600
|
);
|
|
591
601
|
});
|
|
592
602
|
|
|
593
603
|
it('should have valid nested property names', async () => {
|
|
604
|
+
const rawDataContract = dataContract.toObject();
|
|
594
605
|
const validNames = ['validName', 'valid_name', 'valid-name', 'abc', 'a123bc', 'abc123', 'ValidName', 'validName',
|
|
595
606
|
'abcdefghigklmnopqrstuvwxyz01234567890abcdefghigklmnopqrstuvwxyz', 'abc_gbf_gdb', 'abc-gbf-gdb'];
|
|
596
607
|
|
|
@@ -610,12 +621,13 @@ describe('validateDataContractFactory', function main() {
|
|
|
610
621
|
|
|
611
622
|
const result = await validateDataContract(clonedDataContract);
|
|
612
623
|
|
|
613
|
-
expectJsonSchemaError(result, 0);
|
|
624
|
+
await expectJsonSchemaError(result, 0);
|
|
614
625
|
}),
|
|
615
626
|
);
|
|
616
627
|
});
|
|
617
628
|
|
|
618
629
|
it('should return an invalid result if a property has invalid format', async () => {
|
|
630
|
+
const rawDataContract = dataContract.toObject();
|
|
619
631
|
const invalidNames = ['*(*&^', '$test', '.', '.a'];
|
|
620
632
|
|
|
621
633
|
await Promise.all(
|
|
@@ -626,19 +638,18 @@ describe('validateDataContractFactory', function main() {
|
|
|
626
638
|
|
|
627
639
|
const result = await validateDataContract(clonedDataContract);
|
|
628
640
|
|
|
629
|
-
expectJsonSchemaError(result,
|
|
641
|
+
await expectJsonSchemaError(result, 2);
|
|
630
642
|
|
|
631
|
-
const
|
|
643
|
+
const [error] = result.getErrors();
|
|
632
644
|
|
|
633
|
-
expect(
|
|
634
|
-
expect(
|
|
635
|
-
expect(errors[1].instancePath).to.equal('/documents/niceDocument/properties');
|
|
636
|
-
expect(errors[1].keyword).to.equal('propertyNames');
|
|
645
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/properties');
|
|
646
|
+
expect(error.getKeyword()).to.equal('propertyNames');
|
|
637
647
|
}),
|
|
638
648
|
);
|
|
639
649
|
});
|
|
640
650
|
|
|
641
651
|
it('should return an invalid result if a nested property has invalid format', async () => {
|
|
652
|
+
const rawDataContract = dataContract.toObject();
|
|
642
653
|
const invalidNames = ['*(*&^', '$test', '.', '.a'];
|
|
643
654
|
|
|
644
655
|
rawDataContract.documents.niceDocument.properties.something = {
|
|
@@ -654,50 +665,49 @@ describe('validateDataContractFactory', function main() {
|
|
|
654
665
|
|
|
655
666
|
const result = await validateDataContract(clonedDataContract);
|
|
656
667
|
|
|
657
|
-
expectJsonSchemaError(result, 4);
|
|
668
|
+
await expectJsonSchemaError(result, 4);
|
|
658
669
|
|
|
659
|
-
const errors = result.getErrors();
|
|
670
|
+
const [errors] = result.getErrors();
|
|
660
671
|
|
|
661
|
-
expect(errors
|
|
662
|
-
'/documents/niceDocument/properties/something/properties',
|
|
663
|
-
);
|
|
664
|
-
expect(errors[0].keyword).to.equal('pattern');
|
|
665
|
-
expect(errors[1].instancePath).to.equal(
|
|
672
|
+
expect(errors.getInstancePath()).to.equal(
|
|
666
673
|
'/documents/niceDocument/properties/something/properties',
|
|
667
674
|
);
|
|
668
|
-
expect(errors
|
|
675
|
+
expect(errors.getKeyword()).to.equal('propertyNames');
|
|
669
676
|
}),
|
|
670
677
|
);
|
|
671
678
|
});
|
|
672
679
|
|
|
673
680
|
it('should have "additionalProperties" defined', async () => {
|
|
681
|
+
const rawDataContract = dataContract.toObject();
|
|
674
682
|
delete rawDataContract.documents.niceDocument.additionalProperties;
|
|
675
683
|
|
|
676
684
|
const result = await validateDataContract(rawDataContract);
|
|
677
685
|
|
|
678
|
-
expectJsonSchemaError(result);
|
|
686
|
+
await expectJsonSchemaError(result);
|
|
679
687
|
|
|
680
688
|
const [error] = result.getErrors();
|
|
681
689
|
|
|
682
|
-
expect(error.
|
|
690
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument');
|
|
683
691
|
expect(error.getKeyword()).to.equal('required');
|
|
684
692
|
expect(error.getParams().missingProperty).to.equal('additionalProperties');
|
|
685
693
|
});
|
|
686
694
|
|
|
687
695
|
it('should have "additionalProperties" defined to false', async () => {
|
|
696
|
+
const rawDataContract = dataContract.toObject();
|
|
688
697
|
rawDataContract.documents.niceDocument.additionalProperties = true;
|
|
689
698
|
|
|
690
699
|
const result = await validateDataContract(rawDataContract);
|
|
691
700
|
|
|
692
|
-
expectJsonSchemaError(result);
|
|
701
|
+
await expectJsonSchemaError(result, 2);
|
|
693
702
|
|
|
694
703
|
const [error] = result.getErrors();
|
|
695
704
|
|
|
696
|
-
expect(error.
|
|
705
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/additionalProperties');
|
|
697
706
|
expect(error.getKeyword()).to.equal('const');
|
|
698
707
|
});
|
|
699
708
|
|
|
700
709
|
it('should have nested "additionalProperties" defined', async () => {
|
|
710
|
+
const rawDataContract = dataContract.toObject();
|
|
701
711
|
rawDataContract.documents.niceDocument.properties.object = {
|
|
702
712
|
type: 'array',
|
|
703
713
|
prefixItems: [
|
|
@@ -715,30 +725,32 @@ describe('validateDataContractFactory', function main() {
|
|
|
715
725
|
|
|
716
726
|
const result = await validateDataContract(rawDataContract);
|
|
717
727
|
|
|
718
|
-
expectJsonSchemaError(result, 2);
|
|
728
|
+
await expectJsonSchemaError(result, 2);
|
|
719
729
|
|
|
720
730
|
const [error] = result.getErrors();
|
|
721
731
|
|
|
722
|
-
expect(error.
|
|
732
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/properties/object/prefixItems/0');
|
|
723
733
|
expect(error.getKeyword()).to.equal('required');
|
|
724
734
|
expect(error.getParams().missingProperty).to.equal('additionalProperties');
|
|
725
735
|
});
|
|
726
736
|
|
|
727
737
|
it('should return invalid result if there are additional properties', async () => {
|
|
728
|
-
rawDataContract
|
|
738
|
+
const rawDataContract = dataContract.toObject();
|
|
739
|
+
rawDataContract.additionalProperty = {};
|
|
729
740
|
|
|
730
741
|
const result = await validateDataContract(rawDataContract);
|
|
731
742
|
|
|
732
|
-
expectJsonSchemaError(result);
|
|
743
|
+
await expectJsonSchemaError(result);
|
|
733
744
|
|
|
734
745
|
const [error] = result.getErrors();
|
|
735
746
|
|
|
736
|
-
expect(error.
|
|
747
|
+
expect(error.getInstancePath()).to.equal('');
|
|
737
748
|
expect(error.getKeyword()).to.equal('additionalProperties');
|
|
738
749
|
});
|
|
739
750
|
|
|
740
751
|
it('should have no more than 100 properties', async () => {
|
|
741
|
-
const
|
|
752
|
+
const rawDataContract = dataContract.toObject();
|
|
753
|
+
const propertyDefinition = {};
|
|
742
754
|
|
|
743
755
|
rawDataContract.documents.niceDocument.properties = {};
|
|
744
756
|
|
|
@@ -748,15 +760,16 @@ describe('validateDataContractFactory', function main() {
|
|
|
748
760
|
|
|
749
761
|
const result = await validateDataContract(rawDataContract);
|
|
750
762
|
|
|
751
|
-
expectJsonSchemaError(result,
|
|
763
|
+
await expectJsonSchemaError(result, 406);
|
|
752
764
|
|
|
753
|
-
const
|
|
765
|
+
const errors = result.getErrors();
|
|
754
766
|
|
|
755
|
-
expect(
|
|
756
|
-
expect(
|
|
767
|
+
expect(errors[405].getInstancePath()).to.equal('/documents/niceDocument/properties');
|
|
768
|
+
expect(errors[405].getKeyword()).to.equal('maxProperties');
|
|
757
769
|
});
|
|
758
770
|
|
|
759
771
|
it('should have defined items for arrays', async () => {
|
|
772
|
+
const rawDataContract = dataContract.toObject();
|
|
760
773
|
rawDataContract.documents.new = {
|
|
761
774
|
properties: {
|
|
762
775
|
something: {
|
|
@@ -768,16 +781,17 @@ describe('validateDataContractFactory', function main() {
|
|
|
768
781
|
|
|
769
782
|
const result = await validateDataContract(rawDataContract);
|
|
770
783
|
|
|
771
|
-
expectJsonSchemaError(result, 2);
|
|
784
|
+
await expectJsonSchemaError(result, 2);
|
|
772
785
|
|
|
773
786
|
const [error] = result.getErrors();
|
|
774
787
|
|
|
775
|
-
expect(error.
|
|
788
|
+
expect(error.getInstancePath()).to.equal('/documents/new/properties/something');
|
|
776
789
|
expect(error.getKeyword()).to.equal('required');
|
|
777
790
|
expect(error.getParams().missingProperty).to.equal('items');
|
|
778
791
|
});
|
|
779
792
|
|
|
780
793
|
it('should have sub schema in items for arrays', async () => {
|
|
794
|
+
const rawDataContract = dataContract.toObject();
|
|
781
795
|
rawDataContract.documents.new = {
|
|
782
796
|
properties: {
|
|
783
797
|
something: {
|
|
@@ -797,16 +811,17 @@ describe('validateDataContractFactory', function main() {
|
|
|
797
811
|
|
|
798
812
|
const result = await validateDataContract(rawDataContract);
|
|
799
813
|
|
|
800
|
-
expectJsonSchemaError(result,
|
|
814
|
+
await expectJsonSchemaError(result, 2);
|
|
801
815
|
|
|
802
816
|
const [error] = result.getErrors();
|
|
803
817
|
|
|
804
|
-
expect(error.
|
|
818
|
+
expect(error.getInstancePath()).to.equal('/documents/new/properties/something/items');
|
|
805
819
|
expect(error.getKeyword()).to.equal('type');
|
|
806
820
|
expect(error.getParams().type).to.equal('object');
|
|
807
821
|
});
|
|
808
822
|
|
|
809
823
|
it('should have items if prefixItems is used for arrays', async () => {
|
|
824
|
+
const rawDataContract = dataContract.toObject();
|
|
810
825
|
rawDataContract.documents.new = {
|
|
811
826
|
type: 'object',
|
|
812
827
|
properties: {
|
|
@@ -828,16 +843,17 @@ describe('validateDataContractFactory', function main() {
|
|
|
828
843
|
|
|
829
844
|
const result = await validateDataContract(rawDataContract);
|
|
830
845
|
|
|
831
|
-
expectJsonSchemaError(result,
|
|
846
|
+
await expectJsonSchemaError(result, 4);
|
|
832
847
|
|
|
833
848
|
const [error] = result.getErrors();
|
|
834
849
|
|
|
835
|
-
expect(error.
|
|
850
|
+
expect(error.getInstancePath()).to.equal('/documents/new/properties/something');
|
|
836
851
|
expect(error.getKeyword()).to.equal('required');
|
|
837
852
|
expect(error.getParams().missingProperty).to.equal('items');
|
|
838
853
|
});
|
|
839
854
|
|
|
840
855
|
it('should not have items disabled if prefixItems is used for arrays', async () => {
|
|
856
|
+
const rawDataContract = dataContract.toObject();
|
|
841
857
|
rawDataContract.documents.new = {
|
|
842
858
|
properties: {
|
|
843
859
|
something: {
|
|
@@ -858,44 +874,49 @@ describe('validateDataContractFactory', function main() {
|
|
|
858
874
|
|
|
859
875
|
const result = await validateDataContract(rawDataContract);
|
|
860
876
|
|
|
861
|
-
expectJsonSchemaError(result, 2);
|
|
877
|
+
await expectJsonSchemaError(result, 2);
|
|
862
878
|
|
|
863
879
|
const [error] = result.getErrors();
|
|
864
880
|
|
|
865
|
-
expect(error.
|
|
881
|
+
expect(error.getInstancePath()).to.equal('/documents/new/properties/something/items');
|
|
866
882
|
expect(error.getKeyword()).to.equal('const');
|
|
867
883
|
expect(error.getParams().allowedValue).to.equal(false);
|
|
868
884
|
});
|
|
869
885
|
|
|
870
|
-
|
|
886
|
+
// TODO: jsonschema-rs unevaluatedProperties
|
|
887
|
+
it.skip('should return invalid result if "default" keyword is used', async () => {
|
|
888
|
+
const rawDataContract = dataContract.toObject();
|
|
871
889
|
rawDataContract.documents.indexedDocument.properties.firstName.default = '1';
|
|
872
890
|
|
|
873
891
|
const result = await validateDataContract(rawDataContract);
|
|
874
892
|
|
|
875
|
-
expectJsonSchemaError(result, 2);
|
|
893
|
+
await expectJsonSchemaError(result, 2);
|
|
876
894
|
|
|
877
895
|
const [error] = result.getErrors();
|
|
878
896
|
|
|
879
|
-
expect(error.
|
|
897
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/properties/firstName');
|
|
880
898
|
expect(error.getKeyword()).to.equal('unevaluatedProperties');
|
|
881
899
|
});
|
|
882
900
|
|
|
883
|
-
it
|
|
901
|
+
it('should return invalid result if remote `$ref` is used', async () => {
|
|
902
|
+
const rawDataContract = dataContract.toObject();
|
|
884
903
|
rawDataContract.documents.indexedDocument = {
|
|
885
904
|
$ref: 'http://remote.com/schema#',
|
|
886
905
|
};
|
|
887
906
|
|
|
888
907
|
const result = await validateDataContract(rawDataContract);
|
|
889
908
|
|
|
890
|
-
expectJsonSchemaError(result);
|
|
909
|
+
await expectJsonSchemaError(result);
|
|
891
910
|
|
|
892
911
|
const [error] = result.getErrors();
|
|
893
912
|
|
|
894
|
-
expect(error.
|
|
913
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/$ref');
|
|
895
914
|
expect(error.getKeyword()).to.equal('pattern');
|
|
896
915
|
});
|
|
897
916
|
|
|
898
|
-
|
|
917
|
+
// TODO: jsonschema-rs unevaluatedProperties
|
|
918
|
+
it.skip('should not have `propertyNames`', async () => {
|
|
919
|
+
const rawDataContract = dataContract.toObject();
|
|
899
920
|
rawDataContract.documents.indexedDocument = {
|
|
900
921
|
type: 'object',
|
|
901
922
|
properties: {
|
|
@@ -911,16 +932,17 @@ describe('validateDataContractFactory', function main() {
|
|
|
911
932
|
|
|
912
933
|
const result = await validateDataContract(rawDataContract);
|
|
913
934
|
|
|
914
|
-
expectJsonSchemaError(result);
|
|
935
|
+
await expectJsonSchemaError(result);
|
|
915
936
|
|
|
916
937
|
const [error] = result.getErrors();
|
|
917
938
|
|
|
918
|
-
expect(error.
|
|
939
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument');
|
|
919
940
|
expect(error.getKeyword()).to.equal('unevaluatedProperties');
|
|
920
941
|
expect(error.getParams().unevaluatedProperty).to.equal('propertyNames');
|
|
921
942
|
});
|
|
922
943
|
|
|
923
944
|
it('should have `maxItems` if `uniqueItems` is used', async () => {
|
|
945
|
+
const rawDataContract = dataContract.toObject();
|
|
924
946
|
rawDataContract.documents.indexedDocument = {
|
|
925
947
|
type: 'object',
|
|
926
948
|
properties: {
|
|
@@ -934,16 +956,17 @@ describe('validateDataContractFactory', function main() {
|
|
|
934
956
|
|
|
935
957
|
const result = await validateDataContract(rawDataContract);
|
|
936
958
|
|
|
937
|
-
expectJsonSchemaError(result,
|
|
959
|
+
await expectJsonSchemaError(result, 4);
|
|
938
960
|
|
|
939
961
|
const [error] = result.getErrors();
|
|
940
962
|
|
|
941
|
-
expect(error.
|
|
963
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/properties/something');
|
|
942
964
|
expect(error.getKeyword()).to.equal('required');
|
|
943
|
-
expect(error.getParams().missingProperty).to.equal('
|
|
965
|
+
expect(error.getParams().missingProperty).to.equal('maxItems');
|
|
944
966
|
});
|
|
945
967
|
|
|
946
968
|
it('should have `maxItems` no bigger than 100000 if `uniqueItems` is used', async () => {
|
|
969
|
+
const rawDataContract = dataContract.toObject();
|
|
947
970
|
rawDataContract.documents.indexedDocument = {
|
|
948
971
|
type: 'object',
|
|
949
972
|
properties: {
|
|
@@ -967,15 +990,16 @@ describe('validateDataContractFactory', function main() {
|
|
|
967
990
|
|
|
968
991
|
const result = await validateDataContract(rawDataContract);
|
|
969
992
|
|
|
970
|
-
expectJsonSchemaError(result, 2);
|
|
993
|
+
await expectJsonSchemaError(result, 2);
|
|
971
994
|
|
|
972
995
|
const [error] = result.getErrors();
|
|
973
996
|
|
|
974
|
-
expect(error.
|
|
997
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/properties/something/maxItems');
|
|
975
998
|
expect(error.getKeyword()).to.equal('maximum');
|
|
976
999
|
});
|
|
977
1000
|
|
|
978
1001
|
it('should return invalid result if document JSON Schema is not valid', async () => {
|
|
1002
|
+
const rawDataContract = dataContract.toObject();
|
|
979
1003
|
rawDataContract.documents.indexedDocument = {
|
|
980
1004
|
type: 'object',
|
|
981
1005
|
properties: {
|
|
@@ -993,15 +1017,13 @@ describe('validateDataContractFactory', function main() {
|
|
|
993
1017
|
expectValidationError(result, JsonSchemaCompilationError);
|
|
994
1018
|
|
|
995
1019
|
const [error] = result.getErrors();
|
|
996
|
-
|
|
997
|
-
expect(error.getCode()).to.equal(
|
|
998
|
-
|
|
999
|
-
expect(error.message).to.be.a('string').and.satisfy((msg) => (
|
|
1000
|
-
msg.startsWith('unknown format "lalala" ignored in schema')
|
|
1001
|
-
));
|
|
1020
|
+
// TODO: should be a JsonSchemaCompilationerror instead of JsonSchemaError
|
|
1021
|
+
expect(error.getCode()).to.equal(1005);
|
|
1022
|
+
expect(error.getKeyword()).to.equal('format');
|
|
1002
1023
|
});
|
|
1003
1024
|
|
|
1004
1025
|
it('should have `maxLength` if `pattern` is used', async () => {
|
|
1026
|
+
const rawDataContract = dataContract.toObject();
|
|
1005
1027
|
rawDataContract.documents.indexedDocument = {
|
|
1006
1028
|
type: 'object',
|
|
1007
1029
|
properties: {
|
|
@@ -1015,16 +1037,17 @@ describe('validateDataContractFactory', function main() {
|
|
|
1015
1037
|
|
|
1016
1038
|
const result = await validateDataContract(rawDataContract);
|
|
1017
1039
|
|
|
1018
|
-
expectJsonSchemaError(result, 2);
|
|
1040
|
+
await expectJsonSchemaError(result, 2);
|
|
1019
1041
|
|
|
1020
1042
|
const [error] = result.getErrors();
|
|
1021
1043
|
|
|
1022
|
-
expect(error.
|
|
1044
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/properties/something');
|
|
1023
1045
|
expect(error.getKeyword()).to.equal('required');
|
|
1024
1046
|
expect(error.getParams().missingProperty).to.equal('maxLength');
|
|
1025
1047
|
});
|
|
1026
1048
|
|
|
1027
1049
|
it('should have `maxLength` no bigger than 50000 if `pattern` is used', async () => {
|
|
1050
|
+
const rawDataContract = dataContract.toObject();
|
|
1028
1051
|
rawDataContract.documents.indexedDocument = {
|
|
1029
1052
|
type: 'object',
|
|
1030
1053
|
properties: {
|
|
@@ -1039,15 +1062,16 @@ describe('validateDataContractFactory', function main() {
|
|
|
1039
1062
|
|
|
1040
1063
|
const result = await validateDataContract(rawDataContract);
|
|
1041
1064
|
|
|
1042
|
-
expectJsonSchemaError(result, 2);
|
|
1065
|
+
await expectJsonSchemaError(result, 2);
|
|
1043
1066
|
|
|
1044
1067
|
const [error] = result.getErrors();
|
|
1045
1068
|
|
|
1046
|
-
expect(error.
|
|
1069
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/properties/something/maxLength');
|
|
1047
1070
|
expect(error.getKeyword()).to.equal('maximum');
|
|
1048
1071
|
});
|
|
1049
1072
|
|
|
1050
1073
|
it('should have `maxLength` if `format` is used', async () => {
|
|
1074
|
+
const rawDataContract = dataContract.toObject();
|
|
1051
1075
|
rawDataContract.documents.indexedDocument = {
|
|
1052
1076
|
type: 'object',
|
|
1053
1077
|
properties: {
|
|
@@ -1061,16 +1085,17 @@ describe('validateDataContractFactory', function main() {
|
|
|
1061
1085
|
|
|
1062
1086
|
const result = await validateDataContract(rawDataContract);
|
|
1063
1087
|
|
|
1064
|
-
expectJsonSchemaError(result, 2);
|
|
1088
|
+
await expectJsonSchemaError(result, 2);
|
|
1065
1089
|
|
|
1066
1090
|
const [error] = result.getErrors();
|
|
1067
1091
|
|
|
1068
|
-
expect(error.
|
|
1092
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/properties/something');
|
|
1069
1093
|
expect(error.getKeyword()).to.equal('required');
|
|
1070
1094
|
expect(error.getParams().missingProperty).to.equal('maxLength');
|
|
1071
1095
|
});
|
|
1072
1096
|
|
|
1073
1097
|
it('should have `maxLength` no bigger than 50000 if `format` is used', async () => {
|
|
1098
|
+
const rawDataContract = dataContract.toObject();
|
|
1074
1099
|
rawDataContract.documents.indexedDocument = {
|
|
1075
1100
|
type: 'object',
|
|
1076
1101
|
properties: {
|
|
@@ -1085,15 +1110,16 @@ describe('validateDataContractFactory', function main() {
|
|
|
1085
1110
|
|
|
1086
1111
|
const result = await validateDataContract(rawDataContract);
|
|
1087
1112
|
|
|
1088
|
-
expectJsonSchemaError(result, 2);
|
|
1113
|
+
await expectJsonSchemaError(result, 2);
|
|
1089
1114
|
|
|
1090
1115
|
const [error] = result.getErrors();
|
|
1091
1116
|
|
|
1092
|
-
expect(error.
|
|
1117
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/properties/something/maxLength');
|
|
1093
1118
|
expect(error.getKeyword()).to.equal('maximum');
|
|
1094
1119
|
});
|
|
1095
1120
|
|
|
1096
1121
|
it('should not have incompatible patterns', async () => {
|
|
1122
|
+
const rawDataContract = dataContract.toObject();
|
|
1097
1123
|
rawDataContract.documents.indexedDocument = {
|
|
1098
1124
|
type: 'object',
|
|
1099
1125
|
properties: {
|
|
@@ -1115,52 +1141,55 @@ describe('validateDataContractFactory', function main() {
|
|
|
1115
1141
|
expect(error.getCode()).to.equal(1009);
|
|
1116
1142
|
expect(error.getPattern()).to.equal('^((?!-|_)[a-zA-Z0-9-_]{0,62}[a-zA-Z0-9])$');
|
|
1117
1143
|
expect(error.getPath()).to.equal('/documents/indexedDocument/properties/something');
|
|
1118
|
-
expect(error.getPatternError()).to.be.instanceOf(Error);
|
|
1119
1144
|
});
|
|
1120
1145
|
|
|
1121
1146
|
describe('byteArray', () => {
|
|
1122
1147
|
it('should be a boolean', async () => {
|
|
1148
|
+
const rawDataContract = dataContract.toObject();
|
|
1123
1149
|
rawDataContract.documents.withByteArrays.properties.byteArrayField.byteArray = 1;
|
|
1124
1150
|
|
|
1125
1151
|
const result = await validateDataContract(rawDataContract);
|
|
1126
1152
|
|
|
1127
|
-
expectJsonSchemaError(result,
|
|
1153
|
+
await expectJsonSchemaError(result, 4);
|
|
1128
1154
|
|
|
1129
1155
|
const [error] = result.getErrors();
|
|
1130
1156
|
|
|
1131
|
-
expect(error.
|
|
1157
|
+
expect(error.getInstancePath()).to.equal('/documents/withByteArrays/properties/byteArrayField/byteArray');
|
|
1132
1158
|
expect(error.getKeyword()).to.equal('type');
|
|
1133
1159
|
expect(error.getParams().type).to.equal('boolean');
|
|
1134
1160
|
});
|
|
1135
1161
|
|
|
1136
1162
|
it('should equal to true', async () => {
|
|
1163
|
+
const rawDataContract = dataContract.toObject();
|
|
1137
1164
|
rawDataContract.documents.withByteArrays.properties.byteArrayField.byteArray = false;
|
|
1138
1165
|
|
|
1139
1166
|
const result = await validateDataContract(rawDataContract);
|
|
1140
1167
|
|
|
1141
|
-
expectJsonSchemaError(result, 2);
|
|
1168
|
+
await expectJsonSchemaError(result, 2);
|
|
1142
1169
|
|
|
1143
1170
|
const [error] = result.getErrors();
|
|
1144
1171
|
|
|
1145
|
-
expect(error.
|
|
1172
|
+
expect(error.getInstancePath()).to.equal('/documents/withByteArrays/properties/byteArrayField/byteArray');
|
|
1146
1173
|
expect(error.getKeyword()).to.equal('const');
|
|
1147
1174
|
expect(error.getParams().allowedValue).to.equal(true);
|
|
1148
1175
|
});
|
|
1149
1176
|
|
|
1150
1177
|
it('should be used with type `array`', async () => {
|
|
1178
|
+
const rawDataContract = dataContract.toObject();
|
|
1151
1179
|
rawDataContract.documents.withByteArrays.properties.byteArrayField.type = 'string';
|
|
1152
1180
|
|
|
1153
1181
|
const result = await validateDataContract(rawDataContract);
|
|
1154
1182
|
|
|
1155
|
-
expectJsonSchemaError(result, 2);
|
|
1183
|
+
await expectJsonSchemaError(result, 2);
|
|
1156
1184
|
|
|
1157
1185
|
const [error] = result.getErrors();
|
|
1158
1186
|
|
|
1159
|
-
expect(error.
|
|
1187
|
+
expect(error.getInstancePath()).to.equal('/documents/withByteArrays/properties/byteArrayField/type');
|
|
1160
1188
|
expect(error.getKeyword()).to.equal('const');
|
|
1161
1189
|
});
|
|
1162
1190
|
|
|
1163
1191
|
it('should not be used with `items`', async () => {
|
|
1192
|
+
const rawDataContract = dataContract.toObject();
|
|
1164
1193
|
rawDataContract.documents.withByteArrays.properties.byteArrayField.items = {
|
|
1165
1194
|
type: 'string',
|
|
1166
1195
|
};
|
|
@@ -1172,48 +1201,50 @@ describe('validateDataContractFactory', function main() {
|
|
|
1172
1201
|
const [error] = result.getErrors();
|
|
1173
1202
|
|
|
1174
1203
|
expect(error.getCode()).to.equal(1004);
|
|
1175
|
-
expect(error.message).to.equal("'byteArray' should not be used with 'items'");
|
|
1176
1204
|
});
|
|
1177
1205
|
});
|
|
1178
1206
|
|
|
1179
1207
|
describe('contentMediaType', () => {
|
|
1180
1208
|
describe('application/x.dash.dpp.identifier', () => {
|
|
1181
1209
|
it('should be used with byte array only', async () => {
|
|
1210
|
+
const rawDataContract = dataContract.toObject();
|
|
1182
1211
|
delete rawDataContract.documents.withByteArrays.properties.identifierField.byteArray;
|
|
1183
1212
|
|
|
1184
1213
|
const result = await validateDataContract(rawDataContract);
|
|
1185
1214
|
|
|
1186
|
-
expectJsonSchemaError(result,
|
|
1215
|
+
await expectJsonSchemaError(result, 4);
|
|
1187
1216
|
|
|
1188
1217
|
const [error] = result.getErrors();
|
|
1189
1218
|
|
|
1190
|
-
expect(error.
|
|
1219
|
+
expect(error.getInstancePath()).to.equal('/documents/withByteArrays/properties/identifierField');
|
|
1191
1220
|
expect(error.getKeyword()).to.equal('required');
|
|
1192
1221
|
});
|
|
1193
1222
|
|
|
1194
1223
|
it('should be used with byte array not shorter than 32 bytes', async () => {
|
|
1224
|
+
const rawDataContract = dataContract.toObject();
|
|
1195
1225
|
rawDataContract.documents.withByteArrays.properties.identifierField.minItems = 31;
|
|
1196
1226
|
|
|
1197
1227
|
const result = await validateDataContract(rawDataContract);
|
|
1198
1228
|
|
|
1199
|
-
expectJsonSchemaError(result, 2);
|
|
1229
|
+
await expectJsonSchemaError(result, 2);
|
|
1200
1230
|
|
|
1201
1231
|
const [error] = result.getErrors();
|
|
1202
1232
|
|
|
1203
|
-
expect(error.
|
|
1233
|
+
expect(error.getInstancePath()).to.equal('/documents/withByteArrays/properties/identifierField/minItems');
|
|
1204
1234
|
expect(error.getKeyword()).to.equal('const');
|
|
1205
1235
|
});
|
|
1206
1236
|
|
|
1207
1237
|
it('should be used with byte array not longer than 32 bytes', async () => {
|
|
1238
|
+
const rawDataContract = dataContract.toObject();
|
|
1208
1239
|
rawDataContract.documents.withByteArrays.properties.identifierField.maxItems = 31;
|
|
1209
1240
|
|
|
1210
1241
|
const result = await validateDataContract(rawDataContract);
|
|
1211
1242
|
|
|
1212
|
-
expectJsonSchemaError(result, 2);
|
|
1243
|
+
await expectJsonSchemaError(result, 2);
|
|
1213
1244
|
|
|
1214
1245
|
const [error] = result.getErrors();
|
|
1215
1246
|
|
|
1216
|
-
expect(error.
|
|
1247
|
+
expect(error.getInstancePath()).to.equal('/documents/withByteArrays/properties/identifierField/maxItems');
|
|
1217
1248
|
expect(error.getKeyword()).to.equal('const');
|
|
1218
1249
|
});
|
|
1219
1250
|
});
|
|
@@ -1223,32 +1254,35 @@ describe('validateDataContractFactory', function main() {
|
|
|
1223
1254
|
|
|
1224
1255
|
describe('indices', () => {
|
|
1225
1256
|
it('should be an array', async () => {
|
|
1257
|
+
const rawDataContract = dataContract.toObject();
|
|
1226
1258
|
rawDataContract.documents.indexedDocument.indices = 'definitely not an array';
|
|
1227
1259
|
|
|
1228
1260
|
const result = await validateDataContract(rawDataContract);
|
|
1229
1261
|
|
|
1230
|
-
expectJsonSchemaError(result);
|
|
1262
|
+
await expectJsonSchemaError(result);
|
|
1231
1263
|
|
|
1232
1264
|
const [error] = result.getErrors();
|
|
1233
1265
|
|
|
1234
|
-
expect(error.
|
|
1266
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/indices');
|
|
1235
1267
|
expect(error.getKeyword()).to.equal('type');
|
|
1236
1268
|
});
|
|
1237
1269
|
|
|
1238
1270
|
it('should have at least one item', async () => {
|
|
1271
|
+
const rawDataContract = dataContract.toObject();
|
|
1239
1272
|
rawDataContract.documents.indexedDocument.indices = [];
|
|
1240
1273
|
|
|
1241
1274
|
const result = await validateDataContract(rawDataContract);
|
|
1242
1275
|
|
|
1243
|
-
expectJsonSchemaError(result);
|
|
1276
|
+
await expectJsonSchemaError(result);
|
|
1244
1277
|
|
|
1245
1278
|
const [error] = result.getErrors();
|
|
1246
1279
|
|
|
1247
|
-
expect(error.
|
|
1280
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/indices');
|
|
1248
1281
|
expect(error.getKeyword()).to.equal('minItems');
|
|
1249
1282
|
});
|
|
1250
1283
|
|
|
1251
1284
|
it('should return invalid result if there are duplicated indices', async () => {
|
|
1285
|
+
const rawDataContract = dataContract.toObject();
|
|
1252
1286
|
const indexDefinition = {
|
|
1253
1287
|
...rawDataContract.documents.indexedDocument.indices[0],
|
|
1254
1288
|
name: 'otherIndexName',
|
|
@@ -1263,11 +1297,12 @@ describe('validateDataContractFactory', function main() {
|
|
|
1263
1297
|
const [error] = result.getErrors();
|
|
1264
1298
|
|
|
1265
1299
|
expect(error.getCode()).to.equal(1008);
|
|
1266
|
-
expect(error.getIndexDefinition()).to.deep.equal(indexDefinition);
|
|
1300
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1267
1301
|
expect(error.getDocumentType()).to.deep.equal('indexedDocument');
|
|
1268
1302
|
});
|
|
1269
1303
|
|
|
1270
1304
|
it('should return invalid result if there are duplicated index names', async () => {
|
|
1305
|
+
const rawDataContract = dataContract.toObject();
|
|
1271
1306
|
const indexDefinition = {
|
|
1272
1307
|
...rawDataContract.documents.indexedDocument.indices[0],
|
|
1273
1308
|
};
|
|
@@ -1287,66 +1322,71 @@ describe('validateDataContractFactory', function main() {
|
|
|
1287
1322
|
|
|
1288
1323
|
describe('index', () => {
|
|
1289
1324
|
it('should be an object', async () => {
|
|
1325
|
+
const rawDataContract = dataContract.toObject();
|
|
1290
1326
|
rawDataContract.documents.indexedDocument.indices = ['something else'];
|
|
1291
1327
|
|
|
1292
1328
|
const result = await validateDataContract(rawDataContract);
|
|
1293
1329
|
|
|
1294
|
-
expectJsonSchemaError(result);
|
|
1330
|
+
await expectJsonSchemaError(result);
|
|
1295
1331
|
|
|
1296
1332
|
const [error] = result.getErrors();
|
|
1297
1333
|
|
|
1298
|
-
expect(error.
|
|
1334
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/indices/0');
|
|
1299
1335
|
expect(error.getKeyword()).to.equal('type');
|
|
1300
1336
|
});
|
|
1301
1337
|
|
|
1302
1338
|
it('should have properties definition', async () => {
|
|
1339
|
+
const rawDataContract = dataContract.toObject();
|
|
1303
1340
|
rawDataContract.documents.indexedDocument.indices = [{}];
|
|
1304
1341
|
|
|
1305
1342
|
const result = await validateDataContract(rawDataContract);
|
|
1306
1343
|
|
|
1307
|
-
expectJsonSchemaError(result);
|
|
1344
|
+
await expectJsonSchemaError(result, 2);
|
|
1308
1345
|
|
|
1309
1346
|
const [error] = result.getErrors();
|
|
1310
1347
|
|
|
1311
|
-
expect(error.
|
|
1348
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/indices/0');
|
|
1312
1349
|
expect(error.getParams().missingProperty).to.equal('properties');
|
|
1313
1350
|
expect(error.getKeyword()).to.equal('required');
|
|
1314
1351
|
});
|
|
1315
1352
|
|
|
1316
1353
|
describe('properties definition', () => {
|
|
1317
1354
|
it('should be an array', async () => {
|
|
1355
|
+
const rawDataContract = dataContract.toObject();
|
|
1318
1356
|
rawDataContract.documents.indexedDocument.indices[0]
|
|
1319
1357
|
.properties = 'something else';
|
|
1320
1358
|
|
|
1321
1359
|
const result = await validateDataContract(rawDataContract);
|
|
1322
1360
|
|
|
1323
|
-
expectJsonSchemaError(result);
|
|
1361
|
+
await expectJsonSchemaError(result);
|
|
1324
1362
|
|
|
1325
1363
|
const [error] = result.getErrors();
|
|
1326
1364
|
|
|
1327
|
-
expect(error.
|
|
1365
|
+
expect(error.getInstancePath()).to.equal(
|
|
1328
1366
|
'/documents/indexedDocument/indices/0/properties',
|
|
1329
1367
|
);
|
|
1330
1368
|
expect(error.getKeyword()).to.equal('type');
|
|
1331
1369
|
});
|
|
1332
1370
|
|
|
1333
1371
|
it('should have at least one property defined', async () => {
|
|
1372
|
+
const rawDataContract = dataContract.toObject();
|
|
1334
1373
|
rawDataContract.documents.indexedDocument.indices[0]
|
|
1335
1374
|
.properties = [];
|
|
1336
1375
|
|
|
1337
1376
|
const result = await validateDataContract(rawDataContract);
|
|
1338
1377
|
|
|
1339
|
-
expectJsonSchemaError(result);
|
|
1378
|
+
await expectJsonSchemaError(result);
|
|
1340
1379
|
|
|
1341
1380
|
const [error] = result.getErrors();
|
|
1342
1381
|
|
|
1343
|
-
expect(error.
|
|
1382
|
+
expect(error.getInstancePath()).to.equal(
|
|
1344
1383
|
'/documents/indexedDocument/indices/0/properties',
|
|
1345
1384
|
);
|
|
1346
1385
|
expect(error.getKeyword()).to.equal('minItems');
|
|
1347
1386
|
});
|
|
1348
1387
|
|
|
1349
1388
|
it('should have no more than 10 property $defs', async () => {
|
|
1389
|
+
const rawDataContract = dataContract.toObject();
|
|
1350
1390
|
for (let i = 0; i < 10; i++) {
|
|
1351
1391
|
rawDataContract.documents.indexedDocument.indices[0]
|
|
1352
1392
|
.properties.push({ [`field${i}`]: 'asc' });
|
|
@@ -1354,11 +1394,11 @@ describe('validateDataContractFactory', function main() {
|
|
|
1354
1394
|
|
|
1355
1395
|
const result = await validateDataContract(rawDataContract);
|
|
1356
1396
|
|
|
1357
|
-
expectJsonSchemaError(result);
|
|
1397
|
+
await expectJsonSchemaError(result);
|
|
1358
1398
|
|
|
1359
1399
|
const [error] = result.getErrors();
|
|
1360
1400
|
|
|
1361
|
-
expect(error.
|
|
1401
|
+
expect(error.getInstancePath()).to.equal(
|
|
1362
1402
|
'/documents/indexedDocument/indices/0/properties',
|
|
1363
1403
|
);
|
|
1364
1404
|
expect(error.getKeyword()).to.equal('maxItems');
|
|
@@ -1366,38 +1406,41 @@ describe('validateDataContractFactory', function main() {
|
|
|
1366
1406
|
|
|
1367
1407
|
describe('property definition', () => {
|
|
1368
1408
|
it('should be an object', async () => {
|
|
1409
|
+
const rawDataContract = dataContract.toObject();
|
|
1369
1410
|
rawDataContract.documents.indexedDocument.indices[0]
|
|
1370
1411
|
.properties[0] = 'something else';
|
|
1371
1412
|
|
|
1372
1413
|
const result = await validateDataContract(rawDataContract);
|
|
1373
1414
|
|
|
1374
|
-
expectJsonSchemaError(result);
|
|
1415
|
+
await expectJsonSchemaError(result);
|
|
1375
1416
|
|
|
1376
1417
|
const [error] = result.getErrors();
|
|
1377
1418
|
|
|
1378
|
-
expect(error.
|
|
1419
|
+
expect(error.getInstancePath()).to.equal(
|
|
1379
1420
|
'/documents/indexedDocument/indices/0/properties/0',
|
|
1380
1421
|
);
|
|
1381
1422
|
expect(error.getKeyword()).to.equal('type');
|
|
1382
1423
|
});
|
|
1383
1424
|
|
|
1384
1425
|
it('should have at least one property', async () => {
|
|
1426
|
+
const rawDataContract = dataContract.toObject();
|
|
1385
1427
|
rawDataContract.documents.indexedDocument.indices[0]
|
|
1386
1428
|
.properties = [];
|
|
1387
1429
|
|
|
1388
1430
|
const result = await validateDataContract(rawDataContract);
|
|
1389
1431
|
|
|
1390
|
-
expectJsonSchemaError(result);
|
|
1432
|
+
await expectJsonSchemaError(result);
|
|
1391
1433
|
|
|
1392
1434
|
const [error] = result.getErrors();
|
|
1393
1435
|
|
|
1394
|
-
expect(error.
|
|
1436
|
+
expect(error.getInstancePath()).to.equal(
|
|
1395
1437
|
'/documents/indexedDocument/indices/0/properties',
|
|
1396
1438
|
);
|
|
1397
1439
|
expect(error.getKeyword()).to.equal('minItems');
|
|
1398
1440
|
});
|
|
1399
1441
|
|
|
1400
1442
|
it('should have no more than one property', async () => {
|
|
1443
|
+
const rawDataContract = dataContract.toObject();
|
|
1401
1444
|
const property = rawDataContract.documents.indexedDocument.indices[0]
|
|
1402
1445
|
.properties[0];
|
|
1403
1446
|
|
|
@@ -1405,27 +1448,28 @@ describe('validateDataContractFactory', function main() {
|
|
|
1405
1448
|
|
|
1406
1449
|
const result = await validateDataContract(rawDataContract);
|
|
1407
1450
|
|
|
1408
|
-
expectJsonSchemaError(result);
|
|
1451
|
+
await expectJsonSchemaError(result, 2);
|
|
1409
1452
|
|
|
1410
|
-
const
|
|
1453
|
+
const error = result.getErrors()[1];
|
|
1411
1454
|
|
|
1412
|
-
expect(error.
|
|
1455
|
+
expect(error.getInstancePath()).to.equal(
|
|
1413
1456
|
'/documents/indexedDocument/indices/0/properties/0',
|
|
1414
1457
|
);
|
|
1415
1458
|
expect(error.getKeyword()).to.equal('maxProperties');
|
|
1416
1459
|
});
|
|
1417
1460
|
|
|
1418
1461
|
it('should have property values only "asc" or "desc"', async () => {
|
|
1462
|
+
const rawDataContract = dataContract.toObject();
|
|
1419
1463
|
rawDataContract.documents.indexedDocument.indices[0]
|
|
1420
1464
|
.properties[0].$ownerId = 'wrong';
|
|
1421
1465
|
|
|
1422
1466
|
const result = await validateDataContract(rawDataContract);
|
|
1423
1467
|
|
|
1424
|
-
expectJsonSchemaError(result);
|
|
1468
|
+
await expectJsonSchemaError(result);
|
|
1425
1469
|
|
|
1426
1470
|
const [error] = result.getErrors();
|
|
1427
1471
|
|
|
1428
|
-
expect(error.
|
|
1472
|
+
expect(error.getInstancePath()).to.equal(
|
|
1429
1473
|
'/documents/indexedDocument/indices/0/properties/0/$ownerId',
|
|
1430
1474
|
);
|
|
1431
1475
|
expect(error.getKeyword()).to.equal('enum');
|
|
@@ -1435,6 +1479,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
1435
1479
|
|
|
1436
1480
|
describe('property names', () => {
|
|
1437
1481
|
it('should have valid property names (indices)', async () => {
|
|
1482
|
+
const rawDataContract = dataContract.toObject();
|
|
1438
1483
|
const validNames = ['validName', 'valid_name', 'valid-name', 'abc', 'a123123bc', 'ab123c', 'ValidName', 'validName',
|
|
1439
1484
|
'abcdefghigklmnopqrstuvwxyz01234567890abcdefghigklmnopqrstuvwxyz', 'abc_gbf_gdb', 'abc-gbf-gdb'];
|
|
1440
1485
|
|
|
@@ -1448,12 +1493,13 @@ describe('validateDataContractFactory', function main() {
|
|
|
1448
1493
|
|
|
1449
1494
|
const result = await validateDataContract(clonedDataContract);
|
|
1450
1495
|
|
|
1451
|
-
expectJsonSchemaError(result, 0);
|
|
1496
|
+
await expectJsonSchemaError(result, 0);
|
|
1452
1497
|
}),
|
|
1453
1498
|
);
|
|
1454
1499
|
});
|
|
1455
1500
|
|
|
1456
1501
|
it('should return an invalid result if a property (indices) has invalid format', async () => {
|
|
1502
|
+
const rawDataContract = dataContract.toObject();
|
|
1457
1503
|
const invalidNames = ['a.', '.a'];
|
|
1458
1504
|
|
|
1459
1505
|
rawDataContract.documents.indexedDocument = {
|
|
@@ -1495,19 +1541,21 @@ describe('validateDataContractFactory', function main() {
|
|
|
1495
1541
|
});
|
|
1496
1542
|
|
|
1497
1543
|
it('should have "unique" flag to be of a boolean type', async () => {
|
|
1544
|
+
const rawDataContract = dataContract.toObject();
|
|
1498
1545
|
rawDataContract.documents.indexedDocument.indices[0].unique = 12;
|
|
1499
1546
|
|
|
1500
1547
|
const result = await validateDataContract(rawDataContract);
|
|
1501
1548
|
|
|
1502
|
-
expectJsonSchemaError(result);
|
|
1549
|
+
await expectJsonSchemaError(result);
|
|
1503
1550
|
|
|
1504
1551
|
const [error] = result.getErrors();
|
|
1505
1552
|
|
|
1506
|
-
expect(error.
|
|
1553
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/indices/0/unique');
|
|
1507
1554
|
expect(error.getKeyword()).to.equal('type');
|
|
1508
1555
|
});
|
|
1509
1556
|
|
|
1510
1557
|
it('should have no more than 10 indices', async () => {
|
|
1558
|
+
const rawDataContract = dataContract.toObject();
|
|
1511
1559
|
for (let i = 0; i < 10; i++) {
|
|
1512
1560
|
const propertyName = `field${i}`;
|
|
1513
1561
|
|
|
@@ -1520,17 +1568,18 @@ describe('validateDataContractFactory', function main() {
|
|
|
1520
1568
|
|
|
1521
1569
|
const result = await validateDataContract(rawDataContract);
|
|
1522
1570
|
|
|
1523
|
-
expectJsonSchemaError(result);
|
|
1571
|
+
await expectJsonSchemaError(result, 11);
|
|
1524
1572
|
|
|
1525
|
-
const
|
|
1573
|
+
const error = result.getErrors()[10];
|
|
1526
1574
|
|
|
1527
|
-
expect(error.
|
|
1575
|
+
expect(error.getInstancePath()).to.equal(
|
|
1528
1576
|
'/documents/indexedDocument/indices',
|
|
1529
1577
|
);
|
|
1530
1578
|
expect(error.getKeyword()).to.equal('maxItems');
|
|
1531
1579
|
});
|
|
1532
1580
|
|
|
1533
1581
|
it('should have no more than 3 unique indices', async () => {
|
|
1582
|
+
const rawDataContract = dataContract.toObject();
|
|
1534
1583
|
for (let i = 0; i < 4; i++) {
|
|
1535
1584
|
const propertyName = `field${i}`;
|
|
1536
1585
|
|
|
@@ -1557,6 +1606,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
1557
1606
|
});
|
|
1558
1607
|
|
|
1559
1608
|
it('should return invalid result if $id is specified as an indexed property', async () => {
|
|
1609
|
+
const rawDataContract = dataContract.toObject();
|
|
1560
1610
|
const indexDefinition = {
|
|
1561
1611
|
name: 'index_1',
|
|
1562
1612
|
properties: [
|
|
@@ -1578,10 +1628,11 @@ describe('validateDataContractFactory', function main() {
|
|
|
1578
1628
|
expect(error.getCode()).to.equal(1015);
|
|
1579
1629
|
expect(error.getPropertyName()).to.equal('$id');
|
|
1580
1630
|
expect(error.getDocumentType()).to.deep.equal('indexedDocument');
|
|
1581
|
-
expect(error.getIndexDefinition()).to.deep.equal(indexDefinition);
|
|
1631
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1582
1632
|
});
|
|
1583
1633
|
|
|
1584
1634
|
it('should return invalid result if indices has undefined property', async () => {
|
|
1635
|
+
const rawDataContract = dataContract.toObject();
|
|
1585
1636
|
const indexDefinition = rawDataContract.documents.indexedDocument.indices[0];
|
|
1586
1637
|
|
|
1587
1638
|
indexDefinition.properties.push({
|
|
@@ -1597,10 +1648,11 @@ describe('validateDataContractFactory', function main() {
|
|
|
1597
1648
|
expect(error.getCode()).to.equal(1016);
|
|
1598
1649
|
expect(error.getPropertyName()).to.equal('missingProperty');
|
|
1599
1650
|
expect(error.getDocumentType()).to.deep.equal('indexedDocument');
|
|
1600
|
-
expect(error.getIndexDefinition()).to.deep.equal(indexDefinition);
|
|
1651
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1601
1652
|
});
|
|
1602
1653
|
|
|
1603
1654
|
it('should return invalid result if index property is object', async () => {
|
|
1655
|
+
const rawDataContract = dataContract.toObject();
|
|
1604
1656
|
const indexedDocumentDefinition = rawDataContract.documents.indexedDocument;
|
|
1605
1657
|
|
|
1606
1658
|
indexedDocumentDefinition.properties.objectProperty = {
|
|
@@ -1631,10 +1683,11 @@ describe('validateDataContractFactory', function main() {
|
|
|
1631
1683
|
expect(error.getPropertyName()).to.equal('objectProperty');
|
|
1632
1684
|
expect(error.getPropertyType()).to.equal('object');
|
|
1633
1685
|
expect(error.getDocumentType()).to.deep.equal('indexedDocument');
|
|
1634
|
-
expect(error.getIndexDefinition()).to.deep.equal(indexDefinition);
|
|
1686
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1635
1687
|
});
|
|
1636
1688
|
|
|
1637
1689
|
it('should return invalid result if index property is an array', async () => {
|
|
1690
|
+
const rawDataContract = dataContract.toObject();
|
|
1638
1691
|
rawDataContract.documents.indexedArray = {
|
|
1639
1692
|
type: 'object',
|
|
1640
1693
|
indices: [
|
|
@@ -1674,167 +1727,177 @@ describe('validateDataContractFactory', function main() {
|
|
|
1674
1727
|
expect(error.getPropertyName()).to.equal('mentions');
|
|
1675
1728
|
expect(error.getPropertyType()).to.equal('array');
|
|
1676
1729
|
expect(error.getDocumentType()).to.deep.equal('indexedArray');
|
|
1677
|
-
expect(error.getIndexDefinition()).to.deep.equal(indexDefinition);
|
|
1730
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1731
|
+
});
|
|
1732
|
+
|
|
1733
|
+
it('should return invalid result if index property is array of objects', async () => {
|
|
1734
|
+
const rawDataContract = dataContract.toObject();
|
|
1735
|
+
const indexedDocumentDefinition = rawDataContract.documents.indexedDocument;
|
|
1736
|
+
|
|
1737
|
+
indexedDocumentDefinition.properties.arrayProperty = {
|
|
1738
|
+
type: 'array',
|
|
1739
|
+
items: {
|
|
1740
|
+
type: 'object',
|
|
1741
|
+
properties: {
|
|
1742
|
+
something: {
|
|
1743
|
+
type: 'string',
|
|
1744
|
+
},
|
|
1745
|
+
},
|
|
1746
|
+
additionalProperties: false,
|
|
1747
|
+
},
|
|
1748
|
+
};
|
|
1749
|
+
|
|
1750
|
+
indexedDocumentDefinition.required.push('arrayProperty');
|
|
1751
|
+
|
|
1752
|
+
const indexDefinition = indexedDocumentDefinition.indices[0];
|
|
1753
|
+
|
|
1754
|
+
indexDefinition.properties.push({
|
|
1755
|
+
arrayProperty: 'asc',
|
|
1756
|
+
});
|
|
1757
|
+
|
|
1758
|
+
const result = await validateDataContract(rawDataContract);
|
|
1759
|
+
|
|
1760
|
+
expectValidationError(result, InvalidIndexPropertyTypeError);
|
|
1761
|
+
|
|
1762
|
+
const [error] = result.getErrors();
|
|
1763
|
+
|
|
1764
|
+
expect(error.getCode()).to.equal(1013);
|
|
1765
|
+
expect(error.getPropertyName()).to.equal('arrayProperty');
|
|
1766
|
+
expect(error.getPropertyType()).to.equal('array');
|
|
1767
|
+
expect(error.getDocumentType()).to.deep.equal('indexedDocument');
|
|
1768
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1678
1769
|
});
|
|
1679
1770
|
|
|
1680
|
-
//
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
//
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
//
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
// type: 'array',
|
|
1808
|
-
// items: {
|
|
1809
|
-
// type: 'array',
|
|
1810
|
-
// items: {
|
|
1811
|
-
// type: 'string',
|
|
1812
|
-
// },
|
|
1813
|
-
// },
|
|
1814
|
-
// };
|
|
1815
|
-
//
|
|
1816
|
-
// indexedDocumentDefinition.required.push('arrayProperty');
|
|
1817
|
-
//
|
|
1818
|
-
// const indexDefinition = indexedDocumentDefinition.indices[0];
|
|
1819
|
-
//
|
|
1820
|
-
// indexDefinition.properties.push({
|
|
1821
|
-
// arrayProperty: 'asc',
|
|
1822
|
-
// });
|
|
1823
|
-
//
|
|
1824
|
-
// const result = await validateDataContract(rawDataContract);
|
|
1825
|
-
//
|
|
1826
|
-
// expectValidationError(result, InvalidIndexPropertyTypeError);
|
|
1827
|
-
//
|
|
1828
|
-
// const [error] = result.getErrors();
|
|
1829
|
-
//
|
|
1830
|
-
// expect(error.getCode()).to.equal(1013);
|
|
1831
|
-
// expect(error.getPropertyName()).to.equal('arrayProperty');
|
|
1832
|
-
// expect(error.getPropertyType()).to.equal('array');
|
|
1833
|
-
// expect(error.getDocumentType()).to.deep.equal('indexedDocument');
|
|
1834
|
-
// expect(error.getIndexDefinition()).to.deep.equal(indexDefinition);
|
|
1835
|
-
// });
|
|
1771
|
+
// TODO: support indexed arrays
|
|
1772
|
+
it.skip('should return invalid result if index property is an array of different types',
|
|
1773
|
+
async () => {
|
|
1774
|
+
const rawDataContract = dataContract.toObject();
|
|
1775
|
+
|
|
1776
|
+
const indexedDocumentDefinition = rawDataContract.documents.indexedArray;
|
|
1777
|
+
|
|
1778
|
+
const indexDefinition = indexedDocumentDefinition.indices[0];
|
|
1779
|
+
|
|
1780
|
+
rawDataContract.documents.indexedArray.properties.mentions.prefixItems = [
|
|
1781
|
+
{
|
|
1782
|
+
type: 'string',
|
|
1783
|
+
},
|
|
1784
|
+
{
|
|
1785
|
+
type: 'number',
|
|
1786
|
+
},
|
|
1787
|
+
];
|
|
1788
|
+
|
|
1789
|
+
rawDataContract.documents.indexedArray.properties.mentions.minItems = 2;
|
|
1790
|
+
|
|
1791
|
+
const result = await validateDataContract(rawDataContract);
|
|
1792
|
+
expectValidationError(result, InvalidIndexPropertyTypeError);
|
|
1793
|
+
|
|
1794
|
+
const error = result.getFirstError();
|
|
1795
|
+
|
|
1796
|
+
expect(error.getCode()).to.equal(1013);
|
|
1797
|
+
expect(error.getPropertyName()).to.equal('mentions');
|
|
1798
|
+
expect(error.getPropertyType()).to.equal('array');
|
|
1799
|
+
expect(error.getDocumentType()).to.deep.equal('indexedArray');
|
|
1800
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1801
|
+
});
|
|
1802
|
+
|
|
1803
|
+
// TODO: support indexed arrays
|
|
1804
|
+
it.skip('should return invalid result if index property contained prefixItems array of arrays', async () => {
|
|
1805
|
+
const rawDataContract = dataContract.toObject();
|
|
1806
|
+
|
|
1807
|
+
const indexedDocumentDefinition = rawDataContract.documents.indexedArray;
|
|
1808
|
+
|
|
1809
|
+
const indexDefinition = indexedDocumentDefinition.indices[0];
|
|
1810
|
+
|
|
1811
|
+
rawDataContract.documents.indexedArray.properties.mentions.prefixItems = [
|
|
1812
|
+
{
|
|
1813
|
+
type: 'array',
|
|
1814
|
+
items: {
|
|
1815
|
+
type: 'string',
|
|
1816
|
+
},
|
|
1817
|
+
},
|
|
1818
|
+
];
|
|
1819
|
+
|
|
1820
|
+
const result = await validateDataContract(rawDataContract);
|
|
1821
|
+
expectValidationError(result, InvalidIndexPropertyTypeError);
|
|
1822
|
+
|
|
1823
|
+
const error = result.getFirstError();
|
|
1824
|
+
|
|
1825
|
+
expect(error.getCode()).to.equal(1013);
|
|
1826
|
+
expect(error.getPropertyName()).to.equal('mentions');
|
|
1827
|
+
expect(error.getPropertyType()).to.equal('array');
|
|
1828
|
+
expect(error.getDocumentType()).to.deep.equal('indexedArray');
|
|
1829
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1830
|
+
});
|
|
1831
|
+
|
|
1832
|
+
// TODO: support indexed arrays
|
|
1833
|
+
it.skip('should return invalid result if index property contained prefixItems array of objects', async () => {
|
|
1834
|
+
const rawDataContract = dataContract.toObject();
|
|
1835
|
+
|
|
1836
|
+
const indexedDocumentDefinition = rawDataContract.documents.indexedArray;
|
|
1837
|
+
|
|
1838
|
+
const indexDefinition = indexedDocumentDefinition.indices[0];
|
|
1839
|
+
|
|
1840
|
+
rawDataContract.documents.indexedArray.properties.mentions.prefixItems = [
|
|
1841
|
+
{
|
|
1842
|
+
type: 'object',
|
|
1843
|
+
properties: {
|
|
1844
|
+
something: {
|
|
1845
|
+
type: 'string',
|
|
1846
|
+
},
|
|
1847
|
+
},
|
|
1848
|
+
additionalProperties: false,
|
|
1849
|
+
},
|
|
1850
|
+
];
|
|
1851
|
+
|
|
1852
|
+
const result = await validateDataContract(rawDataContract);
|
|
1853
|
+
expectValidationError(result, InvalidIndexPropertyTypeError);
|
|
1854
|
+
|
|
1855
|
+
const error = result.getFirstError();
|
|
1856
|
+
|
|
1857
|
+
expect(error.getCode()).to.equal(1013);
|
|
1858
|
+
expect(error.getPropertyName()).to.equal('mentions');
|
|
1859
|
+
expect(error.getPropertyType()).to.equal('array');
|
|
1860
|
+
expect(error.getDocumentType()).to.deep.equal('indexedArray');
|
|
1861
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1862
|
+
});
|
|
1863
|
+
|
|
1864
|
+
it('should return invalid result if index property is array of arrays', async () => {
|
|
1865
|
+
const rawDataContract = dataContract.toObject();
|
|
1866
|
+
const indexedDocumentDefinition = rawDataContract.documents.indexedDocument;
|
|
1867
|
+
|
|
1868
|
+
indexedDocumentDefinition.properties.arrayProperty = {
|
|
1869
|
+
type: 'array',
|
|
1870
|
+
items: {
|
|
1871
|
+
type: 'array',
|
|
1872
|
+
items: {
|
|
1873
|
+
type: 'string',
|
|
1874
|
+
},
|
|
1875
|
+
},
|
|
1876
|
+
};
|
|
1877
|
+
|
|
1878
|
+
indexedDocumentDefinition.required.push('arrayProperty');
|
|
1879
|
+
|
|
1880
|
+
const indexDefinition = indexedDocumentDefinition.indices[0];
|
|
1881
|
+
|
|
1882
|
+
indexDefinition.properties.push({
|
|
1883
|
+
arrayProperty: 'asc',
|
|
1884
|
+
});
|
|
1885
|
+
|
|
1886
|
+
const result = await validateDataContract(rawDataContract);
|
|
1887
|
+
|
|
1888
|
+
expectValidationError(result, InvalidIndexPropertyTypeError);
|
|
1889
|
+
|
|
1890
|
+
const [error] = result.getErrors();
|
|
1891
|
+
|
|
1892
|
+
expect(error.getCode()).to.equal(1013);
|
|
1893
|
+
expect(error.getPropertyName()).to.equal('arrayProperty');
|
|
1894
|
+
expect(error.getPropertyType()).to.equal('array');
|
|
1895
|
+
expect(error.getDocumentType()).to.deep.equal('indexedDocument');
|
|
1896
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1897
|
+
});
|
|
1836
1898
|
|
|
1837
1899
|
it('should return invalid result if index property is array with different item definitions', async () => {
|
|
1900
|
+
const rawDataContract = dataContract.toObject();
|
|
1838
1901
|
const indexedDocumentDefinition = rawDataContract.documents.indexedDocument;
|
|
1839
1902
|
|
|
1840
1903
|
indexedDocumentDefinition.properties.arrayProperty = {
|
|
@@ -1869,10 +1932,11 @@ describe('validateDataContractFactory', function main() {
|
|
|
1869
1932
|
expect(error.getPropertyName()).to.equal('arrayProperty');
|
|
1870
1933
|
expect(error.getPropertyType()).to.equal('array');
|
|
1871
1934
|
expect(error.getDocumentType()).to.deep.equal('indexedDocument');
|
|
1872
|
-
expect(error.getIndexDefinition()).to.deep.equal(indexDefinition);
|
|
1935
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(indexDefinition);
|
|
1873
1936
|
});
|
|
1874
1937
|
|
|
1875
1938
|
it('should return invalid result if unique compound index contains both required and optional properties', async () => {
|
|
1939
|
+
const rawDataContract = dataContract.toObject();
|
|
1876
1940
|
rawDataContract.documents.optionalUniqueIndexedDocument.required.splice(-1);
|
|
1877
1941
|
|
|
1878
1942
|
const result = await validateDataContract(rawDataContract);
|
|
@@ -1882,7 +1946,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
1882
1946
|
const [error] = result.getErrors();
|
|
1883
1947
|
|
|
1884
1948
|
expect(error.getCode()).to.equal(1010);
|
|
1885
|
-
expect(error.getIndexDefinition()).to.deep.equal(
|
|
1949
|
+
expect(error.getIndexDefinition().toObject()).to.deep.equal(
|
|
1886
1950
|
rawDataContract.documents.optionalUniqueIndexedDocument.indices[1],
|
|
1887
1951
|
);
|
|
1888
1952
|
expect(error.getDocumentType()).to.equal('optionalUniqueIndexedDocument');
|
|
@@ -1892,34 +1956,37 @@ describe('validateDataContractFactory', function main() {
|
|
|
1892
1956
|
|
|
1893
1957
|
describe('signatureSecurityLevelRequirement', () => {
|
|
1894
1958
|
it('should be a number', async () => {
|
|
1959
|
+
const rawDataContract = dataContract.toObject();
|
|
1895
1960
|
rawDataContract.documents.indexedDocument.signatureSecurityLevelRequirement = 'definitely not a number';
|
|
1896
1961
|
|
|
1897
1962
|
const result = await validateDataContract(rawDataContract);
|
|
1898
1963
|
|
|
1899
|
-
expectJsonSchemaError(result);
|
|
1964
|
+
await expectJsonSchemaError(result, 2);
|
|
1900
1965
|
|
|
1901
1966
|
const [error] = result.getErrors();
|
|
1902
1967
|
|
|
1903
|
-
expect(error.
|
|
1968
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/signatureSecurityLevelRequirement');
|
|
1904
1969
|
expect(error.getKeyword()).to.equal('type');
|
|
1905
1970
|
});
|
|
1906
1971
|
|
|
1907
1972
|
it('should be one of the available values', async () => {
|
|
1973
|
+
const rawDataContract = dataContract.toObject();
|
|
1908
1974
|
rawDataContract.documents.indexedDocument.signatureSecurityLevelRequirement = 199;
|
|
1909
1975
|
|
|
1910
1976
|
const result = await validateDataContract(rawDataContract);
|
|
1911
1977
|
|
|
1912
|
-
expectJsonSchemaError(result);
|
|
1978
|
+
await expectJsonSchemaError(result);
|
|
1913
1979
|
|
|
1914
1980
|
const [error] = result.getErrors();
|
|
1915
1981
|
|
|
1916
|
-
expect(error.
|
|
1982
|
+
expect(error.getInstancePath()).to.equal('/documents/indexedDocument/signatureSecurityLevelRequirement');
|
|
1917
1983
|
expect(error.getKeyword()).to.equal('enum');
|
|
1918
1984
|
});
|
|
1919
1985
|
});
|
|
1920
1986
|
|
|
1921
1987
|
describe('dependentSchemas', () => {
|
|
1922
1988
|
it('should be an object', async () => {
|
|
1989
|
+
const rawDataContract = dataContract.toObject();
|
|
1923
1990
|
rawDataContract.documents.niceDocument = {
|
|
1924
1991
|
type: 'object',
|
|
1925
1992
|
properties: {
|
|
@@ -1933,18 +2000,18 @@ describe('validateDataContractFactory', function main() {
|
|
|
1933
2000
|
|
|
1934
2001
|
const result = await validateDataContract(rawDataContract);
|
|
1935
2002
|
|
|
1936
|
-
expectJsonSchemaError(result);
|
|
2003
|
+
await expectJsonSchemaError(result);
|
|
1937
2004
|
|
|
1938
2005
|
const [error] = result.getErrors();
|
|
1939
2006
|
|
|
1940
2007
|
expect(error.getKeyword()).to.equal('type');
|
|
1941
|
-
expect(error.
|
|
1942
|
-
expect(error.message).to.equal('must be object');
|
|
2008
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/dependentSchemas');
|
|
1943
2009
|
});
|
|
1944
2010
|
});
|
|
1945
2011
|
|
|
1946
2012
|
describe('dependentRequired', () => {
|
|
1947
2013
|
it('should be an object', async () => {
|
|
2014
|
+
const rawDataContract = dataContract.toObject();
|
|
1948
2015
|
rawDataContract.documents.niceDocument = {
|
|
1949
2016
|
type: 'object',
|
|
1950
2017
|
properties: {
|
|
@@ -1958,16 +2025,16 @@ describe('validateDataContractFactory', function main() {
|
|
|
1958
2025
|
|
|
1959
2026
|
const result = await validateDataContract(rawDataContract);
|
|
1960
2027
|
|
|
1961
|
-
expectJsonSchemaError(result);
|
|
2028
|
+
await expectJsonSchemaError(result);
|
|
1962
2029
|
|
|
1963
2030
|
const [error] = result.getErrors();
|
|
1964
2031
|
|
|
1965
2032
|
expect(error.getKeyword()).to.equal('type');
|
|
1966
|
-
expect(error.
|
|
1967
|
-
expect(error.message).to.equal('must be object');
|
|
2033
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/dependentRequired');
|
|
1968
2034
|
});
|
|
1969
2035
|
|
|
1970
2036
|
it('should have an array value', async () => {
|
|
2037
|
+
const rawDataContract = dataContract.toObject();
|
|
1971
2038
|
rawDataContract.documents.niceDocument = {
|
|
1972
2039
|
type: 'object',
|
|
1973
2040
|
properties: {
|
|
@@ -1985,16 +2052,16 @@ describe('validateDataContractFactory', function main() {
|
|
|
1985
2052
|
|
|
1986
2053
|
const result = await validateDataContract(rawDataContract);
|
|
1987
2054
|
|
|
1988
|
-
expectJsonSchemaError(result);
|
|
2055
|
+
await expectJsonSchemaError(result);
|
|
1989
2056
|
|
|
1990
2057
|
const [error] = result.getErrors();
|
|
1991
2058
|
|
|
1992
2059
|
expect(error.getKeyword()).to.equal('type');
|
|
1993
|
-
expect(error.
|
|
1994
|
-
expect(error.message).to.equal('must be array');
|
|
2060
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/dependentRequired/zxy');
|
|
1995
2061
|
});
|
|
1996
2062
|
|
|
1997
2063
|
it('should have an array of strings', async () => {
|
|
2064
|
+
const rawDataContract = dataContract.toObject();
|
|
1998
2065
|
rawDataContract.documents.niceDocument = {
|
|
1999
2066
|
type: 'object',
|
|
2000
2067
|
properties: {
|
|
@@ -2010,16 +2077,16 @@ describe('validateDataContractFactory', function main() {
|
|
|
2010
2077
|
|
|
2011
2078
|
const result = await validateDataContract(rawDataContract);
|
|
2012
2079
|
|
|
2013
|
-
expectJsonSchemaError(result);
|
|
2080
|
+
await expectJsonSchemaError(result);
|
|
2014
2081
|
|
|
2015
2082
|
const [error] = result.getErrors();
|
|
2016
2083
|
|
|
2017
2084
|
expect(error.getKeyword()).to.equal('type');
|
|
2018
|
-
expect(error.
|
|
2019
|
-
expect(error.message).to.equal('must be string');
|
|
2085
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/dependentRequired/zxy/0');
|
|
2020
2086
|
});
|
|
2021
2087
|
|
|
2022
2088
|
it('should have an array of unique strings', async () => {
|
|
2089
|
+
const rawDataContract = dataContract.toObject();
|
|
2023
2090
|
rawDataContract.documents.niceDocument = {
|
|
2024
2091
|
type: 'object',
|
|
2025
2092
|
properties: {
|
|
@@ -2035,17 +2102,18 @@ describe('validateDataContractFactory', function main() {
|
|
|
2035
2102
|
|
|
2036
2103
|
const result = await validateDataContract(rawDataContract);
|
|
2037
2104
|
|
|
2038
|
-
expectJsonSchemaError(result);
|
|
2105
|
+
await expectJsonSchemaError(result);
|
|
2039
2106
|
|
|
2040
2107
|
const [error] = result.getErrors();
|
|
2041
2108
|
|
|
2042
2109
|
expect(error.getKeyword()).to.equal('uniqueItems');
|
|
2043
|
-
expect(error.
|
|
2044
|
-
expect(error.message).to.equal('must NOT have duplicate items (items ## 2 and 1 are identical)');
|
|
2110
|
+
expect(error.getInstancePath()).to.equal('/documents/niceDocument/dependentRequired/zxy');
|
|
2045
2111
|
});
|
|
2046
2112
|
});
|
|
2047
2113
|
|
|
2048
|
-
it
|
|
2114
|
+
it('should return invalid result with circular $ref pointer', async () => {
|
|
2115
|
+
const rawDataContract = dataContract.toObject();
|
|
2116
|
+
rawDataContract.$defs = {};
|
|
2049
2117
|
rawDataContract.$defs.object = { $ref: '#/$defs/object' };
|
|
2050
2118
|
|
|
2051
2119
|
const result = await validateDataContract(rawDataContract);
|
|
@@ -2055,11 +2123,10 @@ describe('validateDataContractFactory', function main() {
|
|
|
2055
2123
|
const [error] = result.getErrors();
|
|
2056
2124
|
|
|
2057
2125
|
expect(error.getCode()).to.equal(1014);
|
|
2058
|
-
|
|
2059
|
-
expect(error.message).to.startsWith('Invalid JSON Schema $ref: Circular $ref pointer found');
|
|
2060
2126
|
});
|
|
2061
2127
|
|
|
2062
2128
|
it('should return invalid result if indexed string property missing maxLength constraint', async () => {
|
|
2129
|
+
const rawDataContract = dataContract.toObject();
|
|
2063
2130
|
delete rawDataContract.documents.indexedDocument.properties.firstName.maxLength;
|
|
2064
2131
|
|
|
2065
2132
|
const result = await validateDataContract(rawDataContract);
|
|
@@ -2071,10 +2138,11 @@ describe('validateDataContractFactory', function main() {
|
|
|
2071
2138
|
expect(error.getCode()).to.equal(1012);
|
|
2072
2139
|
expect(error.getPropertyName()).to.equal('firstName');
|
|
2073
2140
|
expect(error.getConstraintName()).to.equal('maxLength');
|
|
2074
|
-
expect(error.getReason()).to.equal('should be less or equal 63');
|
|
2141
|
+
expect(error.getReason()).to.equal('should be less or equal than 63');
|
|
2075
2142
|
});
|
|
2076
2143
|
|
|
2077
2144
|
it('should return invalid result if indexed string property have to big maxLength', async () => {
|
|
2145
|
+
const rawDataContract = dataContract.toObject();
|
|
2078
2146
|
rawDataContract.documents.indexedDocument.properties.firstName.maxLength = 2048;
|
|
2079
2147
|
|
|
2080
2148
|
const result = await validateDataContract(rawDataContract);
|
|
@@ -2086,73 +2154,80 @@ describe('validateDataContractFactory', function main() {
|
|
|
2086
2154
|
expect(error.getCode()).to.equal(1012);
|
|
2087
2155
|
expect(error.getPropertyName()).to.equal('firstName');
|
|
2088
2156
|
expect(error.getConstraintName()).to.equal('maxLength');
|
|
2157
|
+
expect(error.getReason()).to.equal('should be less or equal than 63');
|
|
2158
|
+
});
|
|
2159
|
+
|
|
2160
|
+
// TODO: support indexed arrays
|
|
2161
|
+
it.skip('should return invalid result if indexed array property missing maxItems constraint',
|
|
2162
|
+
async () => {
|
|
2163
|
+
const rawDataContract = dataContract.toObject();
|
|
2164
|
+
delete rawDataContract.documents.indexedArray.properties.mentions.maxItems;
|
|
2165
|
+
|
|
2166
|
+
const result = await validateDataContract(rawDataContract);
|
|
2167
|
+
|
|
2168
|
+
expectValidationError(result, InvalidIndexedPropertyConstraintError);
|
|
2169
|
+
|
|
2170
|
+
const [error] = result.getErrors();
|
|
2171
|
+
|
|
2172
|
+
expect(error.getCode()).to.equal(1012);
|
|
2173
|
+
expect(error.getPropertyName()).to.equal('mentions');
|
|
2174
|
+
expect(error.getConstraintName()).to.equal('maxItems');
|
|
2175
|
+
expect(error.getReason()).to.equal('should be less or equal 63');
|
|
2176
|
+
});
|
|
2177
|
+
|
|
2178
|
+
// TODO support indexed arrays
|
|
2179
|
+
it.skip('should return invalid result if indexed array property have to big maxItems', async () => {
|
|
2180
|
+
const rawDataContract = dataContract.toObject();
|
|
2181
|
+
rawDataContract.documents.indexedArray.properties.mentions.maxItems = 2048;
|
|
2182
|
+
|
|
2183
|
+
const result = await validateDataContract(rawDataContract);
|
|
2184
|
+
|
|
2185
|
+
expectValidationError(result, InvalidIndexedPropertyConstraintError);
|
|
2186
|
+
|
|
2187
|
+
const [error] = result.getErrors();
|
|
2188
|
+
|
|
2189
|
+
expect(error.getCode()).to.equal(1012);
|
|
2190
|
+
expect(error.getPropertyName()).to.equal('mentions');
|
|
2191
|
+
expect(error.getConstraintName()).to.equal('maxItems');
|
|
2192
|
+
expect(error.getReason()).to.equal('should be less or equal 63');
|
|
2193
|
+
});
|
|
2194
|
+
|
|
2195
|
+
// TODO support indexed arrays
|
|
2196
|
+
it.skip('should return invalid result if indexed array property have string item without maxItems constraint', async () => {
|
|
2197
|
+
const rawDataContract = dataContract.toObject();
|
|
2198
|
+
delete rawDataContract.documents.indexedArray.properties.mentions.maxItems;
|
|
2199
|
+
|
|
2200
|
+
const result = await validateDataContract(rawDataContract);
|
|
2201
|
+
|
|
2202
|
+
expectValidationError(result, InvalidIndexedPropertyConstraintError);
|
|
2203
|
+
|
|
2204
|
+
const [error] = result.getErrors();
|
|
2205
|
+
|
|
2206
|
+
expect(error.getCode()).to.equal(1012);
|
|
2207
|
+
expect(error.getPropertyName()).to.equal('mentions');
|
|
2208
|
+
expect(error.getConstraintName()).to.equal('maxItems');
|
|
2089
2209
|
expect(error.getReason()).to.equal('should be less or equal 63');
|
|
2090
2210
|
});
|
|
2091
2211
|
|
|
2092
|
-
//
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
// it('should return invalid result if indexed array property have to big maxItems', async () => {
|
|
2109
|
-
// rawDataContract.documents.indexedArray.properties.mentions.maxItems = 2048;
|
|
2110
|
-
//
|
|
2111
|
-
// const result = await validateDataContract(rawDataContract);
|
|
2112
|
-
//
|
|
2113
|
-
// expectValidationError(result, InvalidIndexedPropertyConstraintError);
|
|
2114
|
-
//
|
|
2115
|
-
// const [error] = result.getErrors();
|
|
2116
|
-
//
|
|
2117
|
-
// expect(error.getCode()).to.equal(1012);
|
|
2118
|
-
// expect(error.getPropertyName()).to.equal('mentions');
|
|
2119
|
-
// expect(error.getConstraintName()).to.equal('maxItems');
|
|
2120
|
-
// expect(error.getReason()).to.equal('should be less or equal 63');
|
|
2121
|
-
// });
|
|
2122
|
-
//
|
|
2123
|
-
// it('should return invalid result if indexed array property
|
|
2124
|
-
// have string item without maxItems constraint', async () => {
|
|
2125
|
-
// delete rawDataContract.documents.indexedArray.properties.mentions.maxItems;
|
|
2126
|
-
//
|
|
2127
|
-
// const result = await validateDataContract(rawDataContract);
|
|
2128
|
-
//
|
|
2129
|
-
// expectValidationError(result, InvalidIndexedPropertyConstraintError);
|
|
2130
|
-
//
|
|
2131
|
-
// const [error] = result.getErrors();
|
|
2132
|
-
//
|
|
2133
|
-
// expect(error.getCode()).to.equal(1012);
|
|
2134
|
-
// expect(error.getPropertyName()).to.equal('mentions');
|
|
2135
|
-
// expect(error.getConstraintName()).to.equal('maxItems');
|
|
2136
|
-
// expect(error.getReason()).to.equal('should be less or equal 63');
|
|
2137
|
-
// });
|
|
2138
|
-
//
|
|
2139
|
-
// it('should return invalid result if indexed array property have
|
|
2140
|
-
// string item with maxItems bigger than 1024', async () => {
|
|
2141
|
-
// rawDataContract.documents.indexedArray.properties.mentions.maxItems = 2048;
|
|
2142
|
-
//
|
|
2143
|
-
// const result = await validateDataContract(rawDataContract);
|
|
2144
|
-
//
|
|
2145
|
-
// expectValidationError(result, InvalidIndexedPropertyConstraintError);
|
|
2146
|
-
//
|
|
2147
|
-
// const [error] = result.getErrors();
|
|
2148
|
-
//
|
|
2149
|
-
// expect(error.getCode()).to.equal(1012);
|
|
2150
|
-
// expect(error.getPropertyName()).to.equal('mentions');
|
|
2151
|
-
// expect(error.getConstraintName()).to.equal('maxItems');
|
|
2152
|
-
// expect(error.getReason()).to.equal('should be less or equal 63');
|
|
2153
|
-
// });
|
|
2212
|
+
// TODO support indexed arrays
|
|
2213
|
+
it.skip('should return invalid result if indexed array property have string item with maxItems bigger than 1024', async () => {
|
|
2214
|
+
const rawDataContract = dataContract.toObject();
|
|
2215
|
+
rawDataContract.documents.indexedArray.properties.mentions.maxItems = 2048;
|
|
2216
|
+
|
|
2217
|
+
const result = await validateDataContract(rawDataContract);
|
|
2218
|
+
|
|
2219
|
+
expectValidationError(result, InvalidIndexedPropertyConstraintError);
|
|
2220
|
+
|
|
2221
|
+
const [error] = result.getErrors();
|
|
2222
|
+
|
|
2223
|
+
expect(error.getCode()).to.equal(1012);
|
|
2224
|
+
expect(error.getPropertyName()).to.equal('mentions');
|
|
2225
|
+
expect(error.getConstraintName()).to.equal('maxItems');
|
|
2226
|
+
expect(error.getReason()).to.equal('should be less or equal 63');
|
|
2227
|
+
});
|
|
2154
2228
|
|
|
2155
2229
|
it('should return invalid result if indexed byte array property missing maxItems constraint', async () => {
|
|
2230
|
+
const rawDataContract = dataContract.toObject();
|
|
2156
2231
|
delete rawDataContract.documents.withByteArrays.properties.byteArrayField.maxItems;
|
|
2157
2232
|
|
|
2158
2233
|
const result = await validateDataContract(rawDataContract);
|
|
@@ -2168,6 +2243,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
2168
2243
|
});
|
|
2169
2244
|
|
|
2170
2245
|
it('should return invalid result if indexed byte array property have to big maxItems', async () => {
|
|
2246
|
+
const rawDataContract = dataContract.toObject();
|
|
2171
2247
|
rawDataContract.documents.withByteArrays.properties.byteArrayField.maxItems = 8192;
|
|
2172
2248
|
|
|
2173
2249
|
const result = await validateDataContract(rawDataContract);
|
|
@@ -2183,6 +2259,7 @@ describe('validateDataContractFactory', function main() {
|
|
|
2183
2259
|
});
|
|
2184
2260
|
|
|
2185
2261
|
it('should return valid result if Data Contract is valid', async () => {
|
|
2262
|
+
const rawDataContract = dataContract.toObject();
|
|
2186
2263
|
const result = await validateDataContract(rawDataContract);
|
|
2187
2264
|
|
|
2188
2265
|
expect(result).to.be.an.instanceOf(ValidationResult);
|