2
0
mirror of https://expo.survex.com/repositories/troggle/.git synced 2024-11-22 15:21:52 +00:00

Nearly fixed test suite

This commit is contained in:
Philip Sargent 2024-07-04 22:10:49 +03:00
parent b28b590b60
commit 57bab53cec
4 changed files with 170 additions and 140 deletions

View File

@ -6,9 +6,23 @@ import re
from http import HTTPStatus from http import HTTPStatus
from django.test import Client, TestCase from django.test import Client, TestCase
from django.contrib.auth.models import User
from troggle.core.models.caves import Cave from troggle.core.models.caves import Cave
from troggle.core.models.troggle import Person, PersonExpedition from troggle.core.models.troggle import Person, PersonExpedition, Expedition
from troggle.core.utils import current_expo
current_year = current_expo()
def create_user(name=None, last_name="Caver", is_superuser=False):
u = User()
u.username = name
u.email = f"philip.sargent+{name}@gmail.com"
u.first_name, u.last_name = name, last_name
u.set_password("secretword") # all test users have same password
u.save()
return u
# import troggle.settings as settings # import troggle.settings as settings
# FIXTURE_DIRS = settings.PYTHON_PATH / "core" /"fixtures" # FIXTURE_DIRS = settings.PYTHON_PATH / "core" /"fixtures"
@ -18,24 +32,52 @@ class FixtureTests(TestCase):
They do not exercise the GET and url functions They do not exercise the GET and url functions
""" """
fixtures = ["auth_users", "expo_caves", "expo_exped"] fixtures = ["expo_caves", "expo_exped"]
ph = r"and leads in 800m of tortuous going to" ph = r"and leads in 800m of tortuous going to"
def setUp(self): def setUp(self):
pass create_user(name="expo") # needed for current_year()
def tearDown(self): def tearDown(self):
pass User.objects.all().delete()
def test_fix_person_loaded(self): def test_fix_person_loaded_byname(self):
p = Person.objects.get(fullname="Michael Sargent") p = Person.objects.get(fullname="Michael Sargent")
self.assertEqual(str(p.first_name), "Michael") self.assertEqual(str(p.first_name), "Michael")
def test_fix_person_loaded(self): def test_fix_personexped_loaded_bypk(self):
pe = PersonExpedition.objects.get(pk="681") pe = PersonExpedition.objects.get(pk="681")
self.assertEqual(str(pe.person.fullname), "Michael Sargent") self.assertEqual(str(pe.person.fullname), "Michael Sargent")
self.assertEqual(str(pe.expedition.year), "2019") self.assertEqual(str(pe.expedition.year), "2019")
def test_fix_expedition_loaded(self):
e = Expedition.objects.get(pk="44")
self.assertEqual(str(e.year), "2019")
def test_page_person(self):
response = self.client.get("/person/michael-sargent")
content = response.content.decode()
# with open('testresponseperson.html','w') as tr:
# tr.writelines(content)
self.assertEqual(response.status_code, HTTPStatus.OK)
for ph in [r"Michael Sargent", r"has been on expo in the following years"]:
phmatch = re.search(ph, content)
self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph + "'")
def test_page_personexpedition(self):
# Not working despite all components present and correct
response = self.client.get("/personexpedition/michael-sargent/2019")
content = response.content.decode()
# with open('testresponse.html','w') as tr:
# tr.writelines(content)
self.assertEqual(response.status_code, HTTPStatus.OK)
for ph in [r"Michael Sargent", r"Table of all trips and surveys aligned by date"]:
phmatch = re.search(ph, content)
self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph + "'")
# Need to add a fixture so that this actually has a logbook entry and a trip/svx in it.
def test_fix_cave_loaded115(self): def test_fix_cave_loaded115(self):
c = Cave.objects.get(kataster_number="115") c = Cave.objects.get(kataster_number="115")
self.assertEqual(str(c.description_file), "1623/115.htm") self.assertEqual(str(c.description_file), "1623/115.htm")
@ -43,9 +85,6 @@ class FixtureTests(TestCase):
self.assertEqual(str(c.filename), "1623-115.html") self.assertEqual(str(c.filename), "1623-115.html")
self.assertEqual(str(c.areacode), "1623") self.assertEqual(str(c.areacode), "1623")
# c.area is a 'ManyRelatedManager' object and not iterable
# self.assertEqual(str(c.[0].short_name), "1623")
ph = self.ph ph = self.ph
phmatch = re.search(ph, c.underground_description) phmatch = re.search(ph, c.underground_description)
self.assertIsNotNone(phmatch, "In fixture-loaded cave, failed to find expected text: '" + ph + "'") self.assertIsNotNone(phmatch, "In fixture-loaded cave, failed to find expected text: '" + ph + "'")
@ -60,16 +99,6 @@ class FixtureTests(TestCase):
phmatch = re.search(ph, c.notes) phmatch = re.search(ph, c.notes)
self.assertIsNotNone(phmatch, "In fixture-loaded cave, failed to find expected text: '" + ph + "'") self.assertIsNotNone(phmatch, "In fixture-loaded cave, failed to find expected text: '" + ph + "'")
def test_page_personexpedition(self):
response = self.client.get("/personexpedition/michael-sargent/2019")
content = response.content.decode()
# with open('testresponse.html','w') as tr:
# tr.writelines(content)
self.assertEqual(response.status_code, HTTPStatus.OK)
for ph in [r"Michael Sargent", r"Table of all trips and surveys aligned by date"]:
phmatch = re.search(ph, content)
self.assertIsNotNone(phmatch, "Failed to find expected text: '" + ph + "'")
# Need to add a fixture so that this actually has a logbook entry and a trip/svx in it.
class FixturePageTests(TestCase): class FixturePageTests(TestCase):
@ -81,7 +110,7 @@ class FixturePageTests(TestCase):
# The fixtures have a password hash which is compatible with plain-text password 'secretword' # The fixtures have a password hash which is compatible with plain-text password 'secretword'
# The hash CHANGES whenever Django upgrades the encryption key length. Better to create the test uses # The hash CHANGES whenever Django upgrades the encryption key length. Better to create the test uses
# algorithmically and not via a fixture. # algorithmically and not via a fixture.
fixtures = ["auth_users", "expo_caves", "expo_exped"] fixtures = ["expo_caves", "expo_exped"]
ph = r"and leads in 800m of tortuous going to" ph = r"and leads in 800m of tortuous going to"
@classmethod @classmethod
@ -89,7 +118,9 @@ class FixturePageTests(TestCase):
pass pass
def setUp(self): def setUp(self):
from django.contrib.auth.models import User create_user(name="expo")
create_user(name="expotest")
create_user(name="expotestadmin", is_superuser = True)
self.user = User.objects.get(username="expotest") self.user = User.objects.get(username="expotest")
@ -97,7 +128,7 @@ class FixturePageTests(TestCase):
self.client = Client() self.client = Client()
def tearDown(self): def tearDown(self):
pass User.objects.all().delete()
def test_fix_expedition(self): def test_fix_expedition(self):
response = self.client.get("/expedition/2019") response = self.client.get("/expedition/2019")

View File

@ -14,55 +14,52 @@ from django.test import Client, TestCase
import troggle.settings as settings import troggle.settings as settings
from troggle.core.models.wallets import Wallet from troggle.core.models.wallets import Wallet
from troggle.core.models.troggle import Expedition from troggle.core.models.troggle import Expedition
from django.contrib.auth.models import User
from troggle.core.utils import current_expo
current_year = current_expo()
def create_user(name=None, last_name="Caver", is_superuser=False):
u = User()
u.username = name
u.email = f"philip.sargent+{name}@gmail.com"
u.first_name, u.last_name = name, last_name
u.set_password("secretword") # all test users have same password
u.save()
return u
class DataTests(TestCase): class DataTests(TestCase):
"""These check that the NULL and NON-UNIQUE constraints are working in the database""" """These check that the NULL and NON-UNIQUE constraints are working in the database
no tests here... !"""
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
pass pass
def setUp(self): def setUp(self):
from django.contrib.auth.models import User create_user(name="expo")
u = User()
u.pk = 9000
u.user_id = 8000
u.username, u.password = "stinker", "secretword"
u.email = "philip.sargent+SP@gmail.com"
u.first_name, u.last_name = "Stinker", "Pinker"
u.save()
self.user = u
def tearDown(self): def tearDown(self):
# self.member.delete() # must delete member before user Users.objects.all().delete()
# self.user.delete() # horrible crash, why?
pass
class FixturePageTests(TestCase): class LoginTests(TestCase):
# The fixtures have a password hash which is compatible with plain-text password 'secretword'
fixtures = ["auth_users"]
def setUp(self): def setUp(self):
from django.contrib.auth.models import User create_user(name="expo")
create_user(name="expotest")
self.user = User.objects.get(username="expotest") create_user(name="expotestadmin", is_superuser = True)
def tearDown(self): def tearDown(self):
pass User.objects.all().delete()
def test_fix_admin_login_fail(self): def test_fix_admin_login_fail(self):
c = self.client c = self.client
from django.contrib.auth.models import User
u = User.objects.get(username="expotest") u = User.objects.get(username="expotest")
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
logged_in = c.login(username=u.username, password="secretword") # fails to work if password=u.password !
self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'")
response = c.get("/admin/") response = c.get("/admin/")
content = response.content.decode() content = response.content.decode()
@ -75,17 +72,16 @@ class FixturePageTests(TestCase):
class PostTests(TestCase): class PostTests(TestCase):
"""Tests walletedit form""" """Tests walletedit form"""
fixtures = ["auth_users"]
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
pass pass
def setUp(self): def setUp(self):
from django.contrib.auth.models import User create_user(name="expo")
create_user(name="expotestadmin", is_superuser = True)
self.user = create_user(name="expotest")
self.user = User.objects.get(username="expotest") c = self.client
self.client = Client()
testyear = "2022" testyear = "2022"
wname = f"{testyear}:00" wname = f"{testyear}:00"
@ -102,14 +98,17 @@ class PostTests(TestCase):
e.save() e.save()
self.expedition = e self.expedition = e
def tearDown(self):
User.objects.all().delete()
Wallet.objects.all().delete()
Expedition.objects.all().delete()
def test_file_permissions(self): def test_file_permissions(self):
"""Expect to be allowed to write to SCANS_ROOT, DRAWINGS_DATA, SURVEX_DATA, EXPOWEB """Expect to be allowed to write to SCANS_ROOT, DRAWINGS_DATA, SURVEX_DATA, EXPOWEB
Need to login first. Need to login first.
""" """
c = self.client c = self.client
from django.contrib.auth.models import User u = self.user
u = User.objects.get(username="expotest")
testyear = self.testyear testyear = self.testyear
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE") self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
@ -173,14 +172,12 @@ class PostTests(TestCase):
def test_photo_upload(self): def test_photo_upload(self):
"""Expect photo upload to work on any file (contrary to msg on screen) """Expect photo upload to work on any file (contrary to msg on screen)
Upload into current default year. settings.PHOTOS_YEAR Upload into current default year.
Deletes file afterwards Deletes file afterwards
Need to login first. Need to login first.
""" """
c = self.client c = self.client
from django.contrib.auth.models import User u = self.user
u = User.objects.get(username="expotest")
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE") self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
c.login(username=u.username, password="secretword") c.login(username=u.username, password="secretword")
@ -192,11 +189,11 @@ class PostTests(TestCase):
content = response.content.decode() content = response.content.decode()
self.assertEqual(response.status_code, HTTPStatus.OK) self.assertEqual(response.status_code, HTTPStatus.OK)
self.assertEqual(response.status_code, HTTPStatus.OK) self.assertEqual(response.status_code, HTTPStatus.OK)
# with open('_test_response.html', 'w') as f: with open('_test_response.html', 'w') as f:
# f.write(content) f.write(content)
for ph in [ for ph in [
r"test_upload_", r"test_upload_",
r"Upload photos into /photos/" + str(settings.PHOTOS_YEAR), r"Upload photos into /photos/" + str(current_year),
r" you can create a new folder in your name", r" you can create a new folder in your name",
r"Create new Photographer folder", r"Create new Photographer folder",
r"only photo image files are accepted", r"only photo image files are accepted",
@ -206,19 +203,17 @@ class PostTests(TestCase):
# Does not use the filename Django actually uses, assumes it is unchanged. Bug: accumulates one file with random name # Does not use the filename Django actually uses, assumes it is unchanged. Bug: accumulates one file with random name
# added each time it is run. The name of the uploaded file is only available within the code where it happens # added each time it is run. The name of the uploaded file is only available within the code where it happens
remove_file = pathlib.Path(settings.PHOTOS_ROOT, settings.PHOTOS_YEAR) / "test_upload_file.txt" remove_file = pathlib.Path(settings.PHOTOS_ROOT, current_year) / "test_upload_file.txt"
remove_file.unlink() remove_file.unlink()
def test_photo_upload_rename(self): def test_photo_upload_rename(self):
"""Expect photo upload to work on any file (contrary to msg on screen) """Expect photo upload to work on any file (contrary to msg on screen)
Upload into current default year. settings.PHOTOS_YEAR Upload into current default year.
Deletes file afterwards Deletes file afterwards
Need to login first. Need to login first.
""" """
c = self.client c = self.client
from django.contrib.auth.models import User u = self.user
u = User.objects.get(username="expotest")
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE") self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
c.login(username=u.username, password="secretword") c.login(username=u.username, password="secretword")
@ -239,19 +234,20 @@ class PostTests(TestCase):
# Does not use the filename Django actually uses, assumes it is unchanged. Bug: accumulates one file with random name # Does not use the filename Django actually uses, assumes it is unchanged. Bug: accumulates one file with random name
# added each time it is run. The name of the uploaded file is only available within the code where it happens # added each time it is run. The name of the uploaded file is only available within the code where it happens
remove_file = pathlib.Path(settings.PHOTOS_ROOT, settings.PHOTOS_YEAR) / rename remove_file = pathlib.Path(settings.PHOTOS_ROOT, current_year) / rename
remove_file.unlink() if remove_file.is_file():
remove_file.unlink()
def test_photo_folder_create(self): def test_photo_folder_create(self):
"""Create folder for new user """Create folder for new user
Create in current default year. settings.PHOTOS_YEAR Create in current year.
Deletes folder afterwards Deletes folder afterwards
Need to login first. Need to login first.
""" """
c = self.client c = self.client
from django.contrib.auth.models import User u = self.user
u = User.objects.get(username="expotest")
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE") self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
c.login(username=u.username, password="secretword") c.login(username=u.username, password="secretword")
@ -268,17 +264,17 @@ class PostTests(TestCase):
# Does not use the filename Django actually uses, assumes it is unchanged. Bug: accumulates one file with random name # Does not use the filename Django actually uses, assumes it is unchanged. Bug: accumulates one file with random name
# added each time it is run. The name of the uploaded file is only available within the code where it happens # added each time it is run. The name of the uploaded file is only available within the code where it happens
remove_dir = pathlib.Path(settings.PHOTOS_ROOT, settings.PHOTOS_YEAR) / "GussieFinkNottle" remove_dir = pathlib.Path(settings.PHOTOS_ROOT, current_year) / "GussieFinkNottle"
remove_dir.rmdir() if remove_dir.is_dir():
remove_dir.rmdir()
def test_dwg_upload_txt(self): def test_dwg_upload_txt(self):
"""Expect .pdf file to be refused upload """Expect .pdf file to be refused upload
Need to login first. Need to login first.
""" """
c = self.client c = self.client
from django.contrib.auth.models import User u = self.user
u = User.objects.get(username="expotest")
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE") self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
c.login(username=u.username, password="secretword") c.login(username=u.username, password="secretword")
@ -298,9 +294,8 @@ class PostTests(TestCase):
Need to login first. Need to login first.
""" """
c = self.client c = self.client
from django.contrib.auth.models import User u = self.user
u = User.objects.get(username="expotest")
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE") self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
c.login(username=u.username, password="secretword") c.login(username=u.username, password="secretword")
@ -327,7 +322,8 @@ class PostTests(TestCase):
# added each time it is run. The name of the uploaded file is only available within the code where it happens # added each time it is run. The name of the uploaded file is only available within the code where it happens
# UploadedFile.name see https://docs.djangoproject.com/en/4.1/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile # UploadedFile.name see https://docs.djangoproject.com/en/4.1/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile
remove_file = pathlib.Path(settings.DRAWINGS_DATA) / "uploads" / "test_upload_nosuffix" remove_file = pathlib.Path(settings.DRAWINGS_DATA) / "uploads" / "test_upload_nosuffix"
remove_file.unlink() if remove_file.is_file():
remove_file.unlink()
class ComplexLoginTests(TestCase): class ComplexLoginTests(TestCase):
@ -335,27 +331,14 @@ class ComplexLoginTests(TestCase):
def setUp(self): def setUp(self):
"""setUp runs once for each test in this class""" """setUp runs once for each test in this class"""
from django.contrib.auth.models import User create_user(name="expo")
create_user(name="expotest")
u = User() create_user(name="expotestadmin", is_superuser = True)
u.pk = 9000
u.user_id = 8000
u.username, u.password = "expotest", "secretword"
u.email = "philip.sargent+ET@gmail.com"
u.first_name, u.last_name = "ExpoTest", "Caver"
u.is_staff = True
u.is_superuser = True
u.set_password(u.password) # This creates a new salt and thus a new key for EACH test
u.save() # vital that we save all this before attempting login
# print ('\n',u.password)
self.user = u
def tearDown(self): def tearDown(self):
self.client.logout() # not needed as each test creates a new self.client self.client.logout() # not needed as each test creates a new self.client
# self.member.delete() User.objects.all().delete()
##self.user.delete() # id attribute set to None !
pass
# def test_login_redirect_for_non_logged_on_user(self): # need to fix this in real system # def test_login_redirect_for_non_logged_on_user(self): # need to fix this in real system
# c = self.client # c = self.client
@ -365,11 +348,11 @@ class ComplexLoginTests(TestCase):
def test_ordinary_login(self): def test_ordinary_login(self):
c = self.client c = self.client
u = self.user u = User.objects.get(username="expotest")
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE") self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
logged_in = c.login(username=u.username, password="secretword") # fails to work if password=u.password ! logged_in = c.login(username=u.username, password="secretword")
self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'") self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'")
response = c.get("/accounts/login/") # defined by auth system response = c.get("/accounts/login/") # defined by auth system
@ -379,14 +362,14 @@ class ComplexLoginTests(TestCase):
def test_authentication_login(self): def test_authentication_login(self):
c = self.client c = self.client
u = self.user u = User.objects.get(username="expotest")
self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE") self.assertTrue(u.is_active, "User '" + u.username + "' is INACTIVE")
# This is weird. I thought that the user had to login before she was in the authenticated state # This is weird. I thought that the user had to login before she was in the authenticated state
self.assertTrue(u.is_authenticated, "User '" + u.username + "' is NOT AUTHENTICATED before login") self.assertTrue(u.is_authenticated, "User '" + u.username + "' is NOT AUTHENTICATED before login")
logged_in = c.login(username=u.username, password="secretword") # fails to work if password=u.password ! logged_in = c.login(username=u.username, password="secretword")
self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'") self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'")
self.assertTrue(u.is_authenticated, "User '" + u.username + "' is NOT AUTHENTICATED after login") self.assertTrue(u.is_authenticated, "User '" + u.username + "' is NOT AUTHENTICATED after login")
@ -396,24 +379,26 @@ class ComplexLoginTests(TestCase):
def test_admin_login(self): def test_admin_login(self):
c = self.client c = self.client
u = self.user u = User.objects.get(username="expotestadmin")
logged_in = c.login(username=u.username, password="secretword") # fails to work if password=u.password ! logged_in = c.login(username=u.username, password="secretword")
self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'") self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'")
response = c.get("/admin/") response = c.get("/admin/login/")
content = response.content.decode() content = response.content.decode()
# with open('admin-op.html', 'w') as f: # fn='admin-op.html'
# f.write(content) # print(f"Writing {fn}")
# with open(fn, 'w') as f:
# f.write(content)
t = re.search(r"Troggle database administration", content) t = re.search(r"Troggle database administration", content)
self.assertIsNotNone(t, "Logged in as '" + u.username + "' but failed to get the Troggle Admin page") self.assertIsNotNone(t, "Logged in as '" + u.username + "' but failed to get the Troggle Admin page")
def test_noinfo_login(self): def test_noinfo_login(self):
c = self.client # inherited from TestCase c = self.client # inherited from TestCase
u = self.user u = User.objects.get(username="expotest")
logged_in = c.login(username=u.username, password="secretword") # fails if password=u.password ! logged_in = c.login(username=u.username, password="secretword")
self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'") self.assertTrue(logged_in, "FAILED to login as '" + u.username + "'")
response = c.get("/stats") # a page with the Troggle menus response = c.get("/stats") # a page with the Troggle menus
content = response.content.decode() content = response.content.decode()
@ -428,7 +413,7 @@ class ComplexLoginTests(TestCase):
def test_user_force(self): def test_user_force(self):
c = self.client c = self.client
u = self.user u = User.objects.get(username="expotest")
try: try:
c.force_login(u) c.force_login(u)

View File

@ -23,33 +23,45 @@ import unittest
from http import HTTPStatus from http import HTTPStatus
from django.test import Client, SimpleTestCase, TestCase from django.test import Client, SimpleTestCase, TestCase
from django.contrib.auth.models import User
from troggle.core.models.logbooks import LogbookEntry from troggle.core.models.logbooks import LogbookEntry
from troggle.core.models.troggle import Expedition, DataIssue, Person, PersonExpedition from troggle.core.models.troggle import Expedition, DataIssue, Person, PersonExpedition
from troggle.core.utils import current_expo
import troggle.parsers.logbooks as lbp import troggle.parsers.logbooks as lbp
current_year = current_expo()
def create_user(name=None, last_name="Caver", is_superuser=False):
u = User()
u.username = name
u.email = f"philip.sargent+{name}@gmail.com"
u.first_name, u.last_name = name, last_name
u.set_password("secretword") # all test users have same password
u.save()
return u
def create_person(firstname, lastname, nickname=False, vfho=False, exped=None):
fullname = f"{firstname} {lastname}"
slug=f"{firstname.lower()}-{lastname.lower()}"
coUniqueAttribs = {"first_name": firstname, "last_name": (lastname or ""), "slug": slug,}
otherAttribs = {"is_vfho": vfho, "fullname": fullname, "nickname": nickname}
person = Person.objects.create(**otherAttribs, **coUniqueAttribs)
coUniqueAttribs = {"person": person, "expedition": exped}
otherAttribs = {}
pe = PersonExpedition.objects.create(**otherAttribs, **coUniqueAttribs)
return person
TEST_YEAR = "1986" TEST_YEAR = "1986"
lbp.ENTRIES[TEST_YEAR] = 4 # number of entries in the test logbook lbp.ENTRIES[TEST_YEAR] = 4 # number of entries in the test logbook
class ImportTest(TestCase): class ImportTest(TestCase):
# see test_logins.py for the tests to check that logged-in users work # see test_logins.py for the tests to check that logged-in users work
fixtures = ["auth_users"] # contains user 'expotest' with a hash => password = 'secretword'
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
def make_person(firstname, lastname, nickname=False, vfho=False):
fullname = f"{firstname} {lastname}"
slug=f"{firstname.lower()}-{lastname.lower()}"
coUniqueAttribs = {"first_name": firstname, "last_name": (lastname or ""), "slug": slug,}
otherAttribs = {"is_vfho": vfho, "fullname": fullname, "nickname": nickname}
person = Person.objects.create(**otherAttribs, **coUniqueAttribs)
coUniqueAttribs = {"person": person, "expedition": cls.test_expo}
otherAttribs = {}
pe = PersonExpedition.objects.create(**otherAttribs, **coUniqueAttribs)
return person
import troggle.settings as settings import troggle.settings as settings
LOGBOOKS_PATH = settings.EXPOWEB / lbp.LOGBOOKS_DIR LOGBOOKS_PATH = settings.EXPOWEB / lbp.LOGBOOKS_DIR
@ -63,21 +75,23 @@ class ImportTest(TestCase):
otherAttribs = {"name": f"CUCC expo-test {TEST_YEAR}"} otherAttribs = {"name": f"CUCC expo-test {TEST_YEAR}"}
cls.test_expo = Expedition.objects.create(**otherAttribs, **coUniqueAttribs) cls.test_expo = Expedition.objects.create(**otherAttribs, **coUniqueAttribs)
fred = make_person("Fred", "Smartarse", nickname="freddy") fred = create_person("Fred", "Smartarse", nickname="freddy", exped=cls.test_expo)
phil = make_person("Phil", "Tosser", nickname="tosspot") phil = create_person("Phil", "Tosser", nickname="tosspot", exped=cls.test_expo)
dave = make_person("David", "Smartarse", "") dave = create_person("David", "Smartarse", "", exped=cls.test_expo)
mike = make_person("Michael", "Wideboy", "WB", vfho=True) mike = create_person("Michael", "Wideboy", "WB", vfho=True, exped=cls.test_expo)
# NOT created Kurt, as the whole point is that he is a guest. # NOT created Kurt, as the whole point is that he is a guest.
def setUp(self): def setUp(self):
from django.contrib.auth.models import User create_user(name="expo") # needed for current_year()
self.user = create_user(name="expotest")
self.user = User.objects.get(username="expotest") # has password 'secretword' from fixture
self.client = Client() self.client = Client()
def tearDown(self): def tearDown(self):
pass User.objects.all().delete()
Person.objects.all().delete()
PersonExpedition.objects.all().delete()
Expedition.objects.all().delete()
def test_logbook_exists(self): def test_logbook_exists(self):
self.assertTrue(self.test_logbook.is_file()) self.assertTrue(self.test_logbook.is_file())
@ -184,7 +198,7 @@ class ImportTest(TestCase):
response = self.client.get(f"/aliases/{TEST_YEAR}") response = self.client.get(f"/aliases/{TEST_YEAR}")
self.assertEqual(response.status_code, HTTPStatus.OK) self.assertEqual(response.status_code, HTTPStatus.OK)
content = response.content.decode() content = response.content.decode()
# with open('_test_response.html', 'w') as f: # with open('_test_responsealiases.html', 'w') as f:
# f.write(content) # f.write(content)
ph = f"'fsmartarse'" ph = f"'fsmartarse'"
phmatch = re.search(ph, content) phmatch = re.search(ph, content)

View File

@ -124,7 +124,7 @@ def current_expo():
last_expo = expos[0].year last_expo = expos[0].year
if int(last_expo) < int(year): # coming year, after Dec.31st if int(last_expo) < int(year): # coming year, after Dec.31st
for y in range(int(last_expo)+1, int(year)+1): for y in range(int(last_expo)+1, int(year)+1):
print(f"--!{year}---") #print(f"--!{year}---")
make_new_expo(str(y)) make_new_expo(str(y))
make_new_expo_dir(str(y)) make_new_expo_dir(str(y))