Skip to content

Commit

Permalink
additional testing
Browse files Browse the repository at this point in the history
  • Loading branch information
drkane committed Oct 26, 2023
1 parent d02bcac commit bc05670
Show file tree
Hide file tree
Showing 18 changed files with 138 additions and 58 deletions.
3 changes: 0 additions & 3 deletions .isort.cfg

This file was deleted.

3 changes: 2 additions & 1 deletion findthatcharity/apps/addtocsv/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render


def index(request):
def index(request: HttpRequest) -> HttpResponse:
context = {}
return render(request, "addtocsv/addtocsv.html.j2", context)
Empty file.
5 changes: 4 additions & 1 deletion findthatcharity/apps/charity/views.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
from django.http import HttpRequest, HttpResponse
from django.shortcuts import redirect

from findthatcharity.apps.charity.utils import regno_to_orgid
from findthatcharity.apps.ftc.views import get_org_by_id


def get_charity(request, regno, filetype="html", preview=False):
def get_charity(
request: HttpRequest, regno: str, filetype: str = "html", preview: bool = False
) -> HttpResponse:
org_id = regno_to_orgid(regno)

if filetype == "html":
Expand Down
2 changes: 1 addition & 1 deletion findthatcharity/apps/ftc/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class OrganisationGroup(Document):
search_scale = fields.FloatField()

@classmethod
def search(cls, using=None, index=None):
def search(cls, using=None, index=None) -> SearchWithTemplate:
return SearchWithTemplate(
using=cls._get_using(using),
index=cls._default_index(index),
Expand Down
2 changes: 1 addition & 1 deletion findthatcharity/apps/ftc/models/related_organisation.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

class RelatedOrganisation:
def __init__(self, orgs):
self.records = self.prioritise_orgs(orgs)
self.records: list[Organisation] = self.prioritise_orgs(orgs)

@classmethod
def from_orgid(cls, org_id):
Expand Down
58 changes: 32 additions & 26 deletions findthatcharity/apps/ftc/query.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import copy
from typing import Optional

from django.core.paginator import Paginator
from django.db.models import Count, F, Func, Q
from django.shortcuts import Http404
from django.http import Http404, HttpRequest
from elasticsearch_dsl import A

from findthatcharity.apps.ftc.documents import DSEPaginator, OrganisationGroup
Expand All @@ -14,7 +15,7 @@
from findthatcharity.apps.reconcile.query import RECONCILE_QUERY


def get_organisation(org_id):
def get_organisation(org_id: str) -> Organisation:
try:
return Organisation.objects.get(org_id=org_id)
except Organisation.DoesNotExist or Organisation.MultipleObjectsReturned:
Expand All @@ -26,14 +27,19 @@ def get_organisation(org_id):
raise Http404("No Organisation found.")


def get_linked_organisations(org_id):
def get_linked_organisations(org_id: str) -> RelatedOrganisation:
related_orgs = list(Organisation.objects.filter(linked_orgs__contains=[org_id]))
if not related_orgs:
raise Http404("No Organisation found.")
return RelatedOrganisation(related_orgs)


def random_query(active=False, orgtype=None, aggregate=False, source=None):
def random_query(
active: bool = False,
orgtype: Optional[list | str] = None,
aggregate: bool = False,
source: Optional[list | str] = None,
) -> dict:
query = {
"query": {
"function_score": {
Expand Down Expand Up @@ -73,16 +79,16 @@ def random_query(active=False, orgtype=None, aggregate=False, source=None):


class OrganisationSearch:
def __init__(self, results_per_page=25, **kwargs):
self.results_per_page = results_per_page
self.term = None
self.base_orgtype = None
self.other_orgtypes = None
self.source = None
self.active = None
self.domain = None
self.postcode = None
self.location = None
def __init__(self, results_per_page: int = 25, **kwargs):
self.results_per_page: int = results_per_page
self.term: Optional[str] = None
self.base_orgtype: Optional[list[str]] = None
self.other_orgtypes: Optional[list[str]] = None
self.source: Optional[list[str]] = None
self.active: Optional[bool] = None
self.domain: Optional[str] = None
self.postcode: Optional[str] = None
self.location: Optional[list[str]] = None

self.query = None
self.paginator = None
Expand All @@ -93,14 +99,14 @@ def __init__(self, results_per_page=25, **kwargs):

def set_criteria(
self,
term=None,
base_orgtype=None,
other_orgtypes=None,
source=None,
active=None,
domain=None,
postcode=None,
location=None,
term: Optional[str] = None,
base_orgtype: Optional[list[str] | str] = None,
other_orgtypes: Optional[list[str] | str] = None,
source: Optional[list[str] | str] = None,
active: Optional[bool] = None,
domain: Optional[str] = None,
postcode: Optional[str] = None,
location: Optional[list[str] | str] = None,
):
if term and isinstance(term, str):
self.term = term
Expand Down Expand Up @@ -129,7 +135,7 @@ def set_criteria(
if isinstance(domain, str):
self.postcode = postcode

def set_criteria_from_request(self, request):
def set_criteria_from_request(self, request: HttpRequest) -> None:
if "orgtype" in request.GET and request.GET.get("orgtype") != "all":
self.set_criteria(other_orgtypes=request.GET.getlist("orgtype"))
if "source" in request.GET and request.GET.get("source") != "all":
Expand All @@ -144,15 +150,15 @@ def set_criteria_from_request(self, request):
self.set_criteria(active=False)

@property
def orgtypes(self):
orgtypes = []
def orgtypes(self) -> list[str]:
orgtypes: list[str] = []
if isinstance(self.base_orgtype, list):
orgtypes.extend(self.base_orgtype)
if isinstance(self.other_orgtypes, list):
orgtypes.extend(self.other_orgtypes)
return orgtypes

def run_es(self, with_pagination=False, with_aggregation=False):
def run_es(self, with_pagination: bool = False, with_aggregation: bool = False):
"""
Fetch the reconciliation query and insert the query term
"""
Expand Down
Empty file.
30 changes: 21 additions & 9 deletions findthatcharity/apps/ftc/views.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import csv
from collections import defaultdict
from typing import Any, Optional

from charity_django.companies.models import Company
from django.http import JsonResponse, StreamingHttpResponse
from django.http import HttpRequest, HttpResponse, JsonResponse, StreamingHttpResponse
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views.decorators.clickjacking import xframe_options_exempt
Expand All @@ -28,11 +29,11 @@


# site homepage
def index(request):
def index(request: HttpRequest) -> HttpResponse:
if "q" in request.GET:
return orgid_type(request, filetype=request.GET.get("filetype", "html"))

context = dict(
context: dict[str, Any] = dict(
examples={
"registered-charity-england-and-wales": "GB-CHC-1177548",
"registered-charity-scotland": "GB-SC-SC007427",
Expand Down Expand Up @@ -63,13 +64,19 @@ def index(request):
return render(request, "index.html.j2", context)


def about(request):
def about(request: HttpRequest) -> HttpResponse:
context = {}
return render(request, "about.html.j2", context)


@xframe_options_exempt
def get_org_by_id(request, org_id, filetype="html", preview=False, as_charity=False):
def get_org_by_id(
request: HttpRequest,
org_id: str,
filetype: str = "html",
preview: bool = False,
as_charity: bool = False,
) -> HttpResponse:
org = get_organisation(org_id)
charity = Charity.objects.filter(id=org_id).first()

Expand All @@ -91,7 +98,7 @@ def get_org_by_id(request, org_id, filetype="html", preview=False, as_charity=Fa
related_orgs = [org]
related_orgs = RelatedOrganisation(related_orgs)

additional_data = dict(
additional_data: dict[str, Any] = dict(
cqc=CQCProvider.objects.filter(org_id__in=related_orgs.orgIDs).all(),
grants_received=list(
Grant.objects.filter(recipientOrganization_id__in=related_orgs.orgIDs)
Expand Down Expand Up @@ -145,7 +152,7 @@ def get_orgid_canon(request, org_id):
return JsonResponse(related_orgs.to_json(request=request))


def get_random_org(request):
def get_random_org(request: HttpRequest) -> HttpResponse:
"""Get a random charity record"""
# filetype = request.GET.get("filetype", "html")
active = request.GET.get("active", False)
Expand All @@ -168,7 +175,12 @@ def write(self, value):
return value


def orgid_type(request, orgtype=None, source=None, filetype="html"):
def orgid_type(
request: HttpRequest,
orgtype: Optional[str] = None,
source: Optional[str] = None,
filetype: str = "html",
) -> HttpResponse:
base_query = None
download_url = request.build_absolute_uri() + "&filetype=csv"
s = OrganisationSearch()
Expand Down Expand Up @@ -259,7 +271,7 @@ def stream():


@xframe_options_exempt
def company_detail(request, company_number, filetype="html"):
def company_detail(request: HttpRequest, company_number: str, filetype: str = "html"):
company = get_object_or_404(Company, CompanyNumber=company_number)

# fetch any related organisations
Expand Down
Empty file.
24 changes: 24 additions & 0 deletions findthatcharity/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import django.test

import findthatcharity.apps.ftc.tests
from findthatcharity.api.endpoints import FtcAuthentication


class ApiAuthenticationTest(django.test.TestCase):
databases = {"data", "admin"}

def test_authenticate_anon(self):
request = django.test.RequestFactory().get("/")
request.user = django.contrib.auth.models.AnonymousUser()

self.assertEqual(FtcAuthentication().authenticate(request, None), None)

def test_authenticate_user(self):
user = django.contrib.auth.models.User.objects.create_user(
username="testuser",
email="[email protected]",
)
request = django.test.RequestFactory().get("/")
request.user = user

self.assertEqual(FtcAuthentication().authenticate(request, None), None)
9 changes: 9 additions & 0 deletions findthatcharity/tests/test_db_router.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from unittest.mock import Mock

from findthatcharity.db_router import DBRouter


def test_db_router__db_for_read__data_db():
router = DBRouter()
model = Mock(_meta=Mock(app_label="api"))
assert router.db_for_read(model) == "data"
File renamed without changes.
29 changes: 19 additions & 10 deletions findthatcharity/utils.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
import re
from decimal import Decimal
from urllib.parse import urlparse

import babel.numbers
import inflect
from django.conf import settings
from django.http import HttpRequest

WORD_BOUNDARY_REGEX = re.compile(r"\b\w+\b")

p = inflect.engine()


def url_replace(request, **kwargs):
def url_replace(request: HttpRequest, **kwargs) -> str:
dict_ = request.GET.copy()
for field, value in kwargs.items():
dict_[field] = value
return request.build_absolute_uri(request.path) + "?" + dict_.urlencode()


def url_remove(request, fields):
def url_remove(request: HttpRequest, fields: list[str] | str) -> str:
dict_ = request.GET.copy()
if not isinstance(fields, list):
fields = [fields]
Expand All @@ -27,18 +29,25 @@ def url_remove(request, fields):
return request.build_absolute_uri(request.path) + "?" + dict_.urlencode()


def pluralise(text, count=1, number_format=":,.0f", text_format="{count} {text}"):
def pluralise(
text: str,
count: int = 1,
number_format: str = ":,.0f",
text_format="{count} {text}",
) -> str:
count_str = ("{" + number_format + "}").format(count)
return text_format.format(count=count_str, text=p.plural(text, count))


def format_currency(amount, currency="GBP", int_format="¤#,##0"):
def format_currency(
amount: float | int | Decimal, currency: str = "GBP", int_format: str = "¤#,##0"
) -> str:
return babel.numbers.format_currency(
amount, currency, format=int_format, currency_digits=False, locale="en_UK"
)


def number_format(value, scale=1, negative=False):
def number_format(value: float | int | Decimal, scale=1, negative=False) -> str:
if value is None or value == 0:
return "-"
format_ = "{:,.0f}"
Expand All @@ -49,18 +58,18 @@ def number_format(value, scale=1, negative=False):
if value < 0:
format_ = "(" + format_ + ")"
value = abs(value)
return format_.format(value / float(scale))
return format_.format(float(value) / float(scale))


def str_format(value, format="{}"):
def str_format(value: float | int | Decimal, format: str = "{}") -> str:
return format.format(value)


def a_or_an(value):
def a_or_an(value: str) -> str:
return p.a(value).split()[0]


def normalise_name(n):
def normalise_name(n: str) -> str:
stopwords = [
"the",
"of",
Expand All @@ -79,7 +88,7 @@ def normalise_name(n):
).strip()


def get_domain(url):
def get_domain(url: str) -> str | None:
if not url:
return None
if not url.startswith("http"):
Expand Down
3 changes: 2 additions & 1 deletion findthatcharity/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render


def missing_page_handler(request, exception=None):
def missing_page_handler(request: HttpRequest, exception=None) -> HttpResponse:
return render(
request,
"error.html.j2",
Expand Down
5 changes: 4 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[tool.ruff]
select = ["E", "F", "I"]
ignore = ['E501']
ignore = ['E501']

[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "findthatcharity.settings"
Loading

0 comments on commit bc05670

Please sign in to comment.