Skip to content
17 changes: 13 additions & 4 deletions packages/rs-dpp/src/document/document_factory.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
use anyhow::Context;
use chrono::Utc;
use std::collections::BTreeMap;
use std::collections::{BTreeMap, HashSet};

use itertools::Itertools;

use platform_value::{Bytes32, Value};

use platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper;
use platform_value::{Bytes32, ReplacementType, Value};
use rand::rngs::StdRng;
use rand::SeedableRng;
use serde::{Deserialize, Serialize};

use crate::consensus::basic::document::InvalidDocumentTypeError;
Expand Down Expand Up @@ -157,7 +159,7 @@ where
(None, None)
};

let document = Document {
let mut document = Document {
id: document_id,
owner_id,
properties: data
Expand All @@ -168,6 +170,13 @@ where
updated_at,
};

let (identifiers, _): (HashSet<_>, HashSet<_>) =
data_contract.get_identifiers_and_binary_paths_owned(document_type_name.as_str())?;

document
.properties
.replace_at_paths(identifiers, ReplacementType::Identifier)?;

// let json_value = document.to_json_with_identifiers_using_bytes()?;
// let validation_result =
// self.document_validator
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getChainAssetLockProofFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getDashPayContractFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getDashPayDocumentFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getDocumentTransitionsFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getDpnsContractFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getDpnsDocumentFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getFeatureFlagsContractFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getFeatureFlagsDocumentsFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getMasternodeRewardShareDocumentsFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getMasternodeRewardSharesContractFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getPreorderDocumentFixture');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('@dashevo/dpp/lib/test/fixtures/getRawTransactionFixture');
34 changes: 10 additions & 24 deletions packages/wasm-dpp/test/integration/document/Document.spec.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
const MetadataJs = require('@dashevo/dpp/lib/Metadata');

const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture');
const getDataContractFixture = require('../../../lib/test/fixtures/getDataContractFixture');
const getDocumentsFixture = require('../../../lib/test/fixtures/getDocumentsFixture');

const { default: loadWasmDpp } = require('../../../dist');

let ExtendedDocument;
let DataContract;
let Metadata;
let Identifier;

Expand All @@ -17,24 +13,14 @@ describe('ExtendedDocument', () => {

beforeEach(async () => {
({
ExtendedDocument,
DataContract,
Metadata,
Identifier,
} = await loadWasmDpp());

const dataContractJs = getDataContractFixture();
dataContract = new DataContract(dataContractJs.toObject());

const [documentJs] = getDocumentsFixture(dataContractJs).slice(8);
document = new ExtendedDocument(documentJs.toObject(), dataContract);
dataContract = await getDataContractFixture();

const metadataFixtureJs = new MetadataJs({
blockHeight: 42,
coreChainLockedHeight: 0,
timeMs: new Date().getTime(),
protocolVersion: 1,
});
const documents = await getDocumentsFixture(dataContract);
[document] = documents.slice(8);

metadataFixture = Metadata.from({
blockHeight: 42,
Expand All @@ -43,20 +29,18 @@ describe('ExtendedDocument', () => {
protocolVersion: 1,
});

documentJs.setMetadata(metadataFixtureJs);
document.setMetadata(metadataFixture);
});

describe('#toJSON', () => {
it('should return json document - Rust', () => {
console.log(document);
const result = document.toJSON();

expect(result).to.deep.equal({
$protocolVersion: document.getProtocolVersion(),
$dataContractId: dataContract.getId().toString(),
$id: document.getId().toString(),
$ownerId: getDocumentsFixture.ownerId.toString(),
$ownerId: document.getOwnerId().toString(),
$revision: 1,
$type: 'withByteArrays',
byteArrayField: document.get('byteArrayField').toString('base64'),
Expand All @@ -69,11 +53,13 @@ describe('ExtendedDocument', () => {
it('should return raw document - Rust', () => {
const result = document.toObject();

console.log(document.get('byteArrayField'));

expect(result).to.deep.equal({
$protocolVersion: document.getProtocolVersion(),
$dataContractId: dataContract.getId().toBuffer(),
$id: document.getId().toBuffer(),
$ownerId: getDocumentsFixture.ownerId,
$ownerId: document.getOwnerId().toBuffer(),
$revision: 1,
$type: 'withByteArrays',
byteArrayField: document.get('byteArrayField'),
Expand All @@ -91,7 +77,7 @@ describe('ExtendedDocument', () => {

expect(result.$dataContractId.toBuffer()).to.deep.equal(dataContract.getId().toBuffer());
expect(result.$id.toBuffer()).to.deep.equal(document.getId().toBuffer());
expect(result.$ownerId.toBuffer()).to.deep.equal(getDocumentsFixture.ownerId.toBuffer());
expect(result.$ownerId.toBuffer()).to.deep.equal(document.getOwnerId().toBuffer());
expect(result.identifierField.toBuffer()).to.deep.equal(document.get('identifierField').toBuffer());
expect(result.$protocolVersion).to.deep.equal(document.getProtocolVersion());
expect(result.$revision).to.deep.equal(document.getRevision());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const generateRandomIdentifier = require('@dashevo/dpp/lib/test/utils/generateRa
const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture');
const getDocumentTransitionsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentTransitionsFixture');
const getDocumentTransitionsFixture = require('../../../lib/test/fixtures/getDocumentTransitionsFixture');

const { default: loadWasmDpp } = require('../../../dist');
const getBlsAdapterMock = require('../../../lib/test/mocks/getBlsAdapterMock');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const { PrivateKey } = require('@dashevo/dashcore-lib');

const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture');

const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
const { expectValidationError, expectJsonSchemaError } = require('../../../../../../../lib/test/expect/expectError');
const { default: loadWasmDpp } = require('../../../../../../../dist');
const getBlsAdapterMock = require('../../../../../../../lib/test/mocks/getBlsAdapterMock');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const getIdentityTopUpTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture');

const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
const getIdentityTopUpTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture');

const {
expectJsonSchemaError,
expectValidationError,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ const DataTriggerConditionError = require('@dashevo/dpp/lib/errors/consensus/sta
const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');
const getDocumentTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentTransitionsFixture');

const getDashPayContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDashPayContractFixture');
const { getContactRequestDocumentFixture } = require('@dashevo/dpp/lib/test/fixtures/getDashPayDocumentFixture');
const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext');
const getDashPayContractFixture = require('../../../../lib/test/fixtures/getDashPayContractFixture');
const { getContactRequestDocumentFixture } = require('../../../../lib/test/fixtures/getDashPayDocumentFixture');

describe('createContactRequestDataTrigger', () => {
let context;
Expand Down
12 changes: 6 additions & 6 deletions packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
const bs58 = require('bs58');

const DocumentCreateTransition = require('@dashevo/dpp/lib/document/stateTransition/DocumentsBatchTransition/documentTransition/DocumentCreateTransition');
const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture');
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult');
const createDPPMock = require('@dashevo/dpp/lib/test/mocks/createDPPMock');
const DocumentFactoryJS = require('@dashevo/dpp/lib/document/DocumentFactory');

const getDataContractFixtureJs = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');
const getDocumentsFixtureJs = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture');
const createStateRepositoryMock = require('../../../lib/test/mocks/createStateRepositoryMock');
const generateRandomIdentifierAsync = require('../../../lib/test/utils/generateRandomIdentifierAsync');

Expand Down Expand Up @@ -62,15 +62,15 @@ describe('DocumentFactory', () => {
const protocolValidator = new ProtocolVersionValidator();
documentValidator = new DocumentValidator(protocolValidator);

({ ownerId: ownerIdJs } = getDocumentsFixture);
([{ ownerId: ownerIdJs }] = getDocumentsFixtureJs());
ownerId = Identifier.from(ownerIdJs);

dataContractJs = getDataContractFixture();
dataContractJs = getDataContractFixtureJs();
dataContract = DataContract.fromBuffer(dataContractJs.toBuffer());
const dc = DataContract.fromBuffer(dataContractJs.toBuffer());
dataContractId = dataContractJs.getId().toBuffer();

documentsJs = getDocumentsFixture(dataContractJs);
documentsJs = getDocumentsFixtureJs(dataContractJs);
documents = documentsJs.map((d) => {
const doc = new ExtendedDocument(d.toObject(), dataContract);
doc.setEntropy(d.entropy);
Expand Down Expand Up @@ -348,7 +348,7 @@ describe('DocumentFactory', () => {
});

it('should create DocumentsBatchTransition with passed documents', async () => {
const [newDocumentJs] = getDocumentsFixture(dataContractJs);
const [newDocumentJs] = getDocumentsFixtureJs(dataContractJs);
const newDocument = new ExtendedDocument(newDocumentJs.toObject(), dataContract);

const stateTransition = factory.createStateTransition({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,108 +1,64 @@
const fetchAndValidateDataContractFactory = require('@dashevo/dpp/lib/document/fetchAndValidateDataContractFactory');
const createStateRepositoryMock = require('../../../lib/test/mocks/createStateRepositoryMock');
const getDocumentsFixture = require('../../../lib/test/fixtures/getDocumentsFixture');
const getDataContractFixture = require('../../../lib/test/fixtures/getDataContractFixture');

const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock');

const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture');
const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture');

const ValidationResultJs = require('@dashevo/dpp/lib/validation/ValidationResult');

const MissingDataContractIdErrorJs = require('@dashevo/dpp/lib/errors/consensus/basic/document/MissingDataContractIdError');
const DataContractNotPresentErrorJs = require('@dashevo/dpp/lib/errors/consensus/basic/document/DataContractNotPresentError');

const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError');
const { expectValidationError } = require('../../../lib/test/expect/expectError');

const { default: loadWasmDpp } = require('../../../dist');

let ValidationResult;
let DataContract;
let MissingDataContractIdError;
let DataContractNotPresentError;

describe('fetchAndValidateDataContractFactory', () => {
let stateRepositoryMockJs;
let stateRepositoryMock;
let fetchAndValidateDataContractJs;
let fetchAndValidateDataContract;
let rawDocument;

beforeEach(async () => {
({
DataContract,
fetchAndValidateDataContract,
ValidationResult,
MissingDataContractIdError,
DataContractNotPresentError,
} = await loadWasmDpp());
});

beforeEach(function beforeEach() {
const dataContractJs = getDataContractFixture();
const dataContract = DataContract.fromBuffer(dataContractJs.toBuffer());
beforeEach(async function beforeEach() {
const dataContract = await getDataContractFixture();

const [document] = getDocumentsFixture(dataContractJs);
const [document] = await getDocumentsFixture(dataContract);
rawDocument = document.toObject();

stateRepositoryMockJs = createStateRepositoryMock(this.sinonSandbox);
stateRepositoryMockJs.fetchDataContract.resolves(dataContractJs);

stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox);
stateRepositoryMock.fetchDataContract.resolves(dataContract);

fetchAndValidateDataContractJs = fetchAndValidateDataContractFactory(
stateRepositoryMockJs,
);
});

it('should return with invalid result if $dataContractId is not present', async () => {
delete rawDocument.$dataContractId;

const result = await fetchAndValidateDataContractJs(rawDocument);

expectValidationError(result, MissingDataContractIdErrorJs);

const [error] = result.getErrors();

expect(error.getCode()).to.equal(1025);
});

it('should return with invalid result if $dataContractId is not present - Rust', async () => {
delete rawDocument.$dataContractId;

const result = await fetchAndValidateDataContract(stateRepositoryMock, rawDocument);

await expectValidationError(result, MissingDataContractIdError);

const [error] = result.getErrors();
expect(error.getCode()).to.equal(1025);
});

it('should return with invalid result if Data Contract is not present', async () => {
stateRepositoryMockJs.fetchDataContract.resolves(null);

const result = await fetchAndValidateDataContractJs(rawDocument);

expectValidationError(result, DataContractNotPresentErrorJs);

const [error] = result.getErrors();

expect(error.getCode()).to.equal(1018);
expect(error.getDataContractId()).to.deep.equal(rawDocument.$dataContractId);
});

it('should return with invalid result if Data Contract is not present - Rust', async () => {
stateRepositoryMock.fetchDataContract.resolves(null);

const result = await fetchAndValidateDataContract(stateRepositoryMock, rawDocument);

await expectValidationError(result, DataContractNotPresentError);

const [error] = result.getErrors();

expect(error.getCode()).to.equal(1018);
expect(error.getDataContractId()).to.deep.equal(rawDocument.$dataContractId);
});

it('should return valid result', async () => {
const result = await fetchAndValidateDataContractJs(rawDocument);

expect(result).to.be.an.instanceOf(ValidationResultJs);
expect(result.isValid()).to.be.true();
});

it('should return valid result - Rust', async () => {
const result = await fetchAndValidateDataContract(stateRepositoryMock, rawDocument);

expect(result).to.be.an.instanceOf(ValidationResult);
Expand Down
Loading