From 17a71b7b59956f1a069fb4c8ae56a58f6f234e87 Mon Sep 17 00:00:00 2001
From: Karel van Klink <karel.vanklink@geant.org>
Date: Tue, 10 Oct 2023 13:43:39 +0200
Subject: [PATCH] add unit test for router termination workflow

---
 test/fixtures.py                              |  2 +-
 test/workflows/iptrunk/test_create_iptrunk.py |  2 +-
 test/workflows/router/test_create_router.py   | 26 ++++++------
 .../workflows/router/test_terminate_router.py | 41 +++++++++++++++++++
 4 files changed, 57 insertions(+), 14 deletions(-)
 create mode 100644 test/workflows/router/test_terminate_router.py

diff --git a/test/fixtures.py b/test/fixtures.py
index 1dcd2d79..3dfd2c11 100644
--- a/test/fixtures.py
+++ b/test/fixtures.py
@@ -86,7 +86,7 @@ def router_subscription_factory(site_subscription_factory, faker):
         router_is_ias_connected=True,
     ) -> UUIDstr:
         description = description or faker.text(max_nb_chars=30)
-        router_fqdn = router_fqdn or faker.domain_name()
+        router_fqdn = router_fqdn or faker.domain_name(levels=4)
         router_ts_port = router_ts_port or faker.random_int(min=1, max=49151)
         router_access_via_ts = router_access_via_ts or faker.boolean()
         router_lo_ipv4_address = router_lo_ipv4_address or ipaddress.IPv4Address(faker.ipv4())
diff --git a/test/workflows/iptrunk/test_create_iptrunk.py b/test/workflows/iptrunk/test_create_iptrunk.py
index dfded4f7..b9a1930e 100644
--- a/test/workflows/iptrunk/test_create_iptrunk.py
+++ b/test/workflows/iptrunk/test_create_iptrunk.py
@@ -15,7 +15,7 @@ from test.workflows import (
     extract_state,
     resume_workflow,
     run_workflow,
-    user_accept_and_assert_suspended
+    user_accept_and_assert_suspended,
 )
 
 
diff --git a/test/workflows/router/test_create_router.py b/test/workflows/router/test_create_router.py
index 2c7a8a47..7a8f65c5 100644
--- a/test/workflows/router/test_create_router.py
+++ b/test/workflows/router/test_create_router.py
@@ -15,7 +15,7 @@ from test.workflows import (
     extract_state,
     resume_workflow,
     run_workflow,
-    user_accept_and_assert_suspended
+    user_accept_and_assert_suspended,
 )
 
 
@@ -70,10 +70,18 @@ def test_create_router_success(
     mock_allocate_host.return_value = str(mock_v4), str(mock_v6)
     mock_allocate_v4_network.return_value = mock_v4_net
     mock_allocate_v6_network.return_value = faker.ipv6_network()
+
+    #  Run workflow
+    initial_router_data = [{"product": product_id}, router_creation_input_form_data]
+    result, process_stat, step_log = run_workflow("create_router", initial_router_data)
+    assert_suspended(result)
+
+    state = extract_state(result)
+    subscription_id = state["subscription_id"]
     mock_find_host_by_fqdn.return_value = objects.HostRecord(
         connector=None,
         aliases=[mock_fqdn],
-        comment=product_id,
+        comment=subscription_id,
         ipv4addrs=[
             objects.IPv4(
                 ipv4addr=str(mock_v4),
@@ -87,17 +95,12 @@ def test_create_router_success(
     )
     mock_find_network_by_cidr.return_value = objects.NetworkV4(
         connector=None,
-        comment=faker.sentence(),
+        comment=subscription_id,
         network=str(mock_v4_net),
         network_view="default",
         cidr=str(mock_v4_net),
     )
 
-    #  Run workflow
-    initial_router_data = [{"product": product_id}, router_creation_input_form_data]
-    result, process_stat, step_log = run_workflow("create_router", initial_router_data)
-    assert_suspended(result)
-
     lso_return = {
         "pp_run_results": {
             "status": "ok",
@@ -116,7 +119,6 @@ def test_create_router_success(
     assert_complete(result)
 
     state = extract_state(result)
-    subscription_id = state["subscription_id"]
     subscription = Router.from_subscription(subscription_id)
 
     assert "active" == subscription.status
@@ -126,6 +128,8 @@ def test_create_router_success(
     assert mock_netbox_create_device.call_count == 1
     assert mock_find_host_by_fqdn.call_count == 1
     assert mock_find_network_by_cidr.call_count == 3
+    for error in ["ipam_warning", "ipam_si_warning", "ipam_ias_lt_ipv4_warning", "ipam_ias_lt_ipv6_warning"]:
+        assert error not in state
 
 
 @pytest.mark.workflow
@@ -146,7 +150,7 @@ def test_create_router_lso_failure(
     mock_hostname_available,
     mock_netbox_create_device,
     mock_provision_router,
-        router_creation_input_form_data,
+    router_creation_input_form_data,
     faker,
 ):
     #  Set up mock return values
@@ -222,5 +226,3 @@ def test_create_router_lso_failure(
     assert mock_netbox_create_device.call_count == 0
     assert mock_find_host_by_fqdn.call_count == 0
     assert mock_find_network_by_cidr.call_count == 0
-    for error in ["ipam_warning", "ipam_si_warning", "ipam_ias_lt_ipv4_warning", "ipam_ias_lt_ipv6_warning"]:
-        assert error not in state
diff --git a/test/workflows/router/test_terminate_router.py b/test/workflows/router/test_terminate_router.py
new file mode 100644
index 00000000..f5e88ca7
--- /dev/null
+++ b/test/workflows/router/test_terminate_router.py
@@ -0,0 +1,41 @@
+from unittest.mock import patch
+
+import pytest
+
+from gso.products import Router
+from test.workflows import assert_complete, extract_state, run_workflow
+
+
+@pytest.fixture
+def router_termination_input_form_data(site_subscription_factory, faker):
+    return {"tt_number": faker.tt_number(), "remove_configuration": True, "clean_up_ipam": True}
+
+
+@pytest.mark.workflow
+@patch("gso.workflows.router.terminate_router.NetBoxClient.delete_device")
+@patch("gso.workflows.router.terminate_router.infoblox.delete_host_by_ip")
+@patch("gso.workflows.router.terminate_router.infoblox.delete_network")
+def test_terminate_router_success(
+    mock_delete_network,
+    mock_delete_host_by_ip,
+    mock_delete_device,
+    router_termination_input_form_data,
+    router_subscription_factory,
+    faker,
+):
+    #  Set up active subscription in database
+    product_id = router_subscription_factory()
+
+    #  Run workflow
+    initial_router_data = [{"subscription_id": product_id}, router_termination_input_form_data]
+    result, process_stat, step_log = run_workflow("terminate_router", initial_router_data)
+    assert_complete(result)
+
+    state = extract_state(result)
+    subscription_id = state["subscription_id"]
+    subscription = Router.from_subscription(subscription_id)
+
+    assert "terminated" == subscription.status
+    assert mock_delete_network.call_count == 3
+    assert mock_delete_device.call_count == 1
+    assert mock_delete_host_by_ip.call_count == 1
-- 
GitLab