]> ToastFreeware Gitweb - philipp/winterrodeln/wradmin.git/blob - tests/test_wradmin.py
Document better way to use unittests.
[philipp/winterrodeln/wradmin.git] / tests / test_wradmin.py
1 """How to test wradmin:
2
3 WRADMIN_SETTINGS=../wradmin/test.cfg python3 -m unittest tests.test_wradmin
4 """
5 import unittest
6 import xml.etree.ElementTree as et
7 import sqlalchemy
8 from sqlalchemy.engine.url import URL, make_url
9 import bs4  # beautiful soup
10 import wradmin
11
12
13 class WradminTestBase(unittest.TestCase):
14     def setUp(self):
15         wradmin.app.config['TESTING'] = True
16         self.app = wradmin.app.test_client()
17
18
19 class TestNoDbWradmin(WradminTestBase):
20     def test_root(self):
21         result = self.app.get('/')
22         self.assertEqual(result.status_code, 200)
23         self.assertTrue(result.data.startswith(b'<!DOCTYPE html'))
24         soup = bs4.BeautifulSoup(result.data, 'html.parser')
25         self.assertEqual(soup.title.text, 'Hauptmenü')
26
27
28 class TestDbWradmin(WradminTestBase):
29     def setUp(self):
30         super().setUp()
31         with wradmin.app.app_context():
32             # create database
33             uri = make_url(wradmin.app.config['DATABASE_URI'])
34             self.uri = uri
35             uri_nodb = URL(uri.drivername, host=uri.host, port=uri.port, username=uri.username, password=uri.password, query=uri.query)
36             engine_nodb = sqlalchemy.create_engine(uri_nodb)
37             engine_nodb.execute("DROP DATABASE IF EXISTS {}".format(uri.database))
38             engine_nodb.execute("CREATE DATABASE {} CHARACTER SET = '{}'".format(uri.database, 'UTF8'))
39
40             # connect to database
41             self.engine = sqlalchemy.create_engine(uri)
42             con = self.engine.connect()
43
44             # fill database
45             with open('tests/testdb.sql', 'r') as f:
46                 sql = f.read()
47             con.execute(sql)
48
49             # update dates
50             seconds_diff, = con.execute("SELECT TIMESTAMPDIFF(SECOND, '2017-03-31 07:00', now())").fetchone()
51             seconds_diff = int(seconds_diff)
52             con.execute("UPDATE wrreport SET date_report = DATE(date_report + INTERVAL %s SECOND) WHERE time_report IS NULL", (seconds_diff,))
53             con.execute("UPDATE wrreport SET date_report = DATE(TIMESTAMP(date_report, time_report) + INTERVAL %s SECOND) WHERE time_report IS NOT NULL", (seconds_diff,))
54             con.execute("UPDATE wrreport SET time_report = TIME(TIMESTAMP(date_report, time_report) + INTERVAL %s SECOND) WHERE time_report IS NOT NULL", (seconds_diff,))
55             con.execute("UPDATE wrreport SET date_entry = date_entry + INTERVAL %s SECOND", (seconds_diff,))
56             con.execute("UPDATE wrreport SET date_invalid = date_invalid + INTERVAL %s SECOND", (seconds_diff,))
57             con.execute("UPDATE wrreport SET delete_date = delete_date + INTERVAL %s SECOND", (seconds_diff,))
58
59     def test_reports(self):
60         result = self.app.get('/bericht/list')
61         self.assertEqual(result.status_code, 200)
62         self.assertTrue(result.data.startswith(b'<!DOCTYPE html'))
63         soup = bs4.BeautifulSoup(result.data, 'html.parser')
64         self.assertEqual(soup.title.text, 'Rodelbahnberichte')
65
66     def tearDown(self):
67         with wradmin.app.app_context():
68             self.engine.execute("DROP DATABASE {}".format(self.uri.database))