def test_nested_dependency_delete_resolution(dependency_conf):
    fake_resolution = MagicMock()
    fake_dependency = MagicMock()
    fake_dependency.get_resolve.return_value = fake_resolution
    fake_dependency.get_value.return_value = iter(["/Common/vlan"])
    fake_dependency.get_target_value.return_value = iter(["/Common/vlan"])
    matrix = [
        dp.NestedDependency(
            child_types=[("security", "nat", "policy")],
            field_name="next-hop",
            dependency=fake_dependency,
            parent_types=[("net", "vlan")],
            resolution="delete",
        )
    ]

    deps = dp.DependencyMap(dependency_conf, matrix)

    assert (
        "next-hop"
        in dependency_conf.fields["security nat policy /Common/policy"].fields
    )
    deps.apply_resolution(
        dependency_conf, "security nat policy /Common/policy", "net vlan /Common/vlan"
    )
    fake_resolution.assert_not_called()
    assert (
        "next-hop"
        not in dependency_conf.fields["security nat policy /Common/policy"].fields
    )
def test_subcollection_dependency_delete_resolution(dependency_conf):
    fake_resolution = MagicMock()
    fake_dependency = MagicMock()
    fake_dependency.get_resolve.return_value = fake_resolution
    fake_dependency.get_value.return_value = iter(["/Common/tcp_custom"])
    fake_dependency.get_target_value.return_value = iter(["/Common/tcp_custom"])
    matrix = [
        dp.SubCollectionDependency(
            child_types=[("ltm", "pool")],
            field_name="members",
            parent_types=[("ltm", "monitor")],
            dependency=fake_dependency,
            resolution="delete",
        )
    ]

    deps = dp.DependencyMap(dependency_conf, matrix)

    assert "members" in dependency_conf.fields["ltm pool /Common/test_pool2"].fields
    deps.apply_resolution(
        dependency_conf,
        "ltm pool /Common/test_pool2",
        "ltm monitor tcp /Common/tcp_custom",
    )
    fake_resolution.assert_not_called()
    assert "members" not in dependency_conf.fields["ltm pool /Common/test_pool2"].fields
def test_subcollection_dependency_nested_resolution(dependency_conf):

    fake_resolution = MagicMock()
    fake_dependency = MagicMock()
    fake_dependency.get_resolve.return_value = fake_resolution
    fake_dependency.get_value.side_effect = lambda x: iter(["/Common/tcp_custom"])
    fake_dependency.get_target_value.side_effect = lambda x: iter(
        ["/Common/tcp_custom"]
    )
    matrix = [
        dp.SubCollectionDependency(
            child_types=[("ltm", "pool")],
            field_name="members",
            parent_types=[("ltm", "monitor")],
            dependency=fake_dependency,
        )
    ]

    deps = dp.DependencyMap(dependency_conf, matrix)

    deps.apply_resolution(
        dependency_conf,
        "ltm pool /Common/test_pool2",
        "ltm monitor tcp /Common/tcp_custom",
    )
    fake_dependency.get_resolve.assert_called()
    fake_resolution.assert_called()
    assert fake_resolution.call_count == 2  # one for each member
def test_field_value_to_field_value_dependency_delete_child_resolution(dependency_conf):

    matrix = [
        dp.FieldValueToFieldValueDependency(
            child_types=[("ltm", "pool_member")],
            field_name="address",
            parent_types=[("ltm", "node")],
            target_field_name="address",
        )
    ]

    deps = dp.DependencyMap(dependency_conf, matrix)

    assert (
        "address"
        in dependency_conf.fields["ltm pool_member /Common/test_member"].fields
    )
    deps.apply_resolution(
        dependency_conf,
        "ltm pool_member /Common/test_member",
        "ltm node /Common/test_node",
    )
    assert (
        "address"
        not in dependency_conf.fields["ltm pool_member /Common/test_member"].fields
    )
def test_name_to_name_dependency_resolution(dependency_conf):

    matrix = [
        dp.NameToNameDependency(
            child_types=[("net", "fdb", "vlan")], parent_types=[("net", "vlan")]
        )
    ]

    deps = dp.DependencyMap(dependency_conf, matrix)

    assert "net fdb vlan /Common/vlan" in dependency_conf.fields
    deps.apply_resolution(
        dependency_conf, "net fdb vlan /Common/vlan", "net vlan /Common/vlan"
    )
    assert "net fdb vlan /Common/vlan" not in dependency_conf.fields
def test_field_value_to_name_dependency_resolution(dependency_conf):

    matrix = [
        dp.FieldValueToNameDependency(
            child_types=[("ltm", "pool")],
            field_name="monitor",
            parent_types=[("ltm", "monitor")],
        )
    ]

    deps = dp.DependencyMap(dependency_conf, matrix)

    assert "monitor" in dependency_conf.fields["ltm pool /Common/test_pool"].fields
    deps.apply_resolution(
        dependency_conf,
        "ltm pool /Common/test_pool",
        "ltm monitor tcp /Common/tcp_custom",
    )
    assert "monitor" not in dependency_conf.fields["ltm pool /Common/test_pool"].fields
def test_two_objects_multiple_dependencies_resolutions(dependency_conf):
    matrix = [
        dp.FieldValueToFieldValueDependency(
            child_types=[("cm", "device")],
            field_name="mirror-ip",
            parent_types=[("net", "self")],
            target_field_name="address",
        ),
        dp.FieldValueToFieldValueDependency(
            child_types=[("cm", "device")],
            field_name="multicast-ip",
            parent_types=[("net", "self")],
            target_field_name="address",
        ),
    ]

    deps = dp.DependencyMap(dependency_conf, matrix)

    assert "mirror-ip" in dependency_conf.fields["cm device bigip1"].fields
    assert "multicast-ip" in dependency_conf.fields["cm device bigip1"].fields
    deps.apply_resolution(dependency_conf, "cm device bigip1", "net self test-self")
    assert "mirror-ip" not in dependency_conf.fields["cm device bigip1"].fields
    assert "multicast-ip" not in dependency_conf.fields["cm device bigip1"].fields
def test_subcollection_dependency_nested_with_cleanup_resolution(dependency_conf):
    matrix = [
        dp.SubCollectionDependency(
            child_types=[("net", "vlan")],
            field_name="interfaces",
            dependency=dp.FieldKeyToNameDependency(),
            parent_types=[("net", "trunk")],
            resolution="nested_with_cleanup",
        ),
    ]

    deps = dp.DependencyMap(dependency_conf, matrix)
    assert "interfaces" in dependency_conf.fields["net vlan /Common/vlan"].fields
    deps.apply_resolution(
        dependency_conf, "net vlan /Common/vlan", "net trunk test-trunk"
    )
    assert "interfaces" in dependency_conf.fields["net vlan /Common/vlan"].fields

    assert "interfaces" in dependency_conf.fields["net vlan /Common/vlan2"].fields
    deps.apply_resolution(
        dependency_conf, "net vlan /Common/vlan2", "net trunk test-trunk"
    )
    assert "interfaces" not in dependency_conf.fields["net vlan /Common/vlan2"].fields
def test_resolution_created_for_all_dependencies(dependency_conf):
    deps = dp.DependencyMap(dependency_conf)
    for id_from, list_to in deps.reverse.items():
        for id_to in list_to:
            assert (id_to, id_from) in deps.resolutions