diff --git a/test/conftest.py b/test/conftest.py index c9859e8c5fed66a2fd9e2256d2f8bf720c79b639..34c6a3dd088d125882ef5cf6097da8113ae5cc08 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -53,6 +53,12 @@ class FakerProvider(BaseProvider): return f"TT#{random_date}{random_int}" + def geant_gid(self) -> str: + return self.generator.numerify("GID-#####") + + def geant_sid(self) -> str: + return self.generator.numerify("SID-#####") + @pytest.fixture(scope="session") def faker() -> Faker: diff --git a/test/fixtures.py b/test/fixtures.py index 3dfd2c11be754315c40f3c70fb4a8e79eca96dc1..49fc410913723a01e6bac9d185c4cf3ec76def51 100644 --- a/test/fixtures.py +++ b/test/fixtures.py @@ -6,11 +6,14 @@ from orchestrator.domain import SubscriptionModel from orchestrator.types import SubscriptionLifecycle, UUIDstr from gso.products import ProductType +from gso.products.product_blocks.iptrunk import IptrunkSideBlock, IptrunkType from gso.products.product_blocks.router import RouterRole, RouterVendor from gso.products.product_blocks.site import SiteTier -from gso.products.product_types.router import RouterInactive +from gso.products.product_types.iptrunk import IptrunkInactive +from gso.products.product_types.router import Router, RouterInactive from gso.products.product_types.site import Site, SiteInactive from gso.services import subscriptions +from gso.utils.types.phy_port import PhyPortCapacity CUSTOMER_ID: UUIDstr = "2f47f65a-0911-e511-80d0-005056956c1a" @@ -122,3 +125,85 @@ def router_subscription_factory(site_subscription_factory, faker): return str(router_subscription.subscription_id) return subscription_create + + +@pytest.fixture +def iptrunk_side_subscription_factory(router_subscription_factory, faker): + def subscription_create( + iptrunk_side_node=None, + iptrunk_side_ae_iface=None, + iptrunk_side_ae_geant_a_sid=None, + iptrunk_side_ae_members=None, + iptrunk_side_ae_members_description=None, + ) -> IptrunkSideBlock: + iptrunk_side_node_id = iptrunk_side_node or router_subscription_factory() + iptrunk_side_node = Router.from_subscription(iptrunk_side_node_id).router + iptrunk_side_ae_iface = iptrunk_side_ae_iface or faker.pystr() + iptrunk_side_ae_geant_a_sid = iptrunk_side_ae_geant_a_sid or faker.geant_sid() + iptrunk_side_ae_members = iptrunk_side_ae_members or ["ge-0/0/0", "ge-0/0/1"] + iptrunk_side_ae_members_description = iptrunk_side_ae_members_description or [ + faker.sentence(), + faker.sentence(), + ] + + return IptrunkSideBlock.new( + faker.uuid4(), + iptrunk_side_node=iptrunk_side_node, + iptrunk_side_ae_iface=iptrunk_side_ae_iface, + iptrunk_side_ae_geant_a_sid=iptrunk_side_ae_geant_a_sid, + iptrunk_side_ae_members=iptrunk_side_ae_members, + iptrunk_side_ae_members_description=iptrunk_side_ae_members_description, + ) + + return subscription_create + + +@pytest.fixture +def iptrunk_subscription_factory(iptrunk_side_subscription_factory, faker): + def subscription_create( + description=None, + start_date="2023-05-24T00:00:00+00:00", + geant_s_sid=None, + iptrunk_description=None, + iptrunk_type=IptrunkType.DARK_FIBER, + iptrunk_speed=PhyPortCapacity.ONE_GIGABIT_PER_SECOND, + iptrunk_isis_metric=None, + iptrunk_ipv4_network=None, + iptrunk_ipv6_network=None, + iptrunk_sides=None, + ) -> UUIDstr: + product_id = subscriptions.get_product_id_by_name(ProductType.IP_TRUNK) + description = description or faker.sentence() + + geant_s_sid = geant_s_sid or faker.geant_sid() + iptrunk_description = iptrunk_description or faker.sentence() + iptrunk_isis_metric = iptrunk_isis_metric or faker.pyint() + iptrunk_ipv4_network = iptrunk_ipv4_network or faker.ipv4_network() + iptrunk_ipv6_network = iptrunk_ipv6_network or faker.ipv6_network() + iptrunk_minimum_links = 1 + iptrunk_side_a = iptrunk_side_subscription_factory() + iptrunk_side_b = iptrunk_side_subscription_factory() + iptrunk_sides = iptrunk_sides or [iptrunk_side_a, iptrunk_side_b] + + iptrunk_subscription = IptrunkInactive.from_product_id(product_id, customer_id=CUSTOMER_ID, insync=True) + iptrunk_subscription.iptrunk.geant_s_sid = geant_s_sid + iptrunk_subscription.iptrunk.iptrunk_description = iptrunk_description + iptrunk_subscription.iptrunk.iptrunk_type = iptrunk_type + iptrunk_subscription.iptrunk.iptrunk_speed = iptrunk_speed + iptrunk_subscription.iptrunk.iptrunk_minimum_links = iptrunk_minimum_links + iptrunk_subscription.iptrunk.iptrunk_isis_metric = iptrunk_isis_metric + iptrunk_subscription.iptrunk.iptrunk_ipv4_network = iptrunk_ipv4_network + iptrunk_subscription.iptrunk.iptrunk_ipv6_network = iptrunk_ipv6_network + iptrunk_subscription.iptrunk.iptrunk_sides = iptrunk_sides + + iptrunk_subscription = SubscriptionModel.from_other_lifecycle( + iptrunk_subscription, SubscriptionLifecycle.ACTIVE + ) + iptrunk_subscription.description = description + iptrunk_subscription.start_date = start_date + iptrunk_subscription.save() + db.session.commit() + + return str(iptrunk_subscription.subscription_id) + + return subscription_create diff --git a/test/imports/conftest.py b/test/imports/conftest.py index 425a0e627a4592241e2c3f81cce910255dd34a5e..4a3e9c07a0c70ef31069d0f624c7437553562a16 100644 --- a/test/imports/conftest.py +++ b/test/imports/conftest.py @@ -1 +1,6 @@ -from test.fixtures import router_subscription_factory, site_subscription_factory # noqa +from test.fixtures import ( # noqa + iptrunk_side_subscription_factory, + iptrunk_subscription_factory, + router_subscription_factory, + site_subscription_factory, +) diff --git a/test/workflows/conftest.py b/test/workflows/conftest.py index 6e6630890466c6a1f3d1d63000eefff387927472..a4b71a738da3818674500075dd7ce910e2c17382 100644 --- a/test/workflows/conftest.py +++ b/test/workflows/conftest.py @@ -1,7 +1,12 @@ import pytest from urllib3_mock import Responses -from test.fixtures import router_subscription_factory, site_subscription_factory # noqa +from test.fixtures import ( # noqa + iptrunk_side_subscription_factory, + iptrunk_subscription_factory, + router_subscription_factory, + site_subscription_factory, +) @pytest.fixture(autouse=True) diff --git a/test/workflows/iptrunk/test_modify_isis_metric.py b/test/workflows/iptrunk/test_modify_isis_metric.py new file mode 100644 index 0000000000000000000000000000000000000000..521d6d2739f821b1d923aea06966736cb4722a4e --- /dev/null +++ b/test/workflows/iptrunk/test_modify_isis_metric.py @@ -0,0 +1,58 @@ +from unittest.mock import patch + +import pytest + +from gso.products import Iptrunk +from test.workflows import ( + assert_complete, + assert_suspended, + extract_state, + resume_workflow, + run_workflow, + user_accept_and_assert_suspended, +) + + +@pytest.mark.workflow +@patch("gso.workflows.iptrunk.modify_isis_metric.provisioning_proxy.provision_ip_trunk") +def test_iptrunk_modify_isis_metric_success( + mock_provision_ip_trunk, + iptrunk_subscription_factory, + faker, +): + # Set up mock return values + product_id = iptrunk_subscription_factory() + new_isis_metric = faker.pyint() + + # Run workflow + initial_iptrunk_data = [ + {"subscription_id": product_id}, + {"tt_number": faker.tt_number(), "isis_metric": new_isis_metric}, + ] + result, process_stat, step_log = run_workflow("modify_isis_metric", initial_iptrunk_data) + assert_suspended(result) + + lso_return = { + "pp_run_results": { + "status": "ok", + "job_id": faker.uuid4(), + "output": "parsed_output", + "return_code": 0, + }, + "confirm": "ACCEPTED", + } + + result, step_log = user_accept_and_assert_suspended(process_stat, step_log, lso_return) + result, step_log = user_accept_and_assert_suspended(process_stat, step_log, [{}, {}]) + result, step_log = user_accept_and_assert_suspended(process_stat, step_log, lso_return) + result, step_log = resume_workflow(process_stat, step_log, [{}, {}]) + + assert_complete(result) + + state = extract_state(result) + subscription_id = state["subscription_id"] + subscription = Iptrunk.from_subscription(subscription_id) + + assert "active" == subscription.status + assert mock_provision_ip_trunk.call_count == 2 + assert subscription.iptrunk.iptrunk_isis_metric == new_isis_metric diff --git a/tox.ini b/tox.ini index 09bbbd4b7dc3d796a57232be610f66876eb46c99..a33adf5b1613231dd2fd5539f870f190b61c3a59 100644 --- a/tox.ini +++ b/tox.ini @@ -7,6 +7,9 @@ select = B,C,D,E,F,G,I,N,S,T,W,B902,B903,R max-line-length = 120 ban-relative-imports = true +[pytest] +markers = workflow + [testenv] passenv = DATABASE_URI_TEST,SKIP_ALL_TESTS deps =