Fully set up portfolio fixture for state machine tests

Also fixes some formatting problems
This commit is contained in:
tomdds 2020-02-19 10:40:06 -05:00
parent daf4a0ba68
commit f956b41f98
2 changed files with 44 additions and 26 deletions

View File

@ -156,4 +156,3 @@ class FSMMixin:
f"calling finish trigger '{finish_trigger}' for '{self.__repr__()}'" f"calling finish trigger '{finish_trigger}' for '{self.__repr__()}'"
) )
self.trigger(finish_trigger) self.trigger(finish_trigger)

View File

@ -1,33 +1,35 @@
import pytest
import pydantic
import re import re
from unittest.mock import Mock, patch
from enum import Enum from enum import Enum
from unittest.mock import Mock, patch
import pendulum
import pydantic
import pytest
from tests.factories import ( from tests.factories import (
PortfolioStateMachineFactory, ApplicationFactory,
CLINFactory, CLINFactory,
PortfolioFactory,
PortfolioStateMachineFactory,
TaskOrderFactory,
UserFactory,
) )
from atst.models import FSMStates, PortfolioStateMachine, TaskOrder from atst.models import FSMStates, PortfolioStateMachine, TaskOrder
from atst.domain.csp.cloud.models import BillingProfileCreationCSPPayload
from atst.models.mixins.state_machines import ( from atst.models.mixins.state_machines import (
AzureStages, AzureStages,
StageStates, StageStates,
compose_state,
_build_transitions,
_build_csp_states, _build_csp_states,
_build_transitions,
compose_state,
) )
from atst.models.portfolio import Portfolio from atst.models.portfolio import Portfolio
from atst.models.portfolio_state_machine import ( from atst.models.portfolio_state_machine import (
get_stage_csp_class,
_stage_to_classname,
_stage_state_to_stage_name,
StateMachineMisconfiguredError, StateMachineMisconfiguredError,
_stage_state_to_stage_name,
_stage_to_classname,
get_stage_csp_class,
) )
# TODO: Write failure case tests # TODO: Write failure case tests
@ -37,16 +39,28 @@ class AzureStagesTest(Enum):
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def portfolio(): def portfolio():
# TODO: setup clin/to as active/funded/ready today = pendulum.today()
portfolio = CLINFactory.create().task_order.portfolio yesterday = today.subtract(days=1)
future = today.add(days=100)
owner = UserFactory.create()
portfolio = PortfolioFactory.create(owner=owner)
ApplicationFactory.create(portfolio=portfolio, environments=[{"name": "dev"}])
TaskOrderFactory.create(
portfolio=portfolio,
signed_at=yesterday,
clins=[CLINFactory.create(start_date=yesterday, end_date=future)],
)
return portfolio return portfolio
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def state_machine(): def state_machine(portfolio):
# TODO: setup clin/to as active/funded/ready
portfolio = CLINFactory.create().task_order.portfolio
return PortfolioStateMachineFactory.create(portfolio=portfolio) return PortfolioStateMachineFactory.create(portfolio=portfolio)
@pytest.mark.state_machine @pytest.mark.state_machine
def test_fsm_creation(portfolio): def test_fsm_creation(portfolio):
sm = PortfolioStateMachineFactory.create(portfolio=portfolio) sm = PortfolioStateMachineFactory.create(portfolio=portfolio)
@ -152,12 +166,14 @@ def test_attach_machine(state_machine):
"resume_progress_tenant", "resume_progress_tenant",
] ]
@pytest.mark.state_machine @pytest.mark.state_machine
def test_current_state_property(state_machine): def test_current_state_property(state_machine):
assert state_machine.current_state == FSMStates.UNSTARTED assert state_machine.current_state == FSMStates.UNSTARTED
state_machine.state = FSMStates.TENANT_IN_PROGRESS state_machine.state = FSMStates.TENANT_IN_PROGRESS
assert state_machine.current_state == FSMStates.TENANT_IN_PROGRESS assert state_machine.current_state == FSMStates.TENANT_IN_PROGRESS
@pytest.mark.state_machine @pytest.mark.state_machine
def test_fail_stage(state_machine): def test_fail_stage(state_machine):
state_machine.state = FSMStates.TENANT_IN_PROGRESS state_machine.state = FSMStates.TENANT_IN_PROGRESS
@ -165,14 +181,16 @@ def test_fail_stage(state_machine):
state_machine.fail_stage("tenant") state_machine.fail_stage("tenant")
assert state_machine.state == FSMStates.TENANT_FAILED assert state_machine.state == FSMStates.TENANT_FAILED
@pytest.mark.state_machine @pytest.mark.state_machine
def test_fail_stage_invalid_triggers(state_machine): def test_fail_stage_invalid_triggers(state_machine):
state_machine.state = FSMStates.TENANT_IN_PROGRESS state_machine.state = FSMStates.TENANT_IN_PROGRESS
state_machine.portfolio.csp_data = {} state_machine.portfolio.csp_data = {}
state_machine.machine.get_triggers = Mock(return_value=['some', 'triggers', 'here']) state_machine.machine.get_triggers = Mock(return_value=["some", "triggers", "here"])
state_machine.fail_stage("tenant") state_machine.fail_stage("tenant")
assert state_machine.state == FSMStates.TENANT_IN_PROGRESS assert state_machine.state == FSMStates.TENANT_IN_PROGRESS
@pytest.mark.state_machine @pytest.mark.state_machine
def test_fail_stage_invalid_stage(state_machine): def test_fail_stage_invalid_stage(state_machine):
state_machine.state = FSMStates.TENANT_IN_PROGRESS state_machine.state = FSMStates.TENANT_IN_PROGRESS
@ -181,6 +199,7 @@ def test_fail_stage_invalid_stage(state_machine):
state_machine.fail_stage("invalid stage") state_machine.fail_stage("invalid stage")
assert state_machine.state == FSMStates.TENANT_IN_PROGRESS assert state_machine.state == FSMStates.TENANT_IN_PROGRESS
@pytest.mark.state_machine @pytest.mark.state_machine
def test_finish_stage(state_machine): def test_finish_stage(state_machine):
state_machine.state = FSMStates.TENANT_IN_PROGRESS state_machine.state = FSMStates.TENANT_IN_PROGRESS
@ -188,15 +207,17 @@ def test_finish_stage(state_machine):
state_machine.finish_stage("tenant") state_machine.finish_stage("tenant")
assert state_machine.state == FSMStates.TENANT_CREATED assert state_machine.state == FSMStates.TENANT_CREATED
@pytest.mark.state_machine @pytest.mark.state_machine
def test_finish_stage_invalid_triggers(state_machine): def test_finish_stage_invalid_triggers(state_machine):
state_machine.state = FSMStates.TENANT_IN_PROGRESS state_machine.state = FSMStates.TENANT_IN_PROGRESS
state_machine.portfolio.csp_data = {} state_machine.portfolio.csp_data = {}
state_machine.machine.get_triggers = Mock(return_value=['some', 'triggers', 'here']) state_machine.machine.get_triggers = Mock(return_value=["some", "triggers", "here"])
state_machine.finish_stage("tenant") state_machine.finish_stage("tenant")
assert state_machine.state == FSMStates.TENANT_IN_PROGRESS assert state_machine.state == FSMStates.TENANT_IN_PROGRESS
@pytest.mark.state_machine @pytest.mark.state_machine
def test_finish_stage_invalid_stage(state_machine): def test_finish_stage_invalid_stage(state_machine):
state_machine.state = FSMStates.TENANT_IN_PROGRESS state_machine.state = FSMStates.TENANT_IN_PROGRESS
@ -205,6 +226,7 @@ def test_finish_stage_invalid_stage(state_machine):
state_machine.finish_stage("invalid stage") state_machine.finish_stage("invalid stage")
assert state_machine.state == FSMStates.TENANT_IN_PROGRESS assert state_machine.state == FSMStates.TENANT_IN_PROGRESS
@pytest.mark.state_machine @pytest.mark.state_machine
def test_stage_state_to_stage_name(): def test_stage_state_to_stage_name():
stage = _stage_state_to_stage_name( stage = _stage_state_to_stage_name(
@ -223,7 +245,9 @@ def test_state_machine_initialization(state_machine):
assert hasattr(state_machine, trigger_prefix + "_" + stage_name) assert hasattr(state_machine, trigger_prefix + "_" + stage_name)
# check that machine # check that machine
in_progress_triggers = state_machine.machine.get_triggers(stage.name + "_IN_PROGRESS") in_progress_triggers = state_machine.machine.get_triggers(
stage.name + "_IN_PROGRESS"
)
assert [ assert [
"reset", "reset",
"fail", "fail",
@ -279,11 +303,6 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio):
csp_data = {} csp_data = {}
ppoc = portfolio.owner ppoc = portfolio.owner
if not ppoc:
class ppoc:
first_name = "John"
last_name = "Doe"
email = "email@example.com"
user_id = f"{ppoc.first_name[0]}{ppoc.last_name}".lower() user_id = f"{ppoc.first_name[0]}{ppoc.last_name}".lower()
domain_name = re.sub("[^0-9a-zA-Z]+", "", portfolio.name).lower() domain_name = re.sub("[^0-9a-zA-Z]+", "", portfolio.name).lower()