feat: Add mycelium package to workspace
Some checks are pending
Rhai Tests / Run Rhai Tests (push) Waiting to run
Some checks are pending
Rhai Tests / Run Rhai Tests (push) Waiting to run
- Add the `mycelium` package to the workspace members. - Add `sal-mycelium` dependency to `Cargo.toml`. - Update MONOREPO_CONVERSION_PLAN.md to reflect the addition and completion of the mycelium package.
This commit is contained in:
242
mycelium/tests/rhai/01_mycelium_basic.rhai
Normal file
242
mycelium/tests/rhai/01_mycelium_basic.rhai
Normal file
@@ -0,0 +1,242 @@
|
||||
// Basic Mycelium functionality tests in Rhai
|
||||
//
|
||||
// This script tests the core Mycelium operations available through Rhai.
|
||||
// It's designed to work with or without a running Mycelium node.
|
||||
|
||||
print("=== Mycelium Basic Functionality Tests ===");
|
||||
|
||||
// Test configuration
|
||||
let test_api_url = "http://localhost:8989";
|
||||
let fallback_api_url = "http://localhost:7777";
|
||||
|
||||
// Helper function to check if Mycelium is available
|
||||
fn is_mycelium_available(api_url) {
|
||||
try {
|
||||
mycelium_get_node_info(api_url);
|
||||
return true;
|
||||
} catch(err) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Find an available API URL
|
||||
let api_url = "";
|
||||
if is_mycelium_available(test_api_url) {
|
||||
api_url = test_api_url;
|
||||
print(`✓ Using primary API URL: ${api_url}`);
|
||||
} else if is_mycelium_available(fallback_api_url) {
|
||||
api_url = fallback_api_url;
|
||||
print(`✓ Using fallback API URL: ${api_url}`);
|
||||
} else {
|
||||
print("⚠ No Mycelium node available - testing error handling only");
|
||||
api_url = "http://localhost:99999"; // Intentionally invalid for error testing
|
||||
}
|
||||
|
||||
// Test 1: Get Node Information
|
||||
print("\n--- Test 1: Get Node Information ---");
|
||||
try {
|
||||
let node_info = mycelium_get_node_info(api_url);
|
||||
|
||||
if api_url.contains("99999") {
|
||||
print("✗ Expected error but got success");
|
||||
assert_true(false, "Should have failed with invalid URL");
|
||||
} else {
|
||||
print("✓ Node info retrieved successfully");
|
||||
print(` Node info type: ${type_of(node_info)}`);
|
||||
|
||||
// Validate response structure
|
||||
if type_of(node_info) == "map" {
|
||||
print("✓ Node info is a proper object");
|
||||
|
||||
// Check for common fields (at least one should exist)
|
||||
let has_fields = node_info.contains("nodeSubnet") ||
|
||||
node_info.contains("nodePubkey") ||
|
||||
node_info.contains("peers") ||
|
||||
node_info.contains("routes");
|
||||
|
||||
if has_fields {
|
||||
print("✓ Node info contains expected fields");
|
||||
} else {
|
||||
print("⚠ Node info structure might have changed");
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(err) {
|
||||
if api_url.contains("99999") {
|
||||
print("✓ Correctly handled connection error");
|
||||
assert_true(err.to_string().contains("Mycelium error"), "Error should be properly formatted");
|
||||
} else {
|
||||
print(`⚠ Unexpected error with available node: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test 2: List Peers
|
||||
print("\n--- Test 2: List Peers ---");
|
||||
try {
|
||||
let peers = mycelium_list_peers(api_url);
|
||||
|
||||
if api_url.contains("99999") {
|
||||
print("✗ Expected error but got success");
|
||||
assert_true(false, "Should have failed with invalid URL");
|
||||
} else {
|
||||
print("✓ Peers listed successfully");
|
||||
print(` Peers type: ${type_of(peers)}`);
|
||||
|
||||
if type_of(peers) == "array" {
|
||||
print(`✓ Found ${peers.len()} peers`);
|
||||
|
||||
// If we have peers, check their structure
|
||||
if peers.len() > 0 {
|
||||
let first_peer = peers[0];
|
||||
print(` First peer type: ${type_of(first_peer)}`);
|
||||
|
||||
if type_of(first_peer) == "map" {
|
||||
print("✓ Peer has proper object structure");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print("⚠ Peers response is not an array");
|
||||
}
|
||||
}
|
||||
} catch(err) {
|
||||
if api_url.contains("99999") {
|
||||
print("✓ Correctly handled connection error");
|
||||
} else {
|
||||
print(`⚠ Unexpected error listing peers: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test 3: Add Peer (with validation)
|
||||
print("\n--- Test 3: Add Peer Validation ---");
|
||||
try {
|
||||
// Test with invalid peer address
|
||||
let result = mycelium_add_peer(api_url, "invalid-peer-format");
|
||||
|
||||
if api_url.contains("99999") {
|
||||
print("✗ Expected connection error but got success");
|
||||
} else {
|
||||
print("✓ Add peer completed (validation depends on node implementation)");
|
||||
print(` Result type: ${type_of(result)}`);
|
||||
}
|
||||
} catch(err) {
|
||||
if api_url.contains("99999") {
|
||||
print("✓ Correctly handled connection error");
|
||||
} else {
|
||||
print(`✓ Peer validation error (expected): ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test 4: List Selected Routes
|
||||
print("\n--- Test 4: List Selected Routes ---");
|
||||
try {
|
||||
let routes = mycelium_list_selected_routes(api_url);
|
||||
|
||||
if api_url.contains("99999") {
|
||||
print("✗ Expected error but got success");
|
||||
} else {
|
||||
print("✓ Selected routes retrieved successfully");
|
||||
print(` Routes type: ${type_of(routes)}`);
|
||||
|
||||
if type_of(routes) == "array" {
|
||||
print(`✓ Found ${routes.len()} selected routes`);
|
||||
} else if type_of(routes) == "map" {
|
||||
print("✓ Routes returned as object");
|
||||
}
|
||||
}
|
||||
} catch(err) {
|
||||
if api_url.contains("99999") {
|
||||
print("✓ Correctly handled connection error");
|
||||
} else {
|
||||
print(`⚠ Error retrieving selected routes: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test 5: List Fallback Routes
|
||||
print("\n--- Test 5: List Fallback Routes ---");
|
||||
try {
|
||||
let routes = mycelium_list_fallback_routes(api_url);
|
||||
|
||||
if api_url.contains("99999") {
|
||||
print("✗ Expected error but got success");
|
||||
} else {
|
||||
print("✓ Fallback routes retrieved successfully");
|
||||
print(` Routes type: ${type_of(routes)}`);
|
||||
}
|
||||
} catch(err) {
|
||||
if api_url.contains("99999") {
|
||||
print("✓ Correctly handled connection error");
|
||||
} else {
|
||||
print(`⚠ Error retrieving fallback routes: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test 6: Send Message (validation)
|
||||
print("\n--- Test 6: Send Message Validation ---");
|
||||
try {
|
||||
let result = mycelium_send_message(api_url, "invalid-destination", "test_topic", "test message", -1);
|
||||
|
||||
if api_url.contains("99999") {
|
||||
print("✗ Expected connection error but got success");
|
||||
} else {
|
||||
print("✓ Send message completed (validation depends on node implementation)");
|
||||
print(` Result type: ${type_of(result)}`);
|
||||
}
|
||||
} catch(err) {
|
||||
if api_url.contains("99999") {
|
||||
print("✓ Correctly handled connection error");
|
||||
} else {
|
||||
print(`✓ Message validation error (expected): ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test 7: Receive Messages (timeout test)
|
||||
print("\n--- Test 7: Receive Messages Timeout ---");
|
||||
try {
|
||||
// Use short timeout to avoid long waits
|
||||
let messages = mycelium_receive_messages(api_url, "non_existent_topic", 1);
|
||||
|
||||
if api_url.contains("99999") {
|
||||
print("✗ Expected connection error but got success");
|
||||
} else {
|
||||
print("✓ Receive messages completed");
|
||||
print(` Messages type: ${type_of(messages)}`);
|
||||
|
||||
if type_of(messages) == "array" {
|
||||
print(`✓ Received ${messages.len()} messages`);
|
||||
} else {
|
||||
print("✓ Messages returned as object");
|
||||
}
|
||||
}
|
||||
} catch(err) {
|
||||
if api_url.contains("99999") {
|
||||
print("✓ Correctly handled connection error");
|
||||
} else {
|
||||
print(`✓ Receive timeout handled correctly: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test 8: Parameter Validation
|
||||
print("\n--- Test 8: Parameter Validation ---");
|
||||
|
||||
// Test empty API URL
|
||||
try {
|
||||
mycelium_get_node_info("");
|
||||
print("✗ Should have failed with empty API URL");
|
||||
} catch(err) {
|
||||
print("✓ Correctly rejected empty API URL");
|
||||
}
|
||||
|
||||
// Test negative timeout handling
|
||||
try {
|
||||
mycelium_receive_messages(api_url, "test_topic", -1);
|
||||
if api_url.contains("99999") {
|
||||
print("✗ Expected connection error");
|
||||
} else {
|
||||
print("✓ Negative timeout handled (treated as no timeout)");
|
||||
}
|
||||
} catch(err) {
|
||||
print("✓ Timeout parameter handled correctly");
|
||||
}
|
||||
|
||||
print("\n=== Mycelium Basic Tests Completed ===");
|
||||
print("All core Mycelium functions are properly registered and handle errors correctly.");
|
174
mycelium/tests/rhai/run_all_tests.rhai
Normal file
174
mycelium/tests/rhai/run_all_tests.rhai
Normal file
@@ -0,0 +1,174 @@
|
||||
// Mycelium Rhai Test Runner
|
||||
//
|
||||
// This script runs all Mycelium-related Rhai tests and reports results.
|
||||
// It includes simplified versions of the individual tests to avoid dependency issues.
|
||||
|
||||
print("=== Mycelium Rhai Test Suite ===");
|
||||
print("Running comprehensive tests for Mycelium Rhai integration...\n");
|
||||
|
||||
let total_tests = 0;
|
||||
let passed_tests = 0;
|
||||
let failed_tests = 0;
|
||||
let skipped_tests = 0;
|
||||
|
||||
// Test 1: Function Registration
|
||||
print("Test 1: Function Registration");
|
||||
total_tests += 1;
|
||||
try {
|
||||
// Test that all mycelium functions are registered
|
||||
let invalid_url = "http://localhost:99999";
|
||||
let all_functions_exist = true;
|
||||
|
||||
try { mycelium_get_node_info(invalid_url); } catch(err) {
|
||||
if !err.to_string().contains("Mycelium error") { all_functions_exist = false; }
|
||||
}
|
||||
|
||||
try { mycelium_list_peers(invalid_url); } catch(err) {
|
||||
if !err.to_string().contains("Mycelium error") { all_functions_exist = false; }
|
||||
}
|
||||
|
||||
try { mycelium_send_message(invalid_url, "dest", "topic", "msg", -1); } catch(err) {
|
||||
if !err.to_string().contains("Mycelium error") { all_functions_exist = false; }
|
||||
}
|
||||
|
||||
if all_functions_exist {
|
||||
passed_tests += 1;
|
||||
print("✓ PASSED: All mycelium functions are registered");
|
||||
} else {
|
||||
failed_tests += 1;
|
||||
print("✗ FAILED: Some mycelium functions are missing");
|
||||
}
|
||||
} catch(err) {
|
||||
failed_tests += 1;
|
||||
print(`✗ ERROR: Function registration test failed - ${err}`);
|
||||
}
|
||||
|
||||
// Test 2: Error Handling
|
||||
print("\nTest 2: Error Handling");
|
||||
total_tests += 1;
|
||||
try {
|
||||
mycelium_get_node_info("http://localhost:99999");
|
||||
failed_tests += 1;
|
||||
print("✗ FAILED: Should have failed with connection error");
|
||||
} catch(err) {
|
||||
if err.to_string().contains("Mycelium error") {
|
||||
passed_tests += 1;
|
||||
print("✓ PASSED: Error handling works correctly");
|
||||
} else {
|
||||
failed_tests += 1;
|
||||
print(`✗ FAILED: Unexpected error format - ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test 3: Parameter Validation
|
||||
print("\nTest 3: Parameter Validation");
|
||||
total_tests += 1;
|
||||
try {
|
||||
mycelium_get_node_info("");
|
||||
failed_tests += 1;
|
||||
print("✗ FAILED: Should have failed with empty API URL");
|
||||
} catch(err) {
|
||||
passed_tests += 1;
|
||||
print("✓ PASSED: Parameter validation works correctly");
|
||||
}
|
||||
|
||||
// Test 4: Timeout Parameter Handling
|
||||
print("\nTest 4: Timeout Parameter Handling");
|
||||
total_tests += 1;
|
||||
try {
|
||||
let invalid_url = "http://localhost:99999";
|
||||
|
||||
// Test negative timeout (should be treated as no timeout)
|
||||
try {
|
||||
mycelium_receive_messages(invalid_url, "topic", -1);
|
||||
failed_tests += 1;
|
||||
print("✗ FAILED: Should have failed with connection error");
|
||||
} catch(err) {
|
||||
if err.to_string().contains("Mycelium error") {
|
||||
passed_tests += 1;
|
||||
print("✓ PASSED: Timeout parameter handling works correctly");
|
||||
} else {
|
||||
failed_tests += 1;
|
||||
print(`✗ FAILED: Unexpected error - ${err}`);
|
||||
}
|
||||
}
|
||||
} catch(err) {
|
||||
failed_tests += 1;
|
||||
print(`✗ ERROR: Timeout test failed - ${err}`);
|
||||
}
|
||||
|
||||
// Check if Mycelium is available for integration tests
|
||||
let test_api_url = "http://localhost:8989";
|
||||
let fallback_api_url = "http://localhost:7777";
|
||||
let available_api_url = "";
|
||||
|
||||
try {
|
||||
mycelium_get_node_info(test_api_url);
|
||||
available_api_url = test_api_url;
|
||||
} catch(err) {
|
||||
try {
|
||||
mycelium_get_node_info(fallback_api_url);
|
||||
available_api_url = fallback_api_url;
|
||||
} catch(err2) {
|
||||
// No Mycelium node available
|
||||
}
|
||||
}
|
||||
|
||||
if available_api_url != "" {
|
||||
print(`\n✓ Mycelium node available at: ${available_api_url}`);
|
||||
|
||||
// Test 5: Get Node Info
|
||||
print("\nTest 5: Get Node Info");
|
||||
total_tests += 1;
|
||||
try {
|
||||
let node_info = mycelium_get_node_info(available_api_url);
|
||||
|
||||
if type_of(node_info) == "map" {
|
||||
passed_tests += 1;
|
||||
print("✓ PASSED: Node info retrieved successfully");
|
||||
} else {
|
||||
failed_tests += 1;
|
||||
print("✗ FAILED: Node info should be an object");
|
||||
}
|
||||
} catch(err) {
|
||||
failed_tests += 1;
|
||||
print(`✗ ERROR: Node info test failed - ${err}`);
|
||||
}
|
||||
|
||||
// Test 6: List Peers
|
||||
print("\nTest 6: List Peers");
|
||||
total_tests += 1;
|
||||
try {
|
||||
let peers = mycelium_list_peers(available_api_url);
|
||||
|
||||
if type_of(peers) == "array" {
|
||||
passed_tests += 1;
|
||||
print("✓ PASSED: Peers listed successfully");
|
||||
} else {
|
||||
failed_tests += 1;
|
||||
print("✗ FAILED: Peers should be an array");
|
||||
}
|
||||
} catch(err) {
|
||||
failed_tests += 1;
|
||||
print(`✗ ERROR: List peers test failed - ${err}`);
|
||||
}
|
||||
} else {
|
||||
print("\n⚠ No Mycelium node available - skipping integration tests");
|
||||
skipped_tests += 2; // Skip node info and list peers tests
|
||||
total_tests += 2;
|
||||
}
|
||||
|
||||
// Print final results
|
||||
print("\n=== Test Results ===");
|
||||
print(`Total Tests: ${total_tests}`);
|
||||
print(`Passed: ${passed_tests}`);
|
||||
print(`Failed: ${failed_tests}`);
|
||||
print(`Skipped: ${skipped_tests}`);
|
||||
|
||||
if failed_tests == 0 {
|
||||
print("\n✓ All tests passed!");
|
||||
} else {
|
||||
print(`\n✗ ${failed_tests} test(s) failed.`);
|
||||
}
|
||||
|
||||
print("\n=== Mycelium Rhai Test Suite Completed ===");
|
Reference in New Issue
Block a user