import pytest from django.db import IntegrityError from ..forms import CreateSimpleDateTimeEventForm, CAFSingleDateEventForm, CAFTwinDateEventForm, CreateNoteEventForm pytestmark = pytest.mark.django_db def test_init(user, org_with_people): """Here we test that we can pass in the user value from the view. We don't want that to be field in the form. """ people_from_org = org_with_people.get_people() form = CreateSimpleDateTimeEventForm( { "type_descriptor": "MEETING", # Must be Meeting as that is in the choices param "short_description": "Test short description", "date": "2010-10-10T13:00", "comments": "Test Comments", "location": "Transient Moats", "participants": people_from_org }, user=user, org_slug=None ) assert form.is_valid() def test_simple_event_limited_to_org_participants(user, org, person): person.organisation = org person.save() people_from_org = org.get_people() form = CreateSimpleDateTimeEventForm( { "type_descriptor": "PHONE_CALL", "short_description": "Test Short Description", "date": "2010-10-10 10:00", "requested_response_date": "2020-12-24", "response_received_date": "2020-12-25", "participants": people_from_org, "url": "https://fake.url.com", "comments": "Test Comments not needed" }, user=user, org_slug=org.slug ) assert form.is_valid() def test_cannot_create_disallowed_single_date_event_type_with_form(user, org_with_people): form = CreateSimpleDateTimeEventForm( { "type_descriptor": "NOT ALLOWED EVENT", "short_description": "Test short description", "date": "2020-10-10", "comments": "Test Comments", "participants": org_with_people.get_people() }, user=user, org_slug=None ) assert form.is_valid() is False assert form.errors == { "type_descriptor": [ "Select a valid choice. NOT ALLOWED EVENT is not one of the available choices." ] } def test_create_simple_datetime_event(user, org_with_people): form = CreateSimpleDateTimeEventForm( { "type_descriptor": "PHONE_CALL", "short_description": "Test Short Description", "date": "2010-10-10 10:00", "requested_response_date": "2020-12-24", "response_received_date": "2020-12-25", "url": "https://fake.url.com", "comments": "Test Comments not needed", "participants": org_with_people.get_people() }, user=user, org_slug=None ) assert form.is_valid() def test_response_date_cannot_be_before_date(user, org_with_people): form = CreateSimpleDateTimeEventForm( { "type_descriptor": "PHONE_CALL", "short_description": "Test Short Description", "date": "2010-10-10 10:00", "requested_response_date": "2009-12-24", "response_received_date": None, "comments": "Test Comments not needed", "participants": org_with_people.get_people() }, user=user, org_slug=None ) assert not form.is_valid() assert form.errors == {"__all__": ["Requested response cannot be before date."]} def test_meeting_blank_data(user, org_with_people): """Missing datetime fields is required. Location is optional""" form = CreateSimpleDateTimeEventForm( { "type_descriptor": "MEETING", "short_description": "Test short description", "comments": "Test Comments", "participants": org_with_people.get_people() }, user=user, org_slug=None ) assert form.is_valid() is False assert form.errors == {"date": ["This field is required."]} def test_create_note(user, org_with_people): """ A note is related to an organisation rather than to persons in that organisation. """ form = CreateNoteEventForm( { "type_descriptor": "NOTE", "short_description": "Test note", "organisation": org_with_people, "private": True, "url": "https://www.bobbins.com/there-bos" }, user=user ) assert form.is_valid() @pytest.mark.parametrize( "allowed_type", [ "CAF_INITIAL_CAF_RECEIVED", "CAF_RECEIVED", "CAF_INITIAL_REVIEW_COMPLETE", "CAF_FEEDBACK_EMAILED_OES", "CAF_EMAILED_ROSA", "CAF_VALIDATION_SIGN_OFF", "CAF_VALIDATION_RECORD_EMAILED_TO_OES", ], ) def test_caf_single_date_event_forms(allowed_type, user, caf): form = CAFSingleDateEventForm( { "type_descriptor": allowed_type, "related_caf": caf, "short_description": "Test Short Description", "date": "2010-07-01", "comments": "Meaningless comments", }, user=user, caf_id=caf.id ) assert form.is_valid() @pytest.mark.parametrize( "allowed_type", ["CAF_INITIAL_CAF_RECEIVED", "CAF_VALIDATION_SIGN_OFF", "CAF_RECEIVED"], ) def test_cannot_do_some_caf_single_date_events_on_same_day(allowed_type, user, caf): form1 = CAFSingleDateEventForm( { "type_descriptor": allowed_type, "related_caf": caf, "short_description": "Test Short Description", "date": "2010-07-01", "comments": "Meaningless comments", }, user=user, caf_id=caf.id ) form2 = CAFSingleDateEventForm( { "type_descriptor": allowed_type, "related_caf": caf, "short_description": "Test Short Description", "date": "2010-07-01", "comments": "Meaningless comments", }, user=user, caf_id=caf.id ) assert form1.is_valid() form1.save() assert form2.is_valid() with pytest.raises(IntegrityError): form2.save() def test_can_register_two_send_to_rosa_events_on_same_day(user, caf): form1 = CAFSingleDateEventForm( { "type_descriptor": "CAF_EMAILED_ROSA", "related_caf": caf, "short_description": "Test Short Description", "date": "2010-07-01", "comments": "Meaningless comments", }, user=user, caf_id=caf.id ) form2 = CAFSingleDateEventForm( { "type_descriptor": "CAF_EMAILED_ROSA", "related_caf": caf, "short_description": "Test Short Description 2", "date": "2010-07-01", "comments": "Meaningless comments 2", }, user=user, caf_id=caf.id ) assert form1.is_valid() assert form2.is_valid() def test_caf_twin_date_event(user, caf): form = CAFTwinDateEventForm( { "type_descriptor": "CAF_PEER_REVIEW_PERIOD", "related_caf": caf, "short_description": "Test Description", "date": "2009-10-01", "end_date": "2015-10-1", "comments": "Meaningless comments", }, user=user, ) assert form.is_valid() @pytest.mark.parametrize("allowed_type", ["CAF_PEER_REVIEW_PERIOD", "CAF_VALIDATION_PERIOD"]) def test_cannot_create_twin_date_event_for_caf_whose_end_date_is_open(allowed_type, user, caf): e1 = CAFTwinDateEventForm( { "type_descriptor": allowed_type, "related_caf": caf, "short_description": "caf peer review for x company", "date": "2020-10-10", "comments": "nice comments for this event", }, user=user, ) e2 = CAFTwinDateEventForm( { "type_descriptor": allowed_type, "related_caf": caf, "short_description": "caf peer review for x company", "date": "2020-10-10", "comments": "nice comments for this event", }, user=user, ) assert e1.is_valid() e1.save() assert e2.is_valid() is False assert e2.errors == { "date": ["You cannot have two CAF events starting on the same date."] } @pytest.mark.parametrize("allowed_type", ["CAF_PEER_REVIEW_PERIOD", "CAF_VALIDATION_PERIOD"]) def test_cannot_create_twin_date_event_where_end_date_precedes_start(allowed_type, user, caf): """This one is done with a database integrity check instead of a form validation""" with pytest.raises(IntegrityError): CAFTwinDateEventForm( { "type_descriptor": allowed_type, "related_caf": caf, "short_description": "caf peer review for x company", "date": "2020-10-10", "end_date": "2020-10-09", "comments": "nice comments for this event", }, user=user, ).save()