forked from expo/troggle
228 lines
10 KiB
Python
228 lines
10 KiB
Python
"""
|
|
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/
|
|
/caves/
|
|
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 re
|
|
import subprocess
|
|
import unittest
|
|
|
|
from django.test import Client, SimpleTestCase, TestCase
|
|
|
|
|
|
class SimpleTest(SimpleTestCase):
|
|
def test_test_setting(self):
|
|
from django.conf import settings
|
|
self.assertEqual(settings.EMAIL_BACKEND, 'django.core.mail.backends.locmem.EmailBackend')
|
|
import troggle.settings as settings
|
|
def test_import_TroggleModel(self):
|
|
from troggle.core.models.troggle 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 functools import reduce
|
|
|
|
from troggle.core.utils import save_carefully
|
|
def test_import_parsers_survex(self):
|
|
import troggle.core.models.caves as models_caves
|
|
import troggle.core.models.survex as models_survex
|
|
import troggle.core.models.troggle as models
|
|
import troggle.settings as settings
|
|
from troggle.core.views import (caves, drawings, other, scans,
|
|
statistics, survex, uploads)
|
|
from troggle.core.views.caves import cavepage, ent
|
|
from troggle.core.views.other import frontpage
|
|
from troggle.parsers.people import GetPersonExpeditionNameLookup
|
|
def test_import_views_uploads(self):
|
|
from troggle.core.views.uploads import dwgupload, scanupload
|
|
def test_import_parsers_QMs(self):
|
|
from troggle.core.models.caves import QM, Cave, LogbookEntry
|
|
def test_import_parsers_people(self):
|
|
from html import unescape
|
|
|
|
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 parsers.people import GetPersonExpeditionNameLookup
|
|
from troggle.core.models.caves import Cave, LogbookEntry, PersonTrip
|
|
from troggle.core.models.troggle import DataIssue, Expedition
|
|
def test_import_core_views_caves(self):
|
|
from django.conf import settings
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
from django.shortcuts import get_object_or_404, render
|
|
|
|
import troggle.core.views.expo
|
|
from troggle.core.forms import (CaveAndEntranceFormSet, CaveForm,
|
|
EntranceForm, EntranceLetterForm)
|
|
from troggle.core.models.caves import (QM, Area, Cave, CaveAndEntrance,
|
|
CaveSlug, Entrance,
|
|
EntranceSlug, SurvexStation)
|
|
from troggle.core.models.troggle import Expedition
|
|
from troggle.core.views.auth import login_required_if_public
|
|
def test_import_parsers_mix(self):
|
|
import troggle.parsers.caves
|
|
import troggle.parsers.drawings
|
|
import troggle.parsers.logbooks
|
|
import troggle.parsers.people
|
|
import troggle.parsers.QMs
|
|
import troggle.parsers.scans
|
|
import troggle.parsers.survex
|
|
import troggle.settings
|
|
from troggle.parsers.logbooks import GetCaveLookup
|
|
def test_import_imports(self):
|
|
from django.contrib.auth.models import User
|
|
from django.core import management
|
|
from django.db import close_old_connections, connection, connections
|
|
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 include, url
|
|
from django.contrib import admin, auth
|
|
from django.urls import resolve, reverse
|
|
from django.views.generic.base import RedirectView
|
|
from django.views.generic.edit import UpdateView
|
|
from django.views.generic.list import ListView
|
|
|
|
from troggle.core.views import caves, other, statistics, survex
|
|
from troggle.core.views.auth import expologin, expologout
|
|
from troggle.core.views.caves import cavepage, ent
|
|
from troggle.core.views.expo import (editexpopage, expofiles_redirect,
|
|
expofilessingle, expopage, map,
|
|
mapfile, mediapage)
|
|
from troggle.core.views.logbooks import (Expeditions_jsonListView,
|
|
Expeditions_tsvListView,
|
|
expedition,
|
|
get_logbook_entries,
|
|
get_people, logbookentry,
|
|
notablepersons, person,
|
|
personexpedition)
|
|
from troggle.core.views.other import controlpanel
|
|
from troggle.core.views.prospect import prospecting, prospecting_image
|
|
from troggle.core.views.statistics import (dataissues, pathsreport,
|
|
stats)
|
|
from troggle.core.views.survex import (survexcavesingle,
|
|
survexcaveslist, svx)
|
|
|
|
class SubprocessTest(TestCase):
|
|
|
|
@classmethod
|
|
def setUpTestData(cls):
|
|
pass
|
|
|
|
def setUp(self):
|
|
pass
|
|
|
|
def tearDown(self):
|
|
pass
|
|
|
|
def test_utf8(self):
|
|
'''Expects that utf8 is the default encoding when opening files
|
|
'''
|
|
import locale
|
|
import sys
|
|
self.assertTrue( sys.getdefaultencoding() == "utf-8", f'{sys.getdefaultencoding()} - UTF8 error in getdefaultencoding')
|
|
self.assertTrue( sys.getfilesystemencoding() == "utf-8", f'{sys.getfilesystemencoding()} - UTF8 error in getfilesystemencoding')
|
|
self.assertTrue( locale.getdefaultlocale()[1] == "UTF-8", f'{locale.getdefaultlocale()} - UTF8 error in locale.getdefaultlocale')
|
|
self.assertTrue( locale.getpreferredencoding() == "UTF-8", f'{locale.getpreferredencoding()} - UTF8 error in locale.getpreferredencoding')
|
|
|
|
def test_installs(self):
|
|
''' Expects external software installed: cavern, survexport, git
|
|
(but not whether it actually works)
|
|
'''
|
|
import troggle.settings as settings
|
|
|
|
for i in [settings.CAVERN, settings.SURVEXPORT, settings.GIT]:
|
|
# Define command as string and then split() into list format
|
|
cmd = f'which {i}'.split()
|
|
try:
|
|
sp = subprocess.check_call(cmd, shell=False)
|
|
except subprocess.CalledProcessError:
|
|
self.assertTrue( False, f'no {i} installed')
|
|
|
|
def test_repos_git_status(self):
|
|
''' Expects clean git repos with no added files and no merge failures
|
|
'''
|
|
from pathlib import Path
|
|
|
|
import troggle.settings as settings
|
|
TROGGLE_PATH = Path(settings.REPOS_ROOT_PATH) / "troggle"
|
|
for cwd in [settings.SURVEX_DATA, settings.EXPOWEB, settings.DRAWINGS_DATA, TROGGLE_PATH]:
|
|
sp = subprocess.run([settings.GIT, "status"], cwd=cwd, capture_output=True, text=True)
|
|
out = str(sp.stdout)
|
|
if len(out) > 160:
|
|
out = out[:75] + "\n <Long output curtailed>\n" + out[-75:]
|
|
print(f'git output: {cwd}:\n # {sp.stderr=}\n # sp.stdout={out} \n # return code: {str(sp.returncode)}')
|
|
if sp.returncode != 0:
|
|
print(f'git output: {cwd}:\n # {sp.stderr=}\n # sp.stdout={out} \n # return code: {str(sp.returncode)}')
|
|
|
|
self.assertTrue( sp.returncode == 0, f'{cwd} - git is unhappy')
|
|
|
|
content = sp.stdout
|
|
ph = r'Your branch is up[ -]to[ -]date'
|
|
phmatch = re.search(ph, content)
|
|
msg = f'{cwd} - Failed to find expected git output: "{ph}"'
|
|
self.assertIsNotNone(phmatch, msg)
|
|
|
|
ph1 = r'no changes added to commit'
|
|
phmatch1 = re.search(ph1, content)
|
|
ph2 = r'nothing to commit'
|
|
phmatch2 = re.search(ph2, content)
|
|
phmatch = phmatch1 or phmatch2
|
|
msg = f'{cwd} - Failed to find expected git output: "{ph1}" or "{ph2}"'
|
|
self.assertIsNotNone(phmatch, msg)
|
|
|
|
def test_loser_survex_status(self):
|
|
''' Expects no failures of survex files
|
|
'''
|
|
from pathlib import Path
|
|
|
|
import troggle.settings as settings
|
|
cwd = settings.SURVEX_DATA
|
|
for survey in ["1623.svx", "1626.svx"]:
|
|
sp = subprocess.run([settings.CAVERN, survey], cwd=cwd, capture_output=True, text=True)
|
|
out = str(sp.stdout)
|
|
if len(out) > 160:
|
|
out = out[:75] + "\n <Long output curtailed>\n" + out[-75:]
|
|
# print(f'survex output: {cwd}:\n # {sp.stderr=}\n # sp.stdout={out} \n # return code: {str(sp.returncode)}')
|
|
if sp.returncode != 0:
|
|
print(f'survex output: {cwd}:\n # {sp.stderr=}\n # sp.stdout={out} \n # return code: {str(sp.returncode)}')
|
|
|
|
self.assertTrue( sp.returncode == 0, f'{cwd} - survex is unhappy')
|
|
|
|
content = sp.stdout
|
|
ph = r'Total length of survey legs'
|
|
phmatch = re.search(ph, content)
|
|
msg = f'{cwd} - Failed to find expected survex output: "{ph}"'
|
|
self.assertIsNotNone(phmatch, msg)
|
|
|
|
ph1 = r'Time used'
|
|
phmatch1 = re.search(ph1, content)
|
|
ph2 = r'vertical length of survey le'
|
|
phmatch2 = re.search(ph2, content)
|
|
|
|
phmatch = phmatch1 or phmatch2
|
|
msg = f'{cwd} - Failed to find expected survex output: "{ph1}" or "{ph2}"'
|
|
self.assertIsNotNone(phmatch, msg)
|
|
|