diff --git a/tests/case/test_case_service.py b/tests/case/test_case_service.py new file mode 100644 index 000000000000..8d0d6e2c66e6 --- /dev/null +++ b/tests/case/test_case_service.py @@ -0,0 +1,108 @@ +from dispatch.auth.models import DispatchUser +from dispatch.case.models import Case, CaseUpdate +from dispatch.case.severity.models import CaseSeverity +from dispatch.case.priority.models import CasePriority +from dispatch.case.type.models import CaseType + + +def test_get(session, case: Case): + from dispatch.case.service import get + + t_case = get(db_session=session, case_id=case.id) + assert t_case.id == case.id + + +def test_get_by_name(session, case: Case): + from dispatch.case.service import get_by_name + + t_case = get_by_name(db_session=session, project_id=case.project.id, name=case.name) + assert t_case.name == case.name + + +def test_get_all(session, case: Case): + from dispatch.case.service import get_all + + t_cases = get_all(db_session=session, project_id=case.project.id).all() + assert t_cases + + +def test_get_all_by_status(session, new_case: Case): + from dispatch.case.service import get_all_by_status + from dispatch.case.enums import CaseStatus + + # Some case + t_cases = get_all_by_status( + db_session=session, + project_id=new_case.project.id, + status=CaseStatus.new, + ) + assert t_cases + + # None case + t_cases = get_all_by_status( + db_session=session, + project_id=new_case.project.id, + status=CaseStatus.closed, + ) + assert not t_cases + + +def test_create(session, case: Case, project): + from dispatch.case.service import create as create_case + + # No assignee, No oncall_service, resolves current_user to assignee + current_user = DispatchUser(email="test@netflix.com", password=bytes("test", "utf-8")) + session.add(current_user) + session.commit() + + case.case_type = CaseType(name="Test", project=project) + case.case_severity = CaseSeverity(name="Low", project=project) + case.case_priority = CasePriority(name="Low", project=project) + case.project = project + + case_out = create_case(db_session=session, case_in=case, current_user=current_user) + assert case_out + assert case_out.assignee.email == current_user.email + + +def test_update(session, case: Case, project): + from dispatch.case.service import update as update_case + from dispatch.case.enums import CaseStatus + from dispatch.enums import Visibility + + current_user = DispatchUser(email="test@netflix.com") + case.case_type = CaseType(name="Test", project=project) + case.case_severity = CaseSeverity(name="Low", project=project) + case.case_priority = CasePriority(name="Low", project=project) + case.project = project + case.visibility = Visibility.open + + case_in = CaseUpdate( + title="XXX", + description="YYY", + resolution="True Positive", + status=CaseStatus.closed, + visibility=Visibility.restricted, + ) + + case_out = update_case( + db_session=session, case=case, case_in=case_in, current_user=current_user + ) + assert case_out.title == "XXX" + assert case_out.description == "YYY" + assert case_out.resolution == "True Positive" + assert case_out.status == CaseStatus.closed + assert case_out.visibility == Visibility.restricted + + +def test_delete(session, case: Case): + from dispatch.case.service import delete as case_delete + from dispatch.case.service import get as case_get + + case_delete( + db_session=session, + case_id=case.id, + ) + + t_case = case_get(db_session=session, case_id=case.id) + assert not t_case diff --git a/tests/conftest.py b/tests/conftest.py index 524dd74d2100..1b4ddeb2009f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,6 +27,9 @@ from .factories import ( DispatchUserFactory, CaseFactory, + CasePriorityFactory, + CaseSeverityFactory, + CaseTypeFactory, ConferenceFactory, ConversationFactory, DefinitionFactory, @@ -456,6 +459,26 @@ def case(session): return CaseFactory() +@pytest.fixture +def new_case(session): + return CaseFactory(status="New") + + +@pytest.fixture +def case_priority(session): + return CasePriorityFactory() + + +@pytest.fixture +def case_severity(session): + return CaseSeverityFactory() + + +@pytest.fixture +def case_type(session): + return CaseTypeFactory() + + @pytest.fixture def incident(session): return IncidentFactory() diff --git a/tests/factories.py b/tests/factories.py index 8dca4023ed82..d03f93ebaa4b 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -5,12 +5,15 @@ from faker import Faker -from factory import Sequence, post_generation, SubFactory, LazyAttribute +from factory import Sequence, post_generation, SubFactory, LazyAttribute, LazyFunction from factory.alchemy import SQLAlchemyModelFactory from factory.fuzzy import FuzzyChoice, FuzzyText, FuzzyDateTime, FuzzyInteger from dispatch.auth.models import DispatchUser, hash_password # noqa -from dispatch.case.models import Case +from dispatch.case.models import Case, CaseRead, Case +from dispatch.case.priority.models import CasePriority +from dispatch.case.severity.models import CaseSeverity +from dispatch.case.type.models import CaseType from dispatch.conference.models import Conference from dispatch.conversation.models import Conversation from dispatch.definition.models import Definition @@ -665,6 +668,19 @@ def incident(self, create, extracted, **kwargs): self.incident_id = extracted.id +class CaseTypeFactory(BaseFactory): + """Case Type Factory.""" + + name = FuzzyText() + description = FuzzyText() + project = SubFactory(ProjectFactory) + + class Meta: + """Factory Configuration.""" + + model = CaseType + + class CaseFactory(BaseFactory): """Case Factory.""" @@ -674,12 +690,60 @@ class CaseFactory(BaseFactory): description = FuzzyText() status = FuzzyChoice(["New", "Triage", "Escalated", "Closed"]) project = SubFactory(ProjectFactory) + case_type = SubFactory(CaseTypeFactory) class Meta: """Factory Configuration.""" model = Case + class Params: + + status = "New" + + +class CasePriorityFactory(BaseFactory): + """Case Priority Factory.""" + + name = FuzzyText() + description = FuzzyText() + project = SubFactory(ProjectFactory) + + class Meta: + """Factory Configuration.""" + + model = CasePriority + + +class CaseSeverityFactory(BaseFactory): + """Case Severity Factory.""" + + name = FuzzyText() + description = FuzzyText() + project = SubFactory(ProjectFactory) + + class Meta: + """Factory Configuration.""" + + model = CaseSeverity + + +class CaseReadFactory(BaseFactory): + """CaseRead Factory.""" + + id = Sequence(lambda n: f"1{n}") + name = FuzzyText() + title = FuzzyText() + case_priority = SubFactory(CasePriorityFactory) + case_severity = SubFactory(CaseSeverityFactory) + case_type = SubFactory(CaseTypeFactory) + project = SubFactory(ProjectFactory) + + class Meta: + """Factory Configuration.""" + + model = CaseRead + class IncidentFactory(BaseFactory): """Incident Factory."""