diff --git a/test/cli/test_imports.py b/test/cli/test_imports.py index 7e9d6cd0ec653e983fc540ac08d6ba85764a3791..3953804d3612781c336d71355e480fea8cf5ba20 100644 --- a/test/cli/test_imports.py +++ b/test/cli/test_imports.py @@ -1,9 +1,8 @@ import json from pathlib import Path +from unittest.mock import patch import pytest -from orchestrator.db import SubscriptionTable -from orchestrator.services.subscriptions import retrieve_subscription_by_subscription_instance_value from gso.cli.imports import ( import_iptrunks, @@ -12,15 +11,10 @@ from gso.cli.imports import ( import_sites, import_super_pop_switches, ) -from gso.products import ProductType, Router, Site +from gso.products import Router, Site from gso.products.product_blocks.iptrunk import IptrunkType, PhysicalPortCapacity from gso.products.product_blocks.router import RouterRole from gso.products.product_blocks.site import SiteTier -from gso.services.subscriptions import ( - get_active_iptrunk_subscriptions, - get_active_router_subscriptions, - get_subscriptions, -) from gso.utils.helpers import iso_from_ipv4 from gso.utils.shared_enums import Vendor @@ -186,34 +180,31 @@ def office_router_data(temp_file, faker, site_subscription_factory): ########### -@pytest.mark.workflow() -def test_import_iptrunk_success(iptrunk_data): - assert len(get_active_iptrunk_subscriptions()) == 0 +@patch("gso.cli.imports.start_process") +def test_import_iptrunk_success(mock_start_process, iptrunk_data): import_iptrunks(iptrunk_data()["path"]) + assert mock_start_process.call_count == 1 - assert len(get_subscriptions([ProductType.IMPORTED_IP_TRUNK])) == 0 - assert len(get_active_iptrunk_subscriptions()) == 1 +@patch("gso.cli.imports.start_process") +def test_import_site_success(mock_start_process, site_data): + import_sites(site_data()["path"]) + assert mock_start_process.call_count == 1 -@pytest.mark.workflow() -def test_import_site_success(site_data): - assert SubscriptionTable.query.all() == [] - mock_site_data = site_data() - import_sites(mock_site_data["path"]) - assert len(get_subscriptions([ProductType.IMPORTED_SITE])) == 0 - subscription = retrieve_subscription_by_subscription_instance_value( - resource_type="site_name", value=mock_site_data["data"]["site_name"] +@patch("gso.cli.imports.start_process") +def test_import_site_twice(mock_start_process, site_data, site_subscription_factory, capfd): + site_import_data = site_data() + # Create an initial site + site_subscription_factory( + site_bgp_community_id=site_import_data["data"]["site_bgp_community_id"], + site_internal_id=site_import_data["data"]["site_internal_id"], + site_ts_address=site_import_data["data"]["site_ts_address"], + site_name=site_import_data["data"]["site_name"], ) - assert subscription is not None - -@pytest.mark.workflow() -def test_import_site_twice(site_data, capfd): - path_location = site_data()["path"] - import_sites(path_location) # Second identical import should print ValidationError to stdout - import_sites(path_location) + import_sites(site_import_data["path"]) out, _ = capfd.readouterr() assert ( @@ -228,15 +219,14 @@ site_name site_name must be unique (type=value_error)""" in out ) - assert SubscriptionTable.query.count() == 1 + assert mock_start_process.call_count == 0 -@pytest.mark.workflow() -def test_import_site_with_invalid_data(site_data, capfd): +@patch("gso.cli.imports.start_process") +def test_import_site_with_invalid_data(mock_start_process, site_data, capfd): # invalid data, missing site_latitude and invalid site_longitude incorrect_site_data = site_data(site_latitude=None, site_longitude="broken") - assert SubscriptionTable.query.count() == 0 import_sites(incorrect_site_data["path"]) out, _ = capfd.readouterr() @@ -248,24 +238,20 @@ site_longitude value is not a valid float (type=type_error.float)""" in out ) - assert SubscriptionTable.query.count() == 0 + assert mock_start_process.call_count == 0 -@pytest.mark.workflow() -def test_import_router_success(site_subscription_factory, router_data): - assert SubscriptionTable.query.count() == 0 +@patch("gso.cli.imports.start_process") +def test_import_router_success(mock_start_process, site_subscription_factory, router_data): import_routers(router_data()["path"]) - - assert len(get_active_router_subscriptions()) == 1 + assert mock_start_process.call_count == 1 -@pytest.mark.workflow() -def test_import_router_with_invalid_data(router_data, capfd): +@patch("gso.cli.imports.start_process") +def test_import_router_with_invalid_data(mock_start_process, router_data, capfd): broken_data = router_data(hostname="", router_lo_ipv6_address="Not an IP address") import_routers(broken_data["path"]) - # Only a Site has been added, no Router - assert SubscriptionTable.query.count() == 1 out, _ = capfd.readouterr() # The extra space at the end of the next line is required, and not dangling by accident. assert "Validation error: 1 validation error for RouterImportModel" in out @@ -274,25 +260,21 @@ def test_import_router_with_invalid_data(router_data, capfd): value is not a valid IPv6 address (type=value_error.ipv6address)""" in out ) + assert mock_start_process.call_count == 0 -@pytest.mark.workflow() -def test_import_iptrunk_successful(iptrunk_data): - assert SubscriptionTable.query.count() == 0 +@patch("gso.cli.imports.start_process") +def test_import_iptrunk_successful(mock_start_process, iptrunk_data): import_iptrunks(iptrunk_data()["path"]) + assert mock_start_process.call_count == 1 - assert SubscriptionTable.query.count() == 5 - assert len(get_active_iptrunk_subscriptions()) == 1 - -@pytest.mark.workflow() -def test_import_iptrunk_invalid_router_id_side_a_and_b(iptrunk_data, capfd): +@patch("gso.cli.imports.start_process") +def test_import_iptrunk_invalid_router_id_side_a_and_b(mock_start_process, iptrunk_data, capfd): broken_data = iptrunk_data(side_a_node="Doesn't exist", side_b_node="Also doesn't exist") import_iptrunks(broken_data["path"]) out, _ = capfd.readouterr() - assert SubscriptionTable.query.count() == 4 - assert len(get_active_iptrunk_subscriptions()) == 0 assert ( """Validation error: 2 validation errors for IptrunkImportModel side_a_node_id @@ -301,10 +283,11 @@ side_b_node_id Router not found (type=value_error)""" in out ) + assert mock_start_process.call_count == 0 -@pytest.mark.workflow() -def test_import_iptrunk_non_unique_members_side_a_and_b(iptrunk_data, faker, capfd): +@patch("gso.cli.imports.start_process") +def test_import_iptrunk_non_unique_members_side_a_and_b(mock_start_process, iptrunk_data, faker, capfd): duplicate_interface = {"interface_name": faker.network_interface(), "interface_description": faker.sentence()} side_a_members = [duplicate_interface for _ in range(5)] side_b_members = [duplicate_interface for _ in range(5)] @@ -312,8 +295,6 @@ def test_import_iptrunk_non_unique_members_side_a_and_b(iptrunk_data, faker, cap import_iptrunks(broken_data["path"]) out, _ = capfd.readouterr() - assert SubscriptionTable.query.count() == 4 - assert len(get_active_iptrunk_subscriptions()) == 0 assert ( """Validation error: 3 validation errors for IptrunkImportModel side_a_ae_members @@ -322,10 +303,11 @@ side_b_ae_members Items must be unique (type=value_error)""" in out ) + assert mock_start_process.call_count == 0 -@pytest.mark.workflow() -def test_import_iptrunk_side_a_member_count_mismatch(iptrunk_data, faker, capfd): +@patch("gso.cli.imports.start_process") +def test_import_iptrunk_side_a_member_count_mismatch(mock_start_process, iptrunk_data, faker, capfd): side_a_members = [ {"interface_name": faker.network_interface(), "interface_description": faker.sentence()} for _ in range(5) ] @@ -336,31 +318,22 @@ def test_import_iptrunk_side_a_member_count_mismatch(iptrunk_data, faker, capfd) import_iptrunks(broken_data["path"]) out, _ = capfd.readouterr() - assert SubscriptionTable.query.count() == 4 - assert len(get_active_iptrunk_subscriptions()) == 0 assert ( """Validation error: 1 validation error for IptrunkImportModel __root__ Mismatch between Side A and B members (type=value_error)""" in out ) + assert mock_start_process.call_count == 0 -@pytest.mark.workflow() -def test_import_office_router_success(office_router_data): - assert SubscriptionTable.query.count() == 0 +@patch("gso.cli.imports.start_process") +def test_import_office_router_success(mock_start_process, office_router_data): import_office_routers(office_router_data()["path"]) - - assert SubscriptionTable.query.count() == 2 - assert len(get_subscriptions([ProductType.IMPORTED_OFFICE_ROUTER])) == 0 - assert len(get_subscriptions([ProductType.OFFICE_ROUTER])) == 1 + assert mock_start_process.call_count == 1 -@pytest.mark.workflow() -def test_import_super_pop_switch_success(super_pop_switch_data): - assert SubscriptionTable.query.count() == 0 +@patch("gso.cli.imports.start_process") +def test_import_super_pop_switch_success(mock_start_process, super_pop_switch_data): import_super_pop_switches(super_pop_switch_data()["path"]) - - assert SubscriptionTable.query.count() == 2 - assert len(get_subscriptions([ProductType.IMPORTED_SUPER_POP_SWITCH])) == 0 - assert len(get_subscriptions([ProductType.SUPER_POP_SWITCH])) == 1 + assert mock_start_process.call_count == 1