""" We are using unittest for troggle. Note that the database has not been parsed from the source files when these tests are run, so any path that relies on data being in the database will fail. The simple redirections to files which exist, e.g. in /expoweb/ /expofiles/ /expofiles/documents/ etc. will test fine. But paths like this: /survey_scans/ which rely on database resolution will fail unless a fixture has been set up for them. https://docs.djangoproject.com/en/3.0/topics/testing/tools/ """ import unittest import re from django.test import TestCase, SimpleTestCase, Client class SimpleTest(SimpleTestCase): def test_basic_addition(self): """ Tests that 1 + 1 always equals 2. """ self.assertEqual(1 + 1, 2) def test_test_setting(self): from django.conf import settings self.assertEqual(settings.EMAIL_BACKEND, 'django.core.mail.backends.locmem.EmailBackend') def test_import_TroggleModel(self): from troggle.core.models import TroggleModel def test_import_Cave(self): from troggle.core.models_caves import Cave def test_import_parsers_surveys(self): from PIL import Image from utils import save_carefully from functools import reduce def test_import_parsers_survex(self): import troggle.settings as settings import troggle.core.models as models import troggle.core.models_caves as models_caves import troggle.core.models_survex as models_survex from troggle.parsers.people import GetPersonExpeditionNameLookup from troggle.core.views_caves import MapLocations def test_import_parsers_QMs(self): from troggle.core.models_caves import QM, Cave, LogbookEntry from utils import save_carefully def test_import_parsers_people(self): from html.parser import HTMLParser from unidecode import unidecode def test_import_parsers_logbooks(self): from django.template.defaultfilters import slugify from django.utils.timezone import get_current_timezone, make_aware from troggle.core.models import DataIssue, Expedition from troggle.core.models_caves import Cave, LogbookEntry, PersonTrip from parsers.people import GetPersonExpeditionNameLookup def test_import_core_views_caves(self): from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import get_object_or_404, render import troggle.core.views_expo from troggle.core.models import Expedition from troggle.core.models_caves import CaveSlug, Cave, CaveAndEntrance, QM, EntranceSlug, Entrance, Area, SurvexStation from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, VersionControlCommentForm, EntranceForm, EntranceLetterForm from troggle.helper import login_required_if_public from django.contrib.auth.decorators import login_required from django.conf import settings def test_import_parsers_mix(self): from troggle.parsers.logbooks import GetCaveLookup import troggle.settings import troggle.logbooksdump import troggle.parsers.caves import troggle.parsers.people import troggle.parsers.surveys import troggle.parsers.logbooks import troggle.parsers.QMs import troggle.parsers.survex def test_import_imports(self): from django.core import management from django.db import connection, close_old_connections, connections from django.contrib.auth.models import User from django.http import HttpResponse from django.urls import reverse def test_import_urls(self): from django.conf import settings from django.conf.urls import url, include from django.views.generic.base import RedirectView from django.views.generic.edit import UpdateView from django.views.generic.list import ListView from django.contrib import admin from django.urls import reverse, resolve #class SimplePageTest(unittest.TestCase): class PageTests(TestCase): @classmethod def setUpTestData(cls): # Set up data for the whole TestCase #cls.foo = Foo.objects.create(bar="Test") # Some test using self.foo in tests below.. # read in some SQL ? pass def setUp(self): # Every test needs a client. self.client = Client() def test_page_admin(self): # see the login page response = self.client.get('/admin/login/') content = response.content.decode() self.assertEqual(response.status_code, 200) h1 = re.search(r'

Troggle administration

', content) def test_page_admindocs(self): response = self.client.get('/admin/login/models/') content = response.content.decode() self.assertEqual(response.status_code, 200) h1 = re.search(r'

Model documentation

', content) def test_page_admindocs_exped(self): # Get redirected to login page response = self.client.get('/admin/doc/models/core.expedition/') content = response.content.decode() self.assertEqual(response.status_code, 302) h1 = re.search(r'logbookentry_set.all', content) def test_page_expofiles_dir(self): # Flat file tests. response = self.client.get('/expofiles/') self.assertEqual(response.status_code, 200) content = response.content.decode() for ph in [ r'a href="/expofiles/geotiffsurveys">/geotiffsurveys/', r'/photos/', r'/surveyscans' ]: phmatch = re.search(ph, content) self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'") def test_page_survey_scans_dir(self): # Flat file tests. response = self.client.get('/expofiles/surveyscans') self.assertEqual(response.status_code, 200) content = response.content.decode() for ph in [ r'/2004/', r'/1989LUSS/', r'/2018' ]: phmatch = re.search(ph, content) self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'") def test_page_folk(self): # This page is separately generated, so it has the full data content response = self.client.get('/folk/') content = response.content.decode() self.assertEqual(response.status_code, 200) for ph in [ r'involves some active contribution', r'Naomi Griffiths', r'Gail Smith', r'Phil Wigglesworth', r'A more obscure record of longest gap between expos has' ]: phmatch = re.search(ph, content) self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'") def test_page_expofile_document_loeffler_pdf(self): # Flat file tests. response = self.client.get('/expofiles/documents/surveying/tunnel-loefflerCP35-only.pdf') if response.status_code != 200: self.assertEqual(response.status_code, 302) if response.status_code != 302: self.assertEqual(response.status_code, 200) self.assertEqual(len(response.content), 2299270) # fails, but is working manually! def test_page_expofile_document_rope_pdf(self): # Flat file tests. response = self.client.get('/expofiles/documents/rope-age-agm-2019.pdf') if response.status_code != 200: self.assertEqual(response.status_code, 302) if response.status_code != 302: self.assertEqual(response.status_code, 200) self.assertEqual(len(response.content), 76197) # fails, but is working manually! def test_page_expofile_document_png(self): # Flat file tests. response = self.client.get('/expofiles/documents/callout-2012.png') if response.status_code != 200: self.assertEqual(response.status_code, 302) if response.status_code != 302: self.assertEqual(response.status_code, 200) self.assertEqual(len(response.content), 69921) # fails, but is working manually! def test_page_expofile_writeup(self): # Flat file tests. response = self.client.get('/expofiles/writeups/1982/logbook1982.pdf') if response.status_code != 200: self.assertEqual(response.status_code, 302) if response.status_code != 302: self.assertEqual(response.status_code, 200) self.assertEqual(len(response.content), 12915413) # fails, but is working manually! def test_page_survey_scans_empty(self): # this gets an empty page as the database has not been loaded response = self.client.get('/survey_scans/') self.assertEqual(response.status_code, 200) content = response.content.decode() ph = r'contains the scanned original in-cave survey notes and sketches' phmatch = re.search(ph, content) self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'") def test_page_tunneldataraw_empty(self): # this gets an empty page as the database has not been loaded response = self.client.get('/tunneldataraw/') self.assertEqual(response.status_code, 200) content = response.content.decode() ph = r'

Page not found tunneldataraw/

' phmatch = re.search(ph, content) self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'") def test_not_found_survexfile_cave(self): response = self.client.get('/survexfile/not_a_real_cave_number') self.assertEqual(response.status_code, 200) content = response.content.decode() ph = r'Cave not found in database' phmatch = re.search(ph, content) self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'") # these need a fixture to load the datbase before they will pass # we also need tests for invalid queries to check that error pages are right # def test_page_survey_scans_khplan2_png(self): # # this has an error as the database has not been loaded yet in the tests # response = self.client.get('/survey_scans/smkhs/khplan2.png') # if response.status_code != 200: # self.assertEqual(response.status_code, 302) # if response.status_code != 302: # self.assertEqual(response.status_code, 200) # self.assertEqual(len(response.content), 823304) # fails, but is working manually! # def test_page_tunneldataraw_107sketch_xml(self): # # this has an error as the database has not been loaded yet in the tests # response = self.client.get('/tunneldataraw/107/107sketch-v2.xml') # if response.status_code != 200: # self.assertEqual(response.status_code, 302) # if response.status_code != 302: # self.assertEqual(response.status_code, 200) # content = response.content.decode() # for ph in [ r'tunneldate="2014-08-21 11:34:00"', # r'', # r'sfsketch="ollyjen107drawings', # r'sfsketch="surveyscans/2014/2014#01', # r'aa-js-plan.png"' ]: # phmatch = re.search(ph, content) # self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph +"'") # database not loaded yet: #response = self.client.get('/survey_scans/1991surveybook/page0002.png') #response = self.client.get('/survey_scans/1991surveybook/') #content = response.content.decode() #print(content) #png93 = re.search(r'/page0093.png">page0093.png
', content)