import pytest from django.contrib.auth import get_user_model from django.contrib.auth.models import Group, Permission from django.test import RequestFactory from django.urls import reverse from ctrack.caf.tests.factories import PersonFactory from ctrack.organisations.tests.factories import ( OrganisationFactory, SingleDateTimeEventFactory, ) from ctrack.organisations.views import IncidentReportCreateView, OrganisationDetailView, oes_list, \ person_contact_history from ..utils import filter_private_events from ..views import OrganisationListView pytestmark = pytest.mark.django_db def test_person_history_view(user, client, org_with_people): person = org_with_people.person_set.first() e1 = SingleDateTimeEventFactory.create( type_descriptor="MEETING", short_description="First Meeting" ) e2 = SingleDateTimeEventFactory.create( type_descriptor="MEETING", short_description="Second Meeting" ) e1.participants.add(person) e1.save() e2.participants.add(person) e2.save() client.force_login(user) response = client.get( reverse("organisations:person_contact_history", kwargs={"person_id": person.pk}) ) assert response.status_code == 200 html = response.content.decode("utf-8") assert "First Meeting" in html def test_organisation_by_inspector_view(inspector1, inspector2, client, submode): org = OrganisationFactory(submode=submode, lead_inspector=inspector1, deputy_lead_inspector=inspector2) client.force_login(inspector1) response = client.get(reverse("organisations:list_by_inspector", args=[inspector1.id])) assert response.status_code == 200 def test_meetings_in_organisation_detail_view(user, client, org_with_people): org_list_permission = Permission.objects.get(name="Can view organisation") assert user.user_permissions.count() == 0 user.user_permissions.add(org_list_permission) assert user.has_perm("organisations.view_organisation") user.save() person = org_with_people.person_set.first() e1 = SingleDateTimeEventFactory.create( type_descriptor="MEETING", short_description="First Meeting" ) e2 = SingleDateTimeEventFactory.create( type_descriptor="MEETING", short_description="Second Meeting" ) e1.participants.add(person) e1.save() e2.participants.add(person) e2.save() client.force_login(user) response = client.get( reverse("organisations:detail", kwargs={"slug": org_with_people.slug}) ) assert response.status_code == 200 html = response.content.decode("utf-8") assert "First Meeting" in html # TODO - parameterize this test with the almost identical test below def test_private_event_filter_for_contact_history_page(user, client, org_with_people): """ In this test we are creating five events, using two different users. Each event will be set to either private or not private. We are testing a function that will only allow private notes belonging to the logged in, or request.user user to be added to the view context. The context is not referred to here - only the utility function under test. The output from that filter function will go forward into the view context. """ person = org_with_people.person_set.first() e1_user = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="First Event with user", private=True, user=user, ) e2_user = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="Second Event with user", private=False, user=user, ) e3_user = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="Third Event with user", private=True, user=user, ) e1_user.participants.add(person) e1_user.save() e2_user.participants.add(person) e2_user.save() e3_user.participants.add(person) e3_user.save() user2 = get_user_model().objects.create(username="sam", email="asd@asdsd.com", password="123") e1_user2 = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="First Event with USER2", private=False, user=user2, ) e2_user2 = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="Second Event with USER2", private=True, user=user2, ) e1_user2.participants.add(person) e1_user2.save() e2_user2.participants.add(person) e2_user2.save() client.force_login(user2) response = client.get(reverse("organisations:person_contact_history", kwargs={"person_id": person.pk})) assert response.status_code == 200 html = response.content.decode("utf-8") assert "First Event with user" not in html assert "Third Event with user" not in html def test_private_event_filter(user, org_with_people): """ In this test we are creating five events, using two different users. Each event will be set to either private or not private. We are testing a function that will only allow private notes belonging to the logged in, or request.user user to be added to the view context. The context is not referred to here - only the utility function under test. The output from that filter function will go forward into the view context. """ person = org_with_people.person_set.first() e1_user = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="First Event with user", private=True, user=user, ) e2_user = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="Second Event with user", private=False, user=user, ) e3_user = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="Third Event with user", private=True, user=user, ) e1_user.participants.add(person) e1_user.save() e2_user.participants.add(person) e2_user.save() e3_user.participants.add(person) e3_user.save() user2 = get_user_model().objects.create(username="sam", email="asd@asdsd.com", password="123") e1_user2 = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="First Event with user2", private=False, user=user2, ) e2_user2 = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="Second Event with user2", private=True, user=user2, ) e1_user2.participants.add(person) e1_user2.save() e2_user2.participants.add(person) e2_user2.save() # This user needs permission to access the list view org_list_permission = Permission.objects.get(name="Can view organisation") assert user.user_permissions.count() == 0 user.user_permissions.add(org_list_permission) assert user.has_perm("organisations.view_organisation") user.save() factory = RequestFactory() request = factory.get(reverse("organisations:detail", args=[org_with_people.slug])) request.user = user response = OrganisationDetailView.as_view()(request, slug=org_with_people.slug) assert response.status_code == 200 events = person.get_single_datetime_events() assert events.count() == 5 assert len(filter_private_events(events, user2)) == 3 def test_logged_in_user_can_only_see_their_private_events( user, org_with_people, client ): org_list_permission = Permission.objects.get(name="Can view organisation") assert user.user_permissions.count() == 0 user.user_permissions.add(org_list_permission) assert user.has_perm("organisations.view_organisation") user.save() person = org_with_people.person_set.first() # This user creates three events e1 = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="First Event", private=True, user=user, ) e2 = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="Second Event", private=False, user=user, ) e3 = SingleDateTimeEventFactory( type_descriptor="MEETING", short_description="Third Event", private=True, user=user, ) e1.participants.add(person) e1.save() e2.participants.add(person) e2.save() e3.participants.add(person) e3.save() response = client.get( reverse("organisations:detail", kwargs={"slug": org_with_people.slug}) ) assert response.status_code == 200 html = response.content.decode("utf-8") assert "First Event" in html assert "Second Event" in html assert "Third Event" in html assert "PRIVATE" in html # A second user adds events based on this person/organisation user2 = get_user_model().objects.create( username="bobbins", email="bobbins@gog.com", password="bobbins123345" ) user2.user_permissions.add(org_list_permission) assert user2.has_perm("organisations.view_organisation") user2.save() client.logout() client.force_login(user2) response2 = client.get( reverse("organisations:detail", kwargs={"slug": org_with_people.slug}) ) html2 = response2.content.decode("utf-8") assert response2.status_code == 200 # They should not be able to see First Event which was created by another # user and marked private. assert "First Event" not in html2 assert "Second Event" in html2 assert "Third Event" not in html2 # https://docs.djangoproject.com/en/3.0/topics/testing/advanced/#example def test_organisation_list_view(): OrganisationFactory.create() OrganisationFactory.create() OrganisationFactory.create() factory = RequestFactory() user = get_user_model().objects.create_user( username="testy", email="testy@test.com", password="test1020" ) # This user needs permission to acccess the list view org_list_permission = Permission.objects.get(name="Can view organisation") assert user.user_permissions.count() == 0 user.user_permissions.add(org_list_permission) assert user.has_perm("organisations.view_organisation") user.save() request = factory.get("/organisations") request.user = user response = OrganisationListView.as_view()(request) assert response.status_code == 200 assert len(response.context_data["organisation_list"]) == 3 def test_oes_list_view(): OrganisationFactory.create(oes=True) OrganisationFactory.create(oes=True) OrganisationFactory.create(oes=True) factory = RequestFactory() user = get_user_model().objects.create_user( username="testy", email="testy@test.com", password="test1020" ) # This user needs permission to acccess the list view org_list_permission = Permission.objects.get(name="Can view organisation") assert user.user_permissions.count() == 0 user.user_permissions.add(org_list_permission) assert user.has_perm("organisations.view_organisation") user.save() request = factory.get("/organisations/oes") request.user = user response = oes_list(request) assert response.status_code == 200 html = response.content.decode("utf-8") assert "OES" in html def test_only_member_of_cct_user_group_can_view_org_list(): OrganisationFactory.create() OrganisationFactory.create() OrganisationFactory.create() group = Group.objects.create(name="cct_user") factory = RequestFactory() user = get_user_model().objects.create_user( username="testy", email="testy@test.com", password="test1020" ) user.groups.add(group) org_list_permission = Permission.objects.get(name="Can view organisation") group.permissions.add(org_list_permission) # They get this permisson via the cct_user group assert user.has_perm("organisations.view_organisation") def test_incident_report_create_view(stakeholder_user): org = OrganisationFactory.create() factory = RequestFactory() request = factory.get(f"{org.name}/create-incident-report") request.user = stakeholder_user response = IncidentReportCreateView.as_view()(request, org.slug) assert response.status_code == 200 def test_only_member_of_cct_user_group_can_view_a_single_person( stakeholder_user, org_with_people, client, role, submode ): PersonFactory.create( role=role, predecessor=None, organisation__submode=submode, organisation=org_with_people, ) PersonFactory.create( role=role, predecessor=None, organisation__submode=submode, organisation=org_with_people, ) group = Group.objects.create(name="cct_user") stakeholder_user.groups.add(group) person_list_permission = Permission.objects.get(name="Can view person") group.permissions.add(person_list_permission) client.force_login(stakeholder_user) response = client.get(reverse("organisations:people")) # They get this permisson via the cct_user group assert stakeholder_user.has_perm("organisations.view_person") assert response.status_code == 200