product-os-command-control 0.0.29

Product OS : Command and Control provides a set of tools for running command and control across a distributed set of Product OS : Servers.
Documentation
// Unit tests for registry module - Node struct

#[allow(deprecated)]
use product_os_command_control::Node;
use std::collections::BTreeMap;

mod test_helpers;
use test_helpers::{create_test_certificates, create_test_configuration};

#[test]
fn test_node_creation() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    
    assert!(!node.get_identifier().is_empty());
    assert_eq!(node.try_get_protocol(), Some("https".to_string()));
    assert_eq!(node.get_failures(), 0);
}

#[test]
fn test_node_deprecated_default_still_works() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    #[allow(deprecated)]
    let node = Node::default(&config, certs);
    
    assert!(!node.get_identifier().is_empty());
}

#[test]
fn test_node_identifier_is_uuid() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    let identifier = node.get_identifier();
    
    // UUID should be 36 characters with dashes
    assert_eq!(identifier.len(), 36);
    assert_eq!(identifier.matches('-').count(), 4);
}

#[test]
fn test_node_process_id() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    let pid = node.get_process_id();
    
    // Process ID should be non-zero (current process)
    assert!(pid > 0);
}

#[test]
fn test_node_certificate() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    let cert_data = certs.certificates[0].clone();
    
    let node = Node::new(&config, certs);
    let node_cert = node.get_certificate();
    
    assert_eq!(node_cert, cert_data);
}

#[test]
fn test_node_match_feature() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    
    // Node doesn't have any features initially, so should not match
    let matched = node.match_node("feature", "test-feature");
    assert!(!matched);
}

#[test]
fn test_node_match_capability_empty() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    
    // Node has no capabilities initially - should NOT match any capability query
    let matched = node.match_node("capability", "test-capability");
    assert!(!matched);
}

#[test]
fn test_node_match_query_empty() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    let query = BTreeMap::new();
    
    // Empty query should match
    let matched = node.match_node_query(&query);
    assert!(matched);
}

#[test]
fn test_node_match_query_with_criteria() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    
    let mut query = BTreeMap::new();
    query.insert("feature", "nonexistent");
    
    // Should not match since feature doesn't exist
    let matched = node.match_node_query(&query);
    assert!(!matched);
}

#[test]
fn test_node_match_unknown_selector_passes() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    
    // Unknown selectors should pass (return true)
    let matched = node.match_node("unknown_selector", "any_value");
    assert!(matched);
}

#[test]
fn test_node_timestamps() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    
    let created = node.get_created_at();
    let updated = node.get_last_updated_at();
    
    // Timestamps should be set
    assert!(created <= updated);
}

#[test]
fn test_node_features_empty() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    let _features = node.get_features();
    
    // Verify we can access the features reference without issues
    // The features collection exists but is empty
}

#[test]
fn test_node_services_empty() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    let services = node.get_services();
    
    // Should have services collection
    assert_eq!(services.list().len(), 0);
}

#[test]
fn test_node_try_get_address() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    let address = node.try_get_address();
    
    assert!(address.is_some());
    let uri = address.unwrap();
    assert_eq!(uri.scheme().map(|s| s.as_str()), Some("https"));
    assert_eq!(uri.host(), Some("localhost"));
}

#[test]
fn test_node_try_get_protocol() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    
    assert_eq!(node.try_get_protocol(), Some("https".to_string()));
}

#[test]
fn test_node_address_parsing_deprecated() {
    let config = create_test_configuration();
    let certs = create_test_certificates();
    
    let node = Node::new(&config, certs);
    #[allow(deprecated)]
    let address = node.get_address();
    
    assert_eq!(address.scheme().map(|s| s.as_str()), Some("https"));
    assert_eq!(address.host(), Some("localhost"));
}