Skip to content
This repository was archived by the owner on Sep 3, 2025. It is now read-only.

Commit cc3b74a

Browse files
authored
testing/case-tests (#2921)
* add initial work, tests for base case service * continue to add test cases for case service * remove unimplemented tests * Updates create test to check for assignee resolution flow * remove unused fixture
1 parent 7d0077f commit cc3b74a

File tree

3 files changed

+197
-2
lines changed

3 files changed

+197
-2
lines changed

tests/case/test_case_service.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from dispatch.auth.models import DispatchUser
2+
from dispatch.case.models import Case, CaseUpdate
3+
from dispatch.case.severity.models import CaseSeverity
4+
from dispatch.case.priority.models import CasePriority
5+
from dispatch.case.type.models import CaseType
6+
7+
8+
def test_get(session, case: Case):
9+
from dispatch.case.service import get
10+
11+
t_case = get(db_session=session, case_id=case.id)
12+
assert t_case.id == case.id
13+
14+
15+
def test_get_by_name(session, case: Case):
16+
from dispatch.case.service import get_by_name
17+
18+
t_case = get_by_name(db_session=session, project_id=case.project.id, name=case.name)
19+
assert t_case.name == case.name
20+
21+
22+
def test_get_all(session, case: Case):
23+
from dispatch.case.service import get_all
24+
25+
t_cases = get_all(db_session=session, project_id=case.project.id).all()
26+
assert t_cases
27+
28+
29+
def test_get_all_by_status(session, new_case: Case):
30+
from dispatch.case.service import get_all_by_status
31+
from dispatch.case.enums import CaseStatus
32+
33+
# Some case
34+
t_cases = get_all_by_status(
35+
db_session=session,
36+
project_id=new_case.project.id,
37+
status=CaseStatus.new,
38+
)
39+
assert t_cases
40+
41+
# None case
42+
t_cases = get_all_by_status(
43+
db_session=session,
44+
project_id=new_case.project.id,
45+
status=CaseStatus.closed,
46+
)
47+
assert not t_cases
48+
49+
50+
def test_create(session, case: Case, project):
51+
from dispatch.case.service import create as create_case
52+
53+
# No assignee, No oncall_service, resolves current_user to assignee
54+
current_user = DispatchUser(email="[email protected]", password=bytes("test", "utf-8"))
55+
session.add(current_user)
56+
session.commit()
57+
58+
case.case_type = CaseType(name="Test", project=project)
59+
case.case_severity = CaseSeverity(name="Low", project=project)
60+
case.case_priority = CasePriority(name="Low", project=project)
61+
case.project = project
62+
63+
case_out = create_case(db_session=session, case_in=case, current_user=current_user)
64+
assert case_out
65+
assert case_out.assignee.email == current_user.email
66+
67+
68+
def test_update(session, case: Case, project):
69+
from dispatch.case.service import update as update_case
70+
from dispatch.case.enums import CaseStatus
71+
from dispatch.enums import Visibility
72+
73+
current_user = DispatchUser(email="[email protected]")
74+
case.case_type = CaseType(name="Test", project=project)
75+
case.case_severity = CaseSeverity(name="Low", project=project)
76+
case.case_priority = CasePriority(name="Low", project=project)
77+
case.project = project
78+
case.visibility = Visibility.open
79+
80+
case_in = CaseUpdate(
81+
title="XXX",
82+
description="YYY",
83+
resolution="True Positive",
84+
status=CaseStatus.closed,
85+
visibility=Visibility.restricted,
86+
)
87+
88+
case_out = update_case(
89+
db_session=session, case=case, case_in=case_in, current_user=current_user
90+
)
91+
assert case_out.title == "XXX"
92+
assert case_out.description == "YYY"
93+
assert case_out.resolution == "True Positive"
94+
assert case_out.status == CaseStatus.closed
95+
assert case_out.visibility == Visibility.restricted
96+
97+
98+
def test_delete(session, case: Case):
99+
from dispatch.case.service import delete as case_delete
100+
from dispatch.case.service import get as case_get
101+
102+
case_delete(
103+
db_session=session,
104+
case_id=case.id,
105+
)
106+
107+
t_case = case_get(db_session=session, case_id=case.id)
108+
assert not t_case

tests/conftest.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
from .factories import (
2828
DispatchUserFactory,
2929
CaseFactory,
30+
CasePriorityFactory,
31+
CaseSeverityFactory,
32+
CaseTypeFactory,
3033
ConferenceFactory,
3134
ConversationFactory,
3235
DefinitionFactory,
@@ -456,6 +459,26 @@ def case(session):
456459
return CaseFactory()
457460

458461

462+
@pytest.fixture
463+
def new_case(session):
464+
return CaseFactory(status="New")
465+
466+
467+
@pytest.fixture
468+
def case_priority(session):
469+
return CasePriorityFactory()
470+
471+
472+
@pytest.fixture
473+
def case_severity(session):
474+
return CaseSeverityFactory()
475+
476+
477+
@pytest.fixture
478+
def case_type(session):
479+
return CaseTypeFactory()
480+
481+
459482
@pytest.fixture
460483
def incident(session):
461484
return IncidentFactory()

tests/factories.py

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55

66
from faker import Faker
77

8-
from factory import Sequence, post_generation, SubFactory, LazyAttribute
8+
from factory import Sequence, post_generation, SubFactory, LazyAttribute, LazyFunction
99
from factory.alchemy import SQLAlchemyModelFactory
1010
from factory.fuzzy import FuzzyChoice, FuzzyText, FuzzyDateTime, FuzzyInteger
1111

1212
from dispatch.auth.models import DispatchUser, hash_password # noqa
13-
from dispatch.case.models import Case
13+
from dispatch.case.models import Case, CaseRead, Case
14+
from dispatch.case.priority.models import CasePriority
15+
from dispatch.case.severity.models import CaseSeverity
16+
from dispatch.case.type.models import CaseType
1417
from dispatch.conference.models import Conference
1518
from dispatch.conversation.models import Conversation
1619
from dispatch.definition.models import Definition
@@ -665,6 +668,19 @@ def incident(self, create, extracted, **kwargs):
665668
self.incident_id = extracted.id
666669

667670

671+
class CaseTypeFactory(BaseFactory):
672+
"""Case Type Factory."""
673+
674+
name = FuzzyText()
675+
description = FuzzyText()
676+
project = SubFactory(ProjectFactory)
677+
678+
class Meta:
679+
"""Factory Configuration."""
680+
681+
model = CaseType
682+
683+
668684
class CaseFactory(BaseFactory):
669685
"""Case Factory."""
670686

@@ -674,12 +690,60 @@ class CaseFactory(BaseFactory):
674690
description = FuzzyText()
675691
status = FuzzyChoice(["New", "Triage", "Escalated", "Closed"])
676692
project = SubFactory(ProjectFactory)
693+
case_type = SubFactory(CaseTypeFactory)
677694

678695
class Meta:
679696
"""Factory Configuration."""
680697

681698
model = Case
682699

700+
class Params:
701+
702+
status = "New"
703+
704+
705+
class CasePriorityFactory(BaseFactory):
706+
"""Case Priority Factory."""
707+
708+
name = FuzzyText()
709+
description = FuzzyText()
710+
project = SubFactory(ProjectFactory)
711+
712+
class Meta:
713+
"""Factory Configuration."""
714+
715+
model = CasePriority
716+
717+
718+
class CaseSeverityFactory(BaseFactory):
719+
"""Case Severity Factory."""
720+
721+
name = FuzzyText()
722+
description = FuzzyText()
723+
project = SubFactory(ProjectFactory)
724+
725+
class Meta:
726+
"""Factory Configuration."""
727+
728+
model = CaseSeverity
729+
730+
731+
class CaseReadFactory(BaseFactory):
732+
"""CaseRead Factory."""
733+
734+
id = Sequence(lambda n: f"1{n}")
735+
name = FuzzyText()
736+
title = FuzzyText()
737+
case_priority = SubFactory(CasePriorityFactory)
738+
case_severity = SubFactory(CaseSeverityFactory)
739+
case_type = SubFactory(CaseTypeFactory)
740+
project = SubFactory(ProjectFactory)
741+
742+
class Meta:
743+
"""Factory Configuration."""
744+
745+
model = CaseRead
746+
683747

684748
class IncidentFactory(BaseFactory):
685749
"""Incident Factory."""

0 commit comments

Comments
 (0)