aboutsummaryrefslogblamecommitdiffstats
path: root/ctrack/register/tests/test_views.py
blob: 4e8152c70a8b2cdbd1d62f6465ad341723c4a1d5 (plain) (tree)
1
2
3
4
5
6
7
8
9
             
                                
                               
 

                                                 
                                                                           

                                                           


                                                                 


                                  
                              

                                                       
                                                          
                                       















                                                     









                                                                        
                
                                         
                                                          
                                 
                                  
                                   
         



                                                                      

                                               
                                                
 
                                                                      
                                                         
                                                                           





                                                          
                                                         

                                    







                                                              

                                  
                                                                         

         















                                                                                                        






                                                          
                                              


                                                
 
                                                               
                                          
                                                                             

                              

                                               
 






                                                                                       

                                                                            
                                                                                 

                                  
                                          
                                               
                                                                                       
 






                                                                    


                                                                   
                                                                                 





                                                   
                                                                                    


                                          



                                                                    





                                                     


                                                       








                                                                  


                                                                              





                                                               
 
                                  





                                                                   

                                          




                                                                                        
                                        
import pytest
from django.test import TestCase
from django.urls import reverse

from ctrack.caf.models import CAF
from ctrack.caf.tests.factories import CAFFactory
from ctrack.organisations.tests.factories import SingleDateTimeEventFactory
from ctrack.register.views import SingleDateTimeEventCreate

# Doing this allows us to use TestCase assertions (assertIn, etc)
test_case = TestCase("run")

pytestmark = pytest.mark.django_db


class TestSingleDateTimeEvent:
    url = reverse("register:event_create_simple_event")

    def test_add_single_datetime_event_form(self, client):
        response = client.get(self.url)
        assert response.status_code == 200

        form = response.context_data["form"]
        assert not form.is_bound
        expected_fields = [
            "type_descriptor",
            "short_description",
            "datetime",
            "comments",
            "location",
        ]
        for field in expected_fields:
            assert field in form.fields
        # We're keeping the use field out of the form
        assert "user" not in form.fields

    @pytest.mark.parametrize(
        "bad_date,expected_error",
        [
            ("NOT A DATE", "Enter a valid date/time."),
            ("202002-10-12", "Enter a valid date/time."),
            ("32 May 2020", "Enter a valid date/time."),
            ("May 2020", "Enter a valid date/time."),
        ],
    )
    def test_bad_date(self, bad_date, cct_user, expected_error, client):
        data = {
            "type_descriptor": "MEETING",
            "short_description": "Test Short Description",
            "datetime": bad_date,
            "comments": "Blah...",
            "location": "The Moon",
        }
        # we need to use the cct_user fixture here who has permissions
        # on the redirect page
        client.force_login(cct_user)
        response = client.post(self.url, data)
        assert response.status_code == 200
        html = response.content.decode("utf-8")
        test_case.assertIn(expected_error, html)

    @pytest.mark.skip("Come back to this when revisiting permissions")
    @pytest.mark.parametrize("good_date", ["2010-10-10"])
    def test_good_date(self, good_date, cct_user, client, org_with_people):
        data = {
            "type_descriptor": "PHONE_CALL",
            "short_description": "Test Short Description",
            "datetime": good_date,
            "comments": "Blah...",
            "location": "The Moon",
            "participants": org_with_people.get_people(),
        }
        client.force_login(cct_user)
        response = client.post(
            reverse(
                "register:event_create_simple_event_from_org",
                args=[org_with_people.slug],
            ),
            data,
            follow=True,
        )
        test_case.assertRedirects(
            response,
            reverse("organisations:detail", args=[org_with_people.slug]),
        )

    @pytest.mark.parametrize(
        "bad_type,expected_error",
        [
            (
                "Meeting X",
                "Select a valid choice. Meeting X is not one of the available choices.",
            ),
            (
                "Meeting Bunting Radgehead",
                "Select a valid choice. Meeting Bunting Radgehead is not one of the available choices.",
            ),
        ],
    )
    def test_add_incorrect_form_data_single_datetime(
        self, bad_type, expected_error, client
    ):
        data = {
            "type_descriptor": bad_type,
            "short_description": "Test Short Description",
            "datetime": "2010-10-10",
            "comments": "Blah...",
            "location": "The Moon",
        }
        response = client.post(self.url, data)
        assert response.status_code == 200
        html = response.content.decode("utf-8")
        test_case.assertIn(expected_error, html)

    def test_user_passed_as_kwarg(self, user, request_factory):
        view = SingleDateTimeEventCreate()
        request = request_factory.get("/register/event/create-simple-event/")
        request.user = user
        view.request = request
        view.setup(request)
        assert "user" in view.get_form_kwargs()

    def test_create_simple_event_without_org_means_no_participants(self, user, client):
        client.force_login(user)
        url = reverse("register:event_create_simple_event")
        response = client.get(url)
        html = response.content.decode("utf-8")
        assert '<input type="hidden" name="participants" id="id_participants">' in html

    def test_can_create_simple_event_with_org_slug(self, user, org, client):
        slug = org.slug
        url = reverse("register:event_create_simple_event_from_org", args=[slug])
        client.force_login(user)
        response = client.get(url)
        assert response.status_code == 200
        html = response.content.decode("utf-8")
        test_case.assertInHTML(f"Create a new simple event involving {org.name}", html)

    def test_create_note_view(self, user, org, client):
        client.force_login(user)
        response = client.get(reverse("register:event_create_note"))
        assert response.status_code == 200
        html = response.content.decode("utf-8")
        assert "Create a Note" in html

    def test_org_passed_as_kwarg(self, user, org, request_factory):
        slug = org.slug
        view = SingleDateTimeEventCreate()
        url = reverse("register:event_create_simple_event_from_org", args=[slug])
        request = request_factory.get(url)
        request.user = user
        view.request = request
        view.setup(request)
        assert "org_slug" in view.get_form_kwargs()

    def test_meeting_type_and_org_passed_as_kwarg(self, user, org, request_factory):
        event_type = "PHONE_CALL"
        slug = org.slug
        view = SingleDateTimeEventCreate()
        url = reverse(
            "register:event_create_simple_event_from_org_with_type",
            args=[slug, event_type],
        )
        request = request_factory.get(url)
        request.user = user
        view.request = request
        view.setup(request)
        assert "event_type" in view.get_form_kwargs()

    def test_can_update_single_datetime_event_from_org(
        self, user, org_with_people, client
    ):
        org_slug = org_with_people.slug
        people = org_with_people.person_set.all()
        e1 = SingleDateTimeEventFactory(type_descriptor="MEETING")
        _collected_p = []
        for p in people:
            e1.participants.add(p)
            _collected_p.append((p.first_name, p.last_name))
        e1.save()
        pk = e1.pk
        url = reverse(
            "register:event_update_simple_event_from_org", args=[pk, org_slug]
        )
        client.force_login(user)
        response = client.get(url)
        assert response.status_code == 200
        html = response.content.decode("utf-8")
        test_case.assertInHTML(" ".join(_collected_p[0]), html)


class TestSingleDateCAFEventViews:
    def test_initial_caf_received(self, client, user, caf):
        client.force_login(user)
        url = reverse(
            "register:event_caf_create_single_date_event_from_caf",
            kwargs={"caf_id": caf.id},
        )
        response = client.get(url)
        assert response.status_code == 200
        html = response.content.decode("utf-8")
        test_case.assertInHTML(
            f"Register a single date event for {caf.version} ({caf.organisation.name})",
            html,
        )
        assert "Related caf" not in html