"""How to test wradmin:
-WRADMIN_SETTINGS=../wradmin/test.cfg python3 -m unittest tests/test_wradmin.py
+WRADMIN_SETTINGS=../wradmin/test.cfg python3 -m unittest tests.test_wradmin
"""
import unittest
-import xml.etree.ElementTree as et
-import sqlalchemy
-from sqlalchemy.engine.url import URL, make_url
import bs4 # beautiful soup
+import wradmin.model
import wradmin
def test_root(self):
result = self.app.get('/')
self.assertEqual(result.status_code, 200)
- self.assertTrue(result.data.startswith(b'<!DOCTYPE html'))
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
soup = bs4.BeautifulSoup(result.data, 'html.parser')
self.assertEqual(soup.title.text, 'Hauptmenü')
+ def test_coordtool(self):
+ result = self.app.get('/coordtool/index')
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertEqual(soup.title.text, 'Koordinaten-Rechner')
+
+ def test_coordtool_convert_ok(self):
+ result = self.app.post('/coordtool/convert', data={'input': '47.987, 11.123'}, follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertEqual(soup.title.text, 'Koordinaten-Rechner')
+ self.assertIn('GPX Format', str(soup))
+
+ def test_coordtool_convert_error(self):
+ result = self.app.post('/coordtool/convert', data={'input': 'abc'}, follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertEqual(soup.title.text, 'Koordinaten-Rechner')
+ self.assertIn('no known format', str(soup))
+
class TestDbWradmin(WradminTestBase):
def setUp(self):
super().setUp()
with wradmin.app.app_context():
- # create database
- uri = make_url(wradmin.app.config['DATABASE_URI'])
- self.uri = uri
- uri_nodb = URL(uri.drivername, host=uri.host, port=uri.port, username=uri.username, password=uri.password, query=uri.query)
- engine_nodb = sqlalchemy.create_engine(uri_nodb)
- engine_nodb.execute("DROP DATABASE IF EXISTS {}".format(uri.database))
- engine_nodb.execute("CREATE DATABASE {} CHARACTER SET = '{}'".format(uri.database, 'UTF8'))
-
- # connect to database
- self.engine = sqlalchemy.create_engine(uri)
- con = self.engine.connect()
-
# fill database
with open('tests/testdb.sql', 'r') as f:
sql = f.read()
- con.execute(sql)
-
- # update dates
- seconds_diff, = con.execute("SELECT TIMESTAMPDIFF(SECOND, '2017-03-31 07:00', now())").fetchone()
- seconds_diff = int(seconds_diff)
- con.execute("UPDATE wrreport SET date_report = DATE(date_report + INTERVAL %s SECOND) WHERE time_report IS NULL", (seconds_diff,))
- con.execute("UPDATE wrreport SET date_report = DATE(TIMESTAMP(date_report, time_report) + INTERVAL %s SECOND) WHERE time_report IS NOT NULL", (seconds_diff,))
- con.execute("UPDATE wrreport SET time_report = TIME(TIMESTAMP(date_report, time_report) + INTERVAL %s SECOND) WHERE time_report IS NOT NULL", (seconds_diff,))
- con.execute("UPDATE wrreport SET date_entry = date_entry + INTERVAL %s SECOND", (seconds_diff,))
- con.execute("UPDATE wrreport SET date_invalid = date_invalid + INTERVAL %s SECOND", (seconds_diff,))
- con.execute("UPDATE wrreport SET delete_date = delete_date + INTERVAL %s SECOND", (seconds_diff,))
-
- def test_reports(self):
+ with wradmin.model.meta.engine.begin() as con:
+ con.execute(sql)
+
+ # update dates
+ seconds_diff, = con.execute("SELECT TIMESTAMPDIFF(SECOND, '2017-03-31 07:00', now())").fetchone()
+ seconds_diff = int(seconds_diff)
+ con.execute("UPDATE wrreport SET date_report = DATE(date_report + INTERVAL %s SECOND) WHERE time_report IS NULL", (seconds_diff,))
+ con.execute("UPDATE wrreport SET date_report = DATE(TIMESTAMP(date_report, time_report) + INTERVAL %s SECOND) WHERE time_report IS NOT NULL", (seconds_diff,))
+ con.execute("UPDATE wrreport SET time_report = TIME(TIMESTAMP(date_report, time_report) + INTERVAL %s SECOND) WHERE time_report IS NOT NULL", (seconds_diff,))
+ con.execute("UPDATE wrreport SET date_entry = date_entry + INTERVAL %s SECOND", (seconds_diff,))
+ con.execute("UPDATE wrreport SET date_invalid = date_invalid + INTERVAL %s SECOND", (seconds_diff,))
+ con.execute("UPDATE wrreport SET delete_date = delete_date + INTERVAL %s SECOND", (seconds_diff,))
+
+ def test_bericht_list(self):
result = self.app.get('/bericht/list')
self.assertEqual(result.status_code, 200)
- self.assertTrue(result.data.startswith(b'<!DOCTYPE html'))
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
soup = bs4.BeautifulSoup(result.data, 'html.parser')
self.assertEqual(soup.title.text, 'Rodelbahnberichte')
- def tearDown(self):
- with wradmin.app.app_context():
- self.engine.execute("DROP DATABASE {}".format(self.uri.database))
+ def test_bericht_view(self):
+ result = self.app.get('/bericht/view/19591')
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertEqual(soup.title.text, 'Rodelbahnbericht #19591')
+ self.assertIn('Brandstatt Alm', str(soup.table))
+
+ def test_bericht_change_date_invalid_twoweeks(self):
+ post_data = {'date_invalid': 'two_weeks', 'date_userdefined': '2018-01-30 18:26'}
+ result = self.app.post('/bericht/change_date_invalid/19591', data=post_data, follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertEqual(soup.title.text, 'Rodelbahnbericht #19591')
+ self.assertIn('Datum wurde erfolgreich geändert', str(soup))
+
+ def test_bericht_change_date_invalid_userdefined(self):
+ post_data = {'date_invalid': 'userdefined', 'date_userdefined': '2018-01-30 15:09'}
+ result = self.app.post('/bericht/change_date_invalid/19591', data=post_data, follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertEqual(soup.title.text, 'Rodelbahnbericht #19591')
+ self.assertIn('Datum wurde erfolgreich geändert', str(soup))
+ self.assertIn('2018-01-30 15:09:00', str(soup))
+
+ def test_gasthaus_list(self):
+ result = self.app.get('/gasthaus/list')
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertEqual(soup.title.text, 'Gasthäuser')
+ self.assertIn('Meißner', str(soup.table))
+
+ def test_gasthaus_view(self):
+ result = self.app.get('/gasthaus/view/362')
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertIn('Gasthaus', soup.title.text)
+ self.assertIn('Meißner', str(soup))
+
+ def test_gasthaus_update_success(self):
+ result = self.app.get('/gasthaus/update', follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertIn('Die Gasthausliste wurde erfolgreich aktualisiert.', str(soup))
+
+ def test_gasthaus_update_fail(self):
+ session = wradmin.model.meta.Session
+ text = session.query(wradmin.model.MwText).get(8719)
+ text.old_text = text.old_text.replace('maria-waldrast@aon.at', 'abc@def@example.com')
+ session.commit()
+ result = self.app.get('/gasthaus/update', follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertIn('Fehler bei Gasthaus \'Maria Waldrast (Klostergasthaus)\'', str(soup))
+
+ def test_rodelbahn_list(self):
+ result = self.app.get('/rodelbahn/list')
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertEqual(soup.title.text, 'Rodelbahnen')
+ table = soup.find('table')
+ self.assertIsNotNone(table)
+ rows = table.find_all('tr')
+ self.assertEqual(len(rows), 9+1)
+
+ def test_rodelbahn_view(self):
+ result = self.app.get('/rodelbahn/view/926')
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertIn('Rodelbahn', soup.title.text)
+ self.assertIn('Hühnerspiel', str(soup))
+
+ def test_rodelbahn_update_success(self):
+ result = self.app.get('/rodelbahn/update', follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertIn('Die Rodelbahnliste wurde erfolgreich aktualisiert.', str(soup))
+
+ def test_rodelbahn_update_fail(self):
+ session = wradmin.model.meta.Session
+ text = session.query(wradmin.model.MwText).get(12106)
+ text.old_text = text.old_text.replace('Schwierigkeit = mittel', 'Schwierigkeit = geht so')
+ session.commit()
+ result = self.app.get('/rodelbahn/update', follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertIn('Fehler bei Rodelbahn \'Juifenalm\'', str(soup))
+
+ def test_rodelbahn_update_regioncache(self):
+ result = self.app.get('/rodelbahn/update_regioncache', follow_redirects=True)
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue(result.data.startswith(b'<!doctype html'))
+ soup = bs4.BeautifulSoup(result.data, 'html.parser')
+ self.assertIn('Die Rodelbahneinträge in den Regionslisten wurden erfolgreich aktualisiert.', str(soup))