import datetime from http import HTTPStatus import pytest from django.test import RequestFactory from django.urls import reverse from engagements import models, views from engagements.models import EngagementStrategy, Organisation, RegulatoryCycle from engagements.utils import duration_formatter, populate_database pytestmark = pytest.mark.django_db def test_single_day_string(): """test date formatting for the summary box on the detail page""" d1 = datetime.date(2024, 10, 10) d2 = datetime.date(2024, 10, 10) duration_str = duration_formatter(d1, d2) assert duration_str == "10 October 2024 (1 day)" def test_multi_duration_string(): """test date formatting for the summary box on the detail page""" d1 = datetime.date(2024, 10, 10) d2 = datetime.date(2024, 10, 12) duration_str = duration_formatter(d1, d2) assert duration_str == "10-12 October 2024 (3 days)" def test_multi_duration_string_longer(): """test date formatting for the summary box on the detail page""" d1 = datetime.date(2024, 10, 1) d2 = datetime.date(2024, 10, 12) duration_str = duration_formatter(d1, d2) assert duration_str == "01-12 October 2024 (12 days)" def test_multi_duration_over_month_boundary_string(): """test date formatting for the summary box on the detail page""" d1 = datetime.date(2024, 9, 30) d2 = datetime.date(2024, 10, 1) duration_str = duration_formatter(d1, d2) assert duration_str == "30 September - 01 October 2024 (2 days)" @pytest.fixture def test_data(): return populate_database() @pytest.fixture def request_factory(): return RequestFactory() def test_dscs_for_ep(client, test_data, request_factory): org = test_data["orgs"][0] et = models.EngagementType.objects.get(name="INSPECTION") si = test_data["sub_instruments"][0] si2 = test_data["sub_instruments"][2] si3 = test_data["sub_instruments"][3] engagement = models.Engagement.objects.create( proposed_start_date=datetime.date(2022, 10, 10), proposed_end_date=datetime.date(2022, 10, 10), engagement_type=et, external_party=org, ) ef1 = models.EngagementEffort.objects.create( is_planned=True, effort_type="REGULATION", proposed_start_date=datetime.date(2022, 10, 10), proposed_end_date=datetime.date(2022, 10, 10), engagement=engagement, ) ef1.sub_instruments.add(si, si2, si3) url = reverse("engagements:plan_for_org", kwargs={"orgslug": org.slug}) client.force_login(test_data["superuser"]) response = client.get(url) assert response.status_code == HTTPStatus.OK assert response.context["entity"] assert response.context["entity"].name == org.name assert si in response.context["dscs"] assert si2 in response.context["dscs"] assert si3 in response.context["dscs"] def test_get_blank_form(client, test_data, request_factory): url = reverse("engagements:effort_create", kwargs={"eid": 1, "etype": "PLANNING"}) client.force_login(test_data["superuser"]) request = request_factory.get(url) request.user = test_data["superuser"] response = views.engagement_effort_create(request, eid=1, etype="PLANNING") assert response.status_code == HTTPStatus.OK # def test_get_form_to_create_engagement_strategy(client, request_factory): # url = reverse("engagements:es-create") # client.force_login(test_data["superuser"]) # request = request_factory.get(url) # request.user = test_data["superuser"] # response = views.CreateEngagementStrategy() # assert response.status_code == HTTPStatus.OK def test_create_engagement_strategy(client, user, org, regulatory_cycles): # Define the URL for the create view url = reverse("engagements:es-create") client.force_login(user) mod = Organisation.objects.create(name="MOD", is_regulated_entity=False) sy = RegulatoryCycle.objects.get(start_date__year="2022") ey = RegulatoryCycle.objects.get(start_date__year="2024") # Define sample data for the form data = { "organisation": mod.pk, "start_year": sy.pk, # Use the pk of the regulatory cycle instead of the object itself "end_year": ey.pk, "description": "Example description", "inspector_sign_off": "2022-01-10", "owned_by": user.pk, # Same here "reviewed_by": user.pk, "management_sign_off": "2022-02-10", "status": "DRAFT", } # Send a POST request to the view response = client.post(url, data) # Check that the response redirects (status code 302) after successful creation assert response.status_code == 302 assert EngagementStrategy.objects.count() == 1 def test_org_list_page_exists(client): url = reverse("engagements:org_detail") response = client.get(url) assert response.status_code == 302