From 49c88468f085fea113af2bf968b86d3a3e807f1d Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Tue, 31 Jan 2023 08:38:26 -0800 Subject: [PATCH 1/5] add initial work, tests for base case service --- tests/case/test_case_service.py | 73 +++++++++++++++++++++++++++++++++ tests/conftest.py | 29 +++++++++++++ tests/factories.py | 68 +++++++++++++++++++++++++++++- 3 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 tests/case/test_case_service.py diff --git a/tests/case/test_case_service.py b/tests/case/test_case_service.py new file mode 100644 index 000000000000..e3fb022246cb --- /dev/null +++ b/tests/case/test_case_service.py @@ -0,0 +1,73 @@ +from dispatch.auth.models import DispatchUser +from dispatch.case.models import Case, CaseCreate, CaseRead + + +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_by_name_or_raise(): + pass + + +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 + + t_cases = get_all_by_status( + db_session=session, + project_id=new_case.project.id, + status=CaseStatus.new, + ) + assert t_cases + + +def test_get_all_by_status_none(session, new_case: Case): + from dispatch.case.service import get_all_by_status + from dispatch.case.enums import CaseStatus + + t_cases = get_all_by_status( + db_session=session, + project_id=new_case.project.id, + status=CaseStatus.closed, + ) + assert not t_cases + + +def test_get_all_last_x_hours_by_status(): + pass + + +# TODO: (wshel) get CaseRead factory working +def test_create(session, case: Case, project): + from dispatch.case.service import create as create_case + from dispatch.case.type.service import create as create_type + from dispatch.case.type.models import CaseTypeCreate + + name = "WOW" + + create_type_in = CaseTypeCreate( + name=name, + project=project, + ) + create_type(db_session=session, case_type_in=create_type_in) + + case = create_case(db_session=session, case_in=case) + assert case diff --git a/tests/conftest.py b/tests/conftest.py index 524dd74d2100..18dff1b8bbc6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,6 +27,10 @@ from .factories import ( DispatchUserFactory, CaseFactory, + CasePriorityFactory, + CaseReadFactory, + CaseSeverityFactory, + CaseTypeFactory, ConferenceFactory, ConversationFactory, DefinitionFactory, @@ -456,6 +460,31 @@ def case(session): return CaseFactory() +@pytest.fixture +def new_case(session): + return CaseFactory(status="New") + + +@pytest.fixture +def case_in(session): + pass + + +@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.""" From a80a569450a791fe68b84bfbd907c63e11f67aa2 Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Tue, 31 Jan 2023 09:22:40 -0800 Subject: [PATCH 2/5] continue to add test cases for case service --- tests/case/test_case_service.py | 70 +++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/tests/case/test_case_service.py b/tests/case/test_case_service.py index e3fb022246cb..aec038b07c97 100644 --- a/tests/case/test_case_service.py +++ b/tests/case/test_case_service.py @@ -1,5 +1,8 @@ from dispatch.auth.models import DispatchUser -from dispatch.case.models import Case, CaseCreate, CaseRead +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): @@ -31,6 +34,7 @@ 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, @@ -38,11 +42,7 @@ def test_get_all_by_status(session, new_case: Case): ) assert t_cases - -def test_get_all_by_status_none(session, new_case: Case): - from dispatch.case.service import get_all_by_status - from dispatch.case.enums import CaseStatus - + # None case t_cases = get_all_by_status( db_session=session, project_id=new_case.project.id, @@ -55,19 +55,57 @@ def test_get_all_last_x_hours_by_status(): pass -# TODO: (wshel) get CaseRead factory working def test_create(session, case: Case, project): from dispatch.case.service import create as create_case - from dispatch.case.type.service import create as create_type - from dispatch.case.type.models import CaseTypeCreate - name = "WOW" + 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 - create_type_in = CaseTypeCreate( - name=name, - project=project, + case = create_case(db_session=session, case_in=case, current_user=current_user) + assert case + + +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, ) - create_type(db_session=session, case_type_in=create_type_in) - case = create_case(db_session=session, case_in=case) - assert case + 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 From 1af0c313993f34c22fe9dd8c92bb16c9065dc10e Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Tue, 31 Jan 2023 09:24:16 -0800 Subject: [PATCH 3/5] remove unimplemented tests --- tests/case/test_case_service.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/case/test_case_service.py b/tests/case/test_case_service.py index aec038b07c97..588223d9877a 100644 --- a/tests/case/test_case_service.py +++ b/tests/case/test_case_service.py @@ -19,10 +19,6 @@ def test_get_by_name(session, case: Case): assert t_case.name == case.name -def test_get_by_name_or_raise(): - pass - - def test_get_all(session, case: Case): from dispatch.case.service import get_all @@ -51,10 +47,6 @@ def test_get_all_by_status(session, new_case: Case): assert not t_cases -def test_get_all_last_x_hours_by_status(): - pass - - def test_create(session, case: Case, project): from dispatch.case.service import create as create_case From fb4881704f3cd7c662629ded7ae59058cee994be Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Tue, 31 Jan 2023 09:55:18 -0800 Subject: [PATCH 4/5] Updates create test to check for assignee resolution flow --- tests/case/test_case_service.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/case/test_case_service.py b/tests/case/test_case_service.py index 588223d9877a..8d0d6e2c66e6 100644 --- a/tests/case/test_case_service.py +++ b/tests/case/test_case_service.py @@ -50,14 +50,19 @@ def test_get_all_by_status(session, new_case: Case): def test_create(session, case: Case, project): from dispatch.case.service import create as create_case - current_user = DispatchUser(email="test@netflix.com") + # 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 = create_case(db_session=session, case_in=case, current_user=current_user) - assert case + 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 ad78492ccb93d6b3d2ca7154b9366b50b63ce15d Mon Sep 17 00:00:00 2001 From: Will Sheldon <114631109+wssheldon@users.noreply.github.com> Date: Tue, 31 Jan 2023 09:56:45 -0800 Subject: [PATCH 5/5] remove unused fixture --- tests/conftest.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 18dff1b8bbc6..1b4ddeb2009f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -28,7 +28,6 @@ DispatchUserFactory, CaseFactory, CasePriorityFactory, - CaseReadFactory, CaseSeverityFactory, CaseTypeFactory, ConferenceFactory, @@ -465,11 +464,6 @@ def new_case(session): return CaseFactory(status="New") -@pytest.fixture -def case_in(session): - pass - - @pytest.fixture def case_priority(session): return CasePriorityFactory()