Skip to content

Commit

Permalink
Workflow and WorkflowInstance CRUD tests (#1482)
Browse files Browse the repository at this point in the history
* Workflow and WorkflowInstance CRUD tests

* Capitalises enum values

* Updates FuzzyChoice values
  • Loading branch information
mvilanova authored Jul 26, 2021
1 parent 3a169f6 commit cfc0b23
Show file tree
Hide file tree
Showing 6 changed files with 239 additions and 18 deletions.
9 changes: 9 additions & 0 deletions src/dispatch/workflow/enums.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from dispatch.enums import DispatchEnum


class WorkflowInstanceStatus(DispatchEnum):
submitted = "Submitted"
created = "Created"
running = "Running"
completed = "Completed"
failed = "Failed"
9 changes: 1 addition & 8 deletions src/dispatch/workflow/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,13 @@
from sqlalchemy_utils import TSVectorType

from dispatch.database.core import Base
from dispatch.enums import DispatchEnum
from dispatch.document.models import DocumentCreate
from dispatch.models import DispatchBase, ResourceBase, ResourceMixin, TimeStampMixin, ProjectMixin
from dispatch.participant.models import ParticipantRead
from dispatch.plugin.models import PluginInstance, PluginInstanceRead
from dispatch.project.models import ProjectRead


class WorkflowInstanceStatus(DispatchEnum):
submitted = "submitted"
created = "created"
running = "running"
completed = "completed"
failed = "failed"
from .enums import WorkflowInstanceStatus


# Association tables for many to many relationships
Expand Down
16 changes: 9 additions & 7 deletions src/dispatch/workflow/scheduled.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@
from dispatch.database.core import SessionLocal

from dispatch.decorators import scheduled_project_task
from dispatch.incident import service as incident_service
from dispatch.incident.enums import IncidentStatus
from dispatch.messaging.strings import (
INCIDENT_WORKFLOW_UPDATE_NOTIFICATION,
INCIDENT_WORKFLOW_COMPLETE_NOTIFICATION,
INCIDENT_WORKFLOW_UPDATE_NOTIFICATION,
)

from dispatch.plugin import service as plugin_service
from dispatch.workflow import service as workflow_service
from dispatch.scheduler import scheduler
from dispatch.incident import service as incident_service
from dispatch.project.models import Project
from dispatch.incident.enums import IncidentStatus
from .models import WorkflowInstanceStatus, WorkflowInstanceUpdate
from dispatch.scheduler import scheduler
from dispatch.workflow import service as workflow_service

from .enums import WorkflowInstanceStatus
from .flows import send_workflow_notification
from .models import WorkflowInstanceUpdate


log = logging.getLogger(__name__)

Expand Down
12 changes: 12 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@
TeamContactFactory,
TermFactory,
TicketFactory,
WorkflowFactory,
WorkflowInstanceFactory,
)


Expand Down Expand Up @@ -504,3 +506,13 @@ def plugins(session):
@pytest.fixture
def plugin_instance(session):
return PluginInstanceFactory()


@pytest.fixture
def workflow(session):
return WorkflowFactory()


@pytest.fixture
def workflow_instance(session):
return WorkflowInstanceFactory()
97 changes: 94 additions & 3 deletions tests/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
from dispatch.team.models import TeamContact
from dispatch.term.models import Term
from dispatch.ticket.models import Ticket
from dispatch.workflow.models import Workflow, WorkflowInstance


class BaseFactory(SQLAlchemyModelFactory):
Expand Down Expand Up @@ -114,7 +115,7 @@ class ResourceBaseFactory(TimeStampBaseFactory):

resource_type = FuzzyChoice(["one", "two", "three"])
resource_id = FuzzyText()
weblink = FuzzyText()
weblink = Sequence(lambda n: f"https://www.example.com/{n}")

@post_generation
def incident_priorities(self, create, extracted, **kwargs):
Expand Down Expand Up @@ -854,16 +855,106 @@ class PluginInstanceFactory(BaseFactory):

enabled = Faker().pybool()
configuration = {}
project = SubFactory(ProjectFactory)
plugin = SubFactory(PluginFactory)

class Meta:
"""Factory Configuration."""

model = PluginInstance


class WorkflowFactory(BaseFactory):
"""Workflow Factory."""

name = FuzzyText()
description = FuzzyText()
enabled = Faker().pybool()
parameters = [{}]
resource_id = Sequence(lambda n: f"resource_id{n}")

class Meta:
"""Factory Configuration."""

model = Workflow

@post_generation
def incident_priorities(self, create, extracted, **kwargs):
if not create:
return

if extracted:
for priority in extracted:
self.incident_priorities.append(priority)

@post_generation
def incident_types(self, create, extracted, **kwargs):
if not create:
return

if extracted:
for incident_type in extracted:
self.incident_types.append(incident_type)

@post_generation
def terms(self, create, extracted, **kwargs):
if not create:
return

if extracted:
for term in extracted:
self.terms.append(term)

@post_generation
def plugin_instance(self, create, extracted, **kwargs):
if not create:
return

if extracted:
self.plugin_instance_id = extracted.id


class WorkflowInstanceFactory(BaseFactory):
"""WorkflowInstance Factory."""

parameters = [{}]
run_reason = FuzzyText()
status = FuzzyChoice(["Submitted", "Created", "Running", "Completed", "Failed"])

class Meta:
"""Factory Configuration."""

model = WorkflowInstance

@post_generation
def artifacts(self, create, extracted, **kwargs):
if not create:
return

if extracted:
for artifact in extracted:
self.artifacts.append(artifact)

@post_generation
def workflow(self, create, extracted, **kwargs):
if not create:
return

if extracted:
self.workflow_id = extracted.id

@post_generation
def plugin(self, create, extracted, **kwargs):
def incident(self, create, extracted, **kwargs):
if not create:
return

if extracted:
self.plugin_id = extracted.id
self.incident_id = extracted.id

@post_generation
def creator(self, create, extracted, **kwargs):
if not create:
return

if extracted:
self.creator_id = extracted.id
114 changes: 114 additions & 0 deletions tests/workflow/test_workflow_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import pytest


def test_get(session, workflow):
from dispatch.workflow.service import get

t_workflow = get(db_session=session, workflow_id=workflow.id)
assert t_workflow.id == workflow.id


def test_get_instance(session, workflow_instance):
from dispatch.workflow.service import get_instance

t_workflow_instance = get_instance(db_session=session, instance_id=workflow_instance.id)
assert t_workflow_instance.id == workflow_instance.id


def test_create(session, project, plugin_instance):
from dispatch.workflow.service import create
from dispatch.workflow.models import WorkflowCreate

name = "name"
description = "description"
resource_id = "resource_id"
parameters = [{}]
enabled = True

workflow_in = WorkflowCreate(
name=name,
description=description,
resource_id=resource_id,
parameters=parameters,
enabled=enabled,
plugin_instance=plugin_instance,
project=project,
)
workflow = create(db_session=session, workflow_in=workflow_in)
assert workflow


@pytest.mark.skip # NOTE: re-enable when using Pydantic models for all parameters in WorkflowInstanceCreate
def test_create_instance(session, incident, workflow, participant, project):
from dispatch.workflow.service import create_instance
from dispatch.workflow.models import WorkflowInstanceCreate
from dispatch.document.models import DocumentCreate

parameters = [{}]
run_reason = "reason"
status = "submitted"

artifacts = [
DocumentCreate(
name="name",
resource_id="resource_id",
resource_type="resource_type",
project=project,
weblink="https://www.example.com/doc",
)
]

workflow_in = WorkflowInstanceCreate(
parameters=parameters,
run_reason=run_reason,
status=status,
incident=incident,
workflow=workflow,
creator=participant,
artifacts=artifacts,
)
workflow_instance = create_instance(db_session=session, workflow_in=workflow_in)
assert workflow_instance


@pytest.mark.skip
def test_update(session, workflow):
from dispatch.workflow.service import update
from dispatch.workflow.models import WorkflowUpdate

name = "Updated name"

workflow_in = WorkflowUpdate(
name=name,
)
workflow = update(
db_session=session,
workflow=workflow,
workflow_in=workflow_in,
)
assert workflow.name == name


@pytest.mark.skip
def test_update_instance(session, workflow):
from dispatch.workflow.service import update
from dispatch.workflow.models import WorkflowInstanceUpdate

status = "running"

workflow_instance_in = WorkflowInstanceUpdate(
status=status,
)
workflow_instance = update(
db_session=session,
workflow=workflow,
workflow_instance_in=workflow_instance_in,
)
assert workflow_instance.status == status


def test_delete(session, workflow):
from dispatch.workflow.service import delete, get

delete(db_session=session, workflow_id=workflow.id)
assert not get(db_session=session, workflow_id=workflow.id)

0 comments on commit cfc0b23

Please sign in to comment.