aboutsummaryrefslogblamecommitdiffstats
path: root/ctrack/conftest.py
blob: 3c310c8b3419613897611da2037b352b80d4c88e (plain) (tree)
1
2
3
4
5
6
7
8
9

         
             

                                                        
                                              

                                                      
 


                                                     




                                         
                






                                                  
 

                                                    

 
               





                         
                                                                             



                         
                                                                          


               
              










                                                                            






















                                               





                                        


































                                                                      






                                                                                  

                                           
                                                          
                                  

                            



                                      




                 


                                
 

                      

                                                                       
 
 
               





                                                                     


               

                                        

 
               














                                                                    







                                                         






                            
import os

import pytest
from django.contrib.auth.models import Group, Permission
from django.db.models import Q
from django.test import RequestFactory, Client
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

from ctrack.caf.models import CAF
from ctrack.caf.tests.factories import GradingFactory
from ctrack.core.utils import _create_caf_app_service
from ctrack.organisations.models import (
    Address,
    AddressType,
    Mode,
    Organisation,
    Stakeholder,
    Submode,
)
from ctrack.organisations.tests.factories import (
    AddressFactory,
    OrganisationFactory,
    PersonFactory,
    RoleFactory,
)
from ctrack.users.models import User
from ctrack.users.tests.factories import UserFactory


@pytest.fixture
def user() -> User:
    return UserFactory()


@pytest.fixture
def inspector1() -> User:
    return UserFactory(first_name="Cyril", last_name="Bloanssette_Ridgewell")


@pytest.fixture
def inspector2() -> User:
    return UserFactory(first_name="Ogilvie", last_name="Cathroyd-Marylls")


@pytest.fixture
def submode():
    return Submode.objects.create(
        descriptor="Light Rail", mode=Mode.objects.create(descriptor="Rail")
    )


@pytest.fixture
def mode():
    return Mode.objects.create(descriptor="Rail")


@pytest.fixture
def role():
    return RoleFactory.create(name="Test Role")


@pytest.fixture
def org_with_people(role):
    org = OrganisationFactory.create(
        submode=None,
        name="TEST ORGANISATION",
        designation_type=3,
        registered_company_name="Test PLC",
        comments="NA",
    )
    PersonFactory.create(
        role=role,
        job_title="Test Job Title",
        predecessor=None,
        organisation__submode=None,
        organisation=org,
    )
    return org


@pytest.fixture(autouse=True)
def media_storage(settings, tmpdir):
    settings.MEDIA_ROOT = tmpdir.strpath


@pytest.fixture
def cct_user_group() -> Group:
    """
    TODO: An inspector will not require this many permissions! Reduce.
    """
    group = Group.objects.create(name="cct_user")
    ctrack_permissions = Permission.objects.filter(
        Q(codename__contains="address")
        | Q(codename__contains="addresstype")
        | Q(codename__contains="mode")
        | Q(codename__contains="organisation")
        | Q(codename__contains="role")
        | Q(codename__contains="submode")
        | Q(codename__contains="person")
        | Q(codename__contains="applicablesystem")
        | Q(codename__contains="caf")
        | Q(codename__contains="documentfile")
        | Q(codename__contains="filestore")
        | Q(codename__contains="grading")
        | Q(codename__contains="engagementtype")
        | Q(codename__contains="engagementevent")
        | Q(codename__contains="cafassessment")
        | Q(codename__contains="cafobjective")
        | Q(codename__contains="cafprinciple")
        | Q(codename__contains="cafcontributingoutcome")
        | Q(codename__contains="cafassessmentoutcomescore")
        | Q(codename__contains="achievmentlevel")
        | Q(codename__contains="igp")
        | Q(codename__contains="stakeholder")
        | Q(codename__contains="incidentreport")
    )
    group.permissions.add(*ctrack_permissions)
    return group


@pytest.fixture
def cct_user(cct_user_group) -> User:
    # For testing views which require redirects to permission-controlled
    # pages, we have to ensure our test user is has the requisite permissions here
    return UserFactory(groups=[cct_user_group])


@pytest.fixture
def person(user, submode, org_with_people):
    org = org_with_people
    role = RoleFactory.create(name="Compliance Inspector")
    person = PersonFactory.create(
        first_name="Toss",
        last_name="McBride",
        role=role,
        predecessor=None,
        organisation__submode=submode,
        organisation=org,
    )
    return person


@pytest.fixture
def org() -> Organisation:
    return OrganisationFactory()


@pytest.fixture
def addr() -> Address:
    address_type = AddressType.objects.create(descriptor="Random Type")
    return AddressFactory(type=address_type)


@pytest.fixture
def stakeholder_user(person):
    user = User.objects.create_user(username="toss", password="knob")
    stakeholder = Stakeholder.objects.create(person=person)
    user.stakeholder = stakeholder
    user.save()
    return user


@pytest.fixture
def request_factory() -> RequestFactory:
    return RequestFactory()


@pytest.fixture
def caf(org) -> CAF:
    # Quality gradings
    q_descriptors = ["Q1", "Q2", "Q3", "Q4", "Q5"]
    for g in q_descriptors:
        GradingFactory.create(descriptor=g, type="QUALITY")

    # Confidence gradings
    c_descriptors = ["C1", "C2", "C3", "C4", "C5"]
    for g in c_descriptors:
        GradingFactory.create(descriptor=g, type="CONFIDENCE")
    caf = _create_caf_app_service(c_descriptors, org, q_descriptors)
    return caf


@pytest.fixture
def browser(request):
    "Provide selenium webdriver instance."
    os.environ["PATH"] += os.pathsep + os.getcwd()
    options = Options()
    options.headless = True
    browser_ = webdriver.Firefox(firefox_options=options)
    yield browser_
    browser_.quit()


@pytest.fixture
def client(user):
    client = Client()
    client.force_login(user)
    return client