diff --git a/app/utils.py b/app/utils.py index 01883872e..323b163cb 100644 --- a/app/utils.py +++ b/app/utils.py @@ -439,131 +439,117 @@ class NotGovernmentDomain(Exception): class GovernmentDomain: domains = { - "gov.uk": { - "sector": None, - "agreement_signed": False, - }, - "mod.uk": { - "sector": None, - "agreement_signed": False, - }, - "mil.uk": { - "sector": None, - "agreement_signed": False, - }, - "ddc-mod.org": { - "sector": None, - "agreement_signed": False, - }, + "gov.uk": None, + "mod.uk": None, + "mil.uk": None, + "ddc-mod.org": None, "slc.co.uk": { + "owner": "Student Loans Company", "sector": None, "agreement_signed": False, }, - "gov.scot": { - "sector": None, - "agreement_signed": False, - }, + "gov.scot": None, "parliament.uk": { + "owner": "Parliament", "sector": None, "agreement_signed": False, }, "nhs.uk": { + "owner": "NHS", "sector": None, "agreement_signed": False, }, - "nhs.net": { - "sector": None, - "agreement_signed": False, - }, - "police.uk": { - "sector": None, - "agreement_signed": False, - }, + "nhs.net": "nhs.uk", + "police.uk": None, "dclgdatamart.co.uk": { + "owner": None, "sector": None, "agreement_signed": False, }, - "ucds.email": { + "dwp.gov.uk": { + "owner": "Deparment for Work and Pensions", "sector": None, "agreement_signed": False, }, + "dwp.gsi.gov.uk": "dwp.gov.uk", + "ucds.email": "dwp.gov.uk", "naturalengland.org.uk": { + "Owner": "Natural England", "sector": None, "agreement_signed": False, }, "hmcts.net": { + "owner": "Her Majesty’s Courts and Tribunals Service", "sector": None, "agreement_signed": False, }, - "scotent.co.uk": { - "sector": None, - "agreement_signed": False, - }, - "assembly.wales": { - "sector": None, - "agreement_signed": False, - }, - "cjsm.net": { - "sector": None, - "agreement_signed": False, - }, - "cqc.org.uk": { - "sector": None, - "agreement_signed": False, - }, + "scotent.co.uk": None, + "assembly.wales": None, + "cjsm.net": None, + "cqc.org.uk": None, "bl.uk": { + "owner": "British Library", "sector": None, "agreement_signed": False, }, - "stfc.ac.uk": { - "sector": None, - "agreement_signed": False, - }, - "wmfs.net": { - "sector": None, - "agreement_signed": False, - }, - "bbsrc.ac.uk": { - "sector": None, - "agreement_signed": False, - }, - "acas.org.uk": { - "sector": None, - "agreement_signed": False, - }, - "gov.wales": { - "sector": None, - "agreement_signed": False, - }, - "biglotteryfund.org.uk": { - "sector": None, - "agreement_signed": False, - }, + "stfc.ac.uk": None, + "wmfs.net": None, + "bbsrc.ac.uk": None, + "acas.org.uk": None, + "gov.wales": None, + "biglotteryfund.org.uk": None, "marinemanagement.org.uk": { - "sector": None, - "agreement_signed": False, + "owner": "Marine Management Organisation", }, "britishmuseum.org": { - "sector": None, - "agreement_signed": False, - }, - "derrystrabane.com": { - "sector": None, - "agreement_signed": False, - }, - "highwaysengland.co.uk": { - "sector": None, - "agreement_signed": False, + "owner": "British Museum", }, + "derrystrabane.com": None, + "highwaysengland.co.uk": None, } def __init__(self, email_address_or_domain): - for domain, attributes in self.domains.items(): - if re.search( - "[\.|@]({})$".format(domain.replace(".", "\.")), - email_address_or_domain.lower() - ): - return + try: + self._match = sorted( + ( + domain for domain in self.domains.keys() + if self._domain_matches(email_address_or_domain, domain) + ), + key=len + )[0] + except IndexError: + raise NotGovernmentDomain() - raise NotGovernmentDomain() + self.owner, self.sector, self.agreement_signed = self._get_details_of_domain() + + @staticmethod + def _domain_matches(email_address_or_domain, domain): + + email_address_or_domain = email_address_or_domain.lower() + + return (email_address_or_domain == domain) or re.search( + "[\.|@]({})$".format(domain.replace(".", "\.")), + email_address_or_domain + ) + + def _get_details_of_domain(self): + + details = self.domains[self._match] + + if isinstance(details, str): + return GovernmentDomain(details)._get_details_of_domain() + + elif isinstance(details, dict): + return( + details.get("owner"), + details.get("sector"), + bool(details.get("agreement_signed")), + ) + + else: + return( + None, + None, + False, + ) diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py index 6b9f3207b..e16ba7bef 100644 --- a/tests/app/test_utils.py +++ b/tests/app/test_utils.py @@ -13,7 +13,8 @@ from app.utils import ( generate_next_dict, Spreadsheet, get_letter_timings, - get_cdn_domain + get_cdn_domain, + GovernmentDomain, ) from tests.conftest import fake_uuid @@ -307,3 +308,30 @@ def test_get_cdn_domain_on_non_localhost(client, mocker): mocker.patch.dict('app.current_app.config', values={'ADMIN_BASE_URL': 'https://some.admintest.com'}) domain = get_cdn_domain() assert domain == 'static-logos.admintest.com' + + +@pytest.mark.parametrize("domain_or_email_address", ( + "test@ucds.email", "test@dwp.gsi.gov.uk", "test@dwp.gov.uk", "dwp.gov.uk", +)) +def test_get_valid_government_domain_known_details(domain_or_email_address): + government_domain = GovernmentDomain(domain_or_email_address) + assert government_domain.sector is None + assert government_domain.owner is None + assert government_domain.agreement_signed is False + + +@pytest.mark.parametrize("domain_or_email_address", ( + "test@police.gov.uk", "police.gov.uk", +)) +def test_get_valid_government_domain_unknown_details(domain_or_email_address): + government_domain = GovernmentDomain(domain_or_email_address) + assert government_domain.sector is None + assert government_domain.owner is None + assert government_domain.agreement_signed is False + + +def test_get_valid_government_domain_some_known_details(): + government_domain = GovernmentDomain("marinemanagement.org.uk") + assert government_domain.sector is None + assert government_domain.owner == "Marine Management Organisation" + assert government_domain.agreement_signed is False