use crate::util::TestEnv;
#[test]
fn build_command_runs_init() {
TestEnv::from("soroban-init-boilerplate", |env| {
env.set_environments_toml(
r#"
development.accounts = [
{ name = "alice" },
{ name = "bob" },
]
[development.network]
rpc-url = "http://localhost:8000/rpc"
network-passphrase = "Standalone Network ; February 2017"
[development.contracts]
hello_world.client = false
soroban_increment_contract.client = false
soroban_custom_types_contract.client = false
soroban_auth_contract.client = false
[development.contracts.soroban_token_contract]
client = true
init = """
initialize --symbol ABND --decimal 7 --name abundance --admin alice
mint --amount 2000000 --to alice
"""
"#,
);
let output = env
.loam_env("development", true)
.output()
.expect("Failed to execute command");
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));
assert!(output.status.success());
assert!(String::from_utf8_lossy(&output.stderr)
.contains(" -- initialize --symbol ABND --decimal 7 --name abundance --admin alice"));
assert!(String::from_utf8_lossy(&output.stderr)
.contains(" -- mint --amount 2000000 --to alice"));
assert!(String::from_utf8_lossy(&output.stderr).contains(
"✅ Initialization script for \"soroban_token_contract\" completed successfully"
));
env.set_environments_toml(
r#"
development.accounts = [
{ name = "alice" },
{ name = "bob" },
]
[development.network]
rpc-url = "http://localhost:8000/rpc"
network-passphrase = "Standalone Network ; February 2017"
[development.contracts]
hello_world.client = false
soroban_increment_contract.client = false
soroban_custom_types_contract.client = false
soroban_auth_contract.client = false
[development.contracts.soroban_token_contract]
client = true
init = """
STELLAR_ACCOUNT=bob initialize --symbol ABND --decimal 7 --name abundance --admin bob
STELLAR_ACCOUNT=bob mint --amount 2000000 --to bob
"""
"#,
);
let output = env
.loam_env("development", true)
.output()
.expect("Failed to execute command");
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));
assert!(output.status.success());
assert!(String::from_utf8_lossy(&output.stderr)
.contains("--source-account bob -- initialize --symbol ABND --decimal 7 --name abundance --admin bob"));
assert!(String::from_utf8_lossy(&output.stderr)
.contains("--source-account bob -- mint --amount 2000000 --to bob"));
assert!(String::from_utf8_lossy(&output.stderr).contains(
"✅ Initialization script for \"soroban_token_contract\" completed successfully"
));
});
}
#[test]
fn init_handles_quotations_and_subcommands_in_script() {
TestEnv::from("soroban-init-boilerplate", |env| {
let binary_path = env
.find_binary("stellar")
.expect("Stellar binary not found. Test cannot proceed.");
let binary_path_str = binary_path.to_string_lossy();
env.set_environments_toml(&format!(
r#"
development.accounts = [
{{ name = "me" }},
]
[development.network]
rpc-url = "http://localhost:8000/rpc"
network-passphrase = "Standalone Network ; February 2017"
[development.contracts]
hello_world.client = false
soroban_increment_contract.client = false
soroban_auth_contract.client = false
soroban_token_contract.client = false
[development.contracts.soroban_custom_types_contract]
client = true
init = """
test_init --resolution 300000 --assets '[{{"Stellar": "$({} contract id asset --asset native)"}} ]' --decimals 14 --base '{{"Stellar":"$({} contract id asset --asset native)"}}'
"""
"#,
binary_path_str, binary_path_str
));
let output = env
.loam_env("development", true)
.output()
.expect("Failed to execute command");
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));
assert!(output.status.success());
assert!(
String::from_utf8_lossy(&output.stderr).contains(" -- test_init --resolution 300000")
);
assert!(String::from_utf8_lossy(&output.stderr).contains(
"✅ Initialization script for \"soroban_custom_types_contract\" completed successfully"
));
})
}
#[test]
fn init_scripts_run_in_specified_order() {
TestEnv::from("soroban-init-boilerplate", |env| {
let binary_path = env
.find_binary("stellar")
.expect("Stellar binary not found. Test cannot proceed.");
let binary_path_str = binary_path.to_string_lossy();
env.set_environments_toml(format!(
r#"
development.accounts = [
{{ name = "alice" }},
{{ name = "bob" }},
]
[development.network]
rpc-url = "http://localhost:8000/rpc"
network-passphrase = "Standalone Network ; February 2017"
[development.contracts]
hello_world.client = false
soroban_increment_contract.client = false
soroban_auth_contract.client = false
[development.contracts.soroban_custom_types_contract]
client = true
init = """
test_init --resolution 300000 --assets '[{{"Stellar": "$({} contract id asset --asset native)"}} ]' --decimals 14 --base '{{"Stellar":"$({} contract id asset --asset native)"}}'
"""
[development.contracts.soroban_token_contract]
client = true
init = """
STELLAR_ACCOUNT=bob initialize --symbol ABND --decimal 7 --name abundance --admin bob
STELLAR_ACCOUNT=bob mint --amount 2000000 --to bob
"""
"#,
binary_path_str, binary_path_str
));
let output = env
.loam_env("development", true)
.output()
.expect("Failed to execute command");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(output.status.success());
let custom_types_index = stderr
.find("Running initialization script for \"soroban_custom")
.expect("Custom types init not found");
let token_index = stderr
.find("Running initialization script for \"soroban_token")
.expect("Token init not found");
assert!(
custom_types_index < token_index,
"Custom types should be initialized before token"
);
env.set_environments_toml(format!(
r#"
development.accounts = [
{{ name = "alice" }},
{{ name = "bob" }},
]
[development.network]
rpc-url = "http://localhost:8000/rpc"
network-passphrase = "Standalone Network ; February 2017"
[development.contracts]
hello_world.client = false
soroban_increment_contract.client = false
soroban_auth_contract.client = false
[development.contracts.soroban_token_contract]
client = true
init = """
STELLAR_ACCOUNT=bob initialize --symbol ABND --decimal 7 --name abundance --admin bob
STELLAR_ACCOUNT=bob mint --amount 2000000 --to bob
"""
[development.contracts.soroban_custom_types_contract]
client = true
init = """
test_init --resolution 300000 --assets '[{{"Stellar": "$({} contract id asset --asset native)"}} ]' --decimals 14 --base '{{"Stellar":"$({} contract id asset --asset native)"}}'
"""
"#,
binary_path_str, binary_path_str));
let output = env
.loam_env("development", true)
.output()
.expect("Failed to execute command");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(output.status.success());
let token_index = stderr
.find("Running initialization script for \"soroban_token")
.expect("Token init not found");
let custom_types_index = stderr
.find("Running initialization script for \"soroban_custom")
.expect("Custom types init not found");
assert!(
token_index < custom_types_index,
"Token should be initialized before custom types"
);
})
}