Module connpy.tests.test_node_service

Functions

def test_list_nodes_case_sensitivity(populated_config)
Expand source code
def test_list_nodes_case_sensitivity(populated_config):
    """Test that filtering respects the case setting in config."""
    service = NodeService(populated_config)
    
    # Default case is False (case-insensitive)
    nodes = service.list_nodes(filter_str="ROUTER")
    assert "router1" in nodes

Test that filtering respects the case setting in config.

def test_list_nodes_dynamic_formatting(populated_config)
Expand source code
def test_list_nodes_dynamic_formatting(populated_config):
    """
    Test that list_nodes supports dynamic formatting for any node attribute.
    Regression: NodeService currently has hardcoded support for name, location, host.
    """
    service = NodeService(populated_config)
    
    # Try to format using 'user' and 'protocol' which are NOT in the hardcoded list
    # (name, location, host)
    format_str = "{name} -> {user}@{host} ({protocol})"
    
    # router1: host=10.0.0.1, user=admin, protocol=ssh
    # Expected: "router1 -> admin@10.0.0.1 (ssh)"
    
    formatted = service.list_nodes(filter_str="router1", format_str=format_str)
    
    assert len(formatted) == 1
    # This will FAIL if it only supports {name}, {location}, {host}
    assert formatted[0] == "router1 -> admin@10.0.0.1 (ssh)"

Test that list_nodes supports dynamic formatting for any node attribute. Regression: NodeService currently has hardcoded support for name, location, host.

def test_list_nodes_filtering_parity(populated_config)
Expand source code
def test_list_nodes_filtering_parity(populated_config):
    """
    Test that list_nodes uses literal 'in' logic instead of re.search.
    Regression: NodeService currently uses re.search in some versions, 
    but we want to ensure it uses literal 'in' for parity.
    """
    service = NodeService(populated_config)
    
    # If it uses 'in' logic, '1' should match all nodes containing '1'
    # router1, server1@office, db1@datacenter@office
    nodes = service.list_nodes(filter_str="1")
    assert len(nodes) == 3
    assert "router1" in nodes
    assert "server1@office" in nodes
    assert "db1@datacenter@office" in nodes

    # Test regex-specific characters. 
    # NodeService should use re.search, so '^router' will match 'router1'.
    nodes_regex = service.list_nodes(filter_str="^router")
    
    assert "router1" in nodes_regex

Test that list_nodes uses literal 'in' logic instead of re.search. Regression: NodeService currently uses re.search in some versions, but we want to ensure it uses literal 'in' for parity.

def test_node_editing_parity(populated_config)
Expand source code
def test_node_editing_parity(populated_config):
    """
    Test that add_node improperly raises NodeAlreadyExistsError when used for editing.
    Regression: connapp._mod calls add_node instead of update_node.
    """
    service = NodeService(populated_config)
    
    # router1 already exists in populated_config
    # We confirm that calling add_node with an existing ID raises NodeAlreadyExistsError
    # which is why connapp._mod (which calls add_node) is currently broken for editing.
    with pytest.raises(NodeAlreadyExistsError):
        service.add_node("router1", {"host": "1.1.1.1"})

Test that add_node improperly raises NodeAlreadyExistsError when used for editing. Regression: connapp._mod calls add_node instead of update_node.