Skip to content

Commit a9f9135

Browse files
committed
add test for search contract creation restriction
1 parent 7f47870 commit a9f9135

File tree

1 file changed

+137
-0
lines changed
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document

1 file changed

+137
-0
lines changed

packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/document/creation.rs

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ mod creation_tests {
77
use dapi_grpc::platform::v0::get_contested_resource_vote_state_request::GetContestedResourceVoteStateRequestV0;
88
use dapi_grpc::platform::v0::get_contested_resource_vote_state_response::{get_contested_resource_vote_state_response_v0, GetContestedResourceVoteStateResponseV0};
99
use assert_matches::assert_matches;
10+
use dpp::platform_value::string_encoding::Encoding;
11+
use dpp::prelude::Identifier;
1012
use rand::distributions::Standard;
1113
use dpp::consensus::basic::document::DocumentFieldMaxSizeExceededError;
1214
use dpp::consensus::ConsensusError;
@@ -2468,6 +2470,141 @@ mod creation_tests {
24682470
assert_eq!(consensus_error.to_string(), "Document Creation on 86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e:card is not allowed because of the document type's creation restriction mode Owner Only");
24692471
}
24702472

2473+
#[test]
2474+
fn test_document_creation_on_search_system_contract_fails_due_to_restriction() {
2475+
// Build test platform
2476+
let mut platform = TestPlatformBuilder::new()
2477+
.with_latest_protocol_version()
2478+
.build_with_mock_rpc()
2479+
.set_initial_state_structure();
2480+
2481+
// Create an identity that will attempt to create the document
2482+
let (identity, signer, key) = setup_identity(&mut platform, 999, dash_to_credits!(0.1));
2483+
2484+
// Obtain the current platform state and version
2485+
let platform_state = platform.state.load();
2486+
let platform_version = platform_state
2487+
.current_platform_version()
2488+
.expect("expected to get current platform version");
2489+
2490+
// Load the system Search contract
2491+
let search_contract = platform.drive.cache.system_data_contracts.load_search();
2492+
2493+
platform
2494+
.drive
2495+
.apply_contract(
2496+
&search_contract,
2497+
BlockInfo::default(),
2498+
true,
2499+
StorageFlags::optional_default_as_cow(),
2500+
None,
2501+
platform_version,
2502+
)
2503+
.expect("expected to apply contract successfully");
2504+
2505+
// Get the document type from the search contract.
2506+
let doc_type = search_contract
2507+
.document_type_for_name("contract")
2508+
.expect("expected to find 'contract' in Search contract");
2509+
2510+
// Verify that the document type has the restrictive creation mode
2511+
assert_eq!(
2512+
doc_type.creation_restriction_mode(),
2513+
CreationRestrictionMode::NoCreationAllowed,
2514+
"Expected creation restriction mode to be NoCreationAllowed (2)."
2515+
);
2516+
2517+
// Create a random document
2518+
let mut rng = StdRng::seed_from_u64(123456);
2519+
let entropy = Bytes32::random_with_rng(&mut rng);
2520+
2521+
let mut document = doc_type
2522+
.random_document_with_identifier_and_entropy(
2523+
&mut rng,
2524+
identity.id(),
2525+
entropy,
2526+
DocumentFieldFillType::DoNotFillIfNotRequired,
2527+
DocumentFieldFillSize::AnyDocumentFillSize,
2528+
platform_version,
2529+
)
2530+
.expect("expected to create a random document");
2531+
2532+
// Set fields in the document
2533+
document.set("keyword", "meme".into());
2534+
document.set("contractId", Identifier::random().into());
2535+
2536+
// Create the transition
2537+
let documents_batch_create_transition =
2538+
BatchTransition::new_document_creation_transition_from_document(
2539+
document.clone(),
2540+
doc_type,
2541+
entropy.0,
2542+
&key,
2543+
1,
2544+
0,
2545+
None,
2546+
&signer,
2547+
platform_version,
2548+
None,
2549+
None,
2550+
None,
2551+
)
2552+
.expect("expect to create documents batch transition");
2553+
2554+
let documents_batch_create_serialized_transition = documents_batch_create_transition
2555+
.serialize_to_bytes()
2556+
.expect("expected documents batch serialized state transition");
2557+
2558+
// Start transaction and submit the transition
2559+
let transaction = platform.drive.grove.start_transaction();
2560+
2561+
let processing_result = platform
2562+
.platform
2563+
.process_raw_state_transitions(
2564+
&vec![documents_batch_create_serialized_transition],
2565+
&platform_state,
2566+
&BlockInfo::default(),
2567+
&transaction,
2568+
platform_version,
2569+
false,
2570+
None,
2571+
)
2572+
.expect("expected to process state transition");
2573+
2574+
println!("Processing result: {:?}", processing_result);
2575+
2576+
// Since the creationRestrictionMode is 2 (NoCreationAllowed), this should fail
2577+
assert_eq!(
2578+
processing_result.invalid_paid_count(),
2579+
1,
2580+
"Expected exactly 1 invalid paid transition"
2581+
);
2582+
2583+
platform
2584+
.drive
2585+
.grove
2586+
.commit_transaction(transaction)
2587+
.unwrap()
2588+
.expect("expected to commit transaction");
2589+
2590+
// Check the returned consensus error
2591+
let result = processing_result.into_execution_results().remove(0);
2592+
let PaidConsensusError(consensus_error, _) = result else {
2593+
panic!("expected a paid consensus error");
2594+
};
2595+
2596+
// Compare message to whatever your code sets for this error
2597+
assert_eq!(
2598+
consensus_error.to_string(),
2599+
format!(
2600+
"Document Creation on {}:{} is not allowed because of the document type's creation restriction mode No Creation Allowed",
2601+
search_contract.id().to_string(Encoding::Base58),
2602+
"contract"
2603+
),
2604+
"Mismatch in error message"
2605+
);
2606+
}
2607+
24712608
#[test]
24722609
fn test_document_creation_paid_with_a_token_burn() {
24732610
let platform_version = PlatformVersion::latest();

0 commit comments

Comments
 (0)