]> ToastFreeware Gitweb - philipp/winterrodeln/wrfeed.git/blob - tests/test_wrfeed.py
Set version number to 0.4.1.
[philipp/winterrodeln/wrfeed.git] / tests / test_wrfeed.py
1 """How to test wrfeed:
2
3 To prepare a system for testing, create a database philipp_winterrodeln_wiki_wrfeed_test with mysql:
4 echo 'create database philipp_winterrodeln_wiki_wrfeed_test;' | mysql
5 mysql philipp_winterrodeln_wiki_wrfeed_test < testdb.sql
6
7 WRFEED_SETTINGS=../wrfeed/test.cfg python3 -m unittest tests/test_wrfeed.py
8 """
9 import unittest
10 import xml.etree.ElementTree as et
11 import sqlalchemy
12 from sqlalchemy.engine.url import URL, make_url
13 import wrfeed
14
15
16 class WrfeedTestBase(unittest.TestCase):
17     def setUp(self):
18         wrfeed.app.config['TESTING'] = True
19         self.app = wrfeed.app.test_client()
20
21
22 class TestNoDbWrfeed(WrfeedTestBase):
23     def test_root(self):
24         result = self.app.get('/')
25         self.assertTrue(result.data.startswith(b'<?xml version='))
26         self.assertIn(b'page about feeds', result.data)
27
28
29 class TestDbWrfeed(WrfeedTestBase):
30     def setUp(self):
31         super().setUp()
32         with wrfeed.app.app_context():
33             # create database
34             uri = make_url(wrfeed.app.config['SQLALCHEMY_DATABASE_URI'])
35             self.uri = uri
36             uri_nodb = URL(uri.drivername, host=uri.host, port=uri.port, username=uri.username,
37                            password=uri.password, query=uri.query)
38             engine_nodb = sqlalchemy.create_engine(uri_nodb)
39             engine_nodb.execute("DROP DATABASE IF EXISTS {}".format(uri.database))
40             engine_nodb.execute("CREATE DATABASE {} CHARACTER SET = '{}'".format(uri.database, 'UTF8'))
41
42             # connect to database
43             self.engine = sqlalchemy.create_engine(uri)
44             con = self.engine.connect()
45
46             # fill database
47             with open('tests/testdb.sql', 'r') as f:
48                 sql = f.read()
49             con.execute(sql)
50
51             # update dates
52             seconds_diff, = con.execute("SELECT TIMESTAMPDIFF(SECOND, '2017-03-31 07:00', now())").fetchone()
53             seconds_diff = int(seconds_diff)
54             con.execute("UPDATE wrreport SET date_report = DATE(date_report + INTERVAL %s SECOND) "
55                         "WHERE time_report IS NULL", (seconds_diff,))
56             con.execute("UPDATE wrreport SET date_report = "
57                         "DATE(TIMESTAMP(date_report, time_report) + INTERVAL %s SECOND) "
58                         "WHERE time_report IS NOT NULL", (seconds_diff,))
59             con.execute("UPDATE wrreport SET time_report = "
60                         "TIME(TIMESTAMP(date_report, time_report) + INTERVAL %s SECOND) "
61                         "WHERE time_report IS NOT NULL", (seconds_diff,))
62             con.execute("UPDATE wrreport SET date_entry = date_entry + INTERVAL %s SECOND", (seconds_diff,))
63             con.execute("UPDATE wrreport SET date_invalid = date_invalid + INTERVAL %s SECOND", (seconds_diff,))
64             con.execute("UPDATE wrreport SET delete_date = delete_date + INTERVAL %s SECOND", (seconds_diff,))
65
66     def test_alle(self):
67         result = self.app.get('/berichte/alle')
68         self.assertTrue(result.data.startswith(b'<?xml'))
69         root = et.fromstring(result.data)
70         self.assertIn('Rodelbahnberichte', root.find('{http://www.w3.org/2005/Atom}title').text)
71         self.assertEqual(len(root.findall('{http://www.w3.org/2005/Atom}entry')), 7)
72
73     def test_bahn(self):
74         bahn_count = {
75             'haunold': 1,
76             'pleisenhütte_axamer_lizum': 2,
77             'prantner_alm': 0,
78             'birgitzer_alm_(vom_adelshof)': 1,
79         }
80         for bahn, count in bahn_count.items():
81             with self.subTest(bahn=bahn):
82                 result = self.app.get('/berichte/bahn/{}'.format(bahn))
83                 self.assertTrue(result.data.startswith(b'<?xml'))
84                 root = et.fromstring(result.data)
85                 self.assertIn('Rodelbahnberichte', root.find('{http://www.w3.org/2005/Atom}title').text)
86                 self.assertEqual(len(root.findall('{http://www.w3.org/2005/Atom}entry')), count,
87                                  '"{}" not found {} times'.format(bahn, count))
88
89     def test_bahnen(self):
90         bahnen_count = {
91             '761': 2,
92             '793': 0,
93             '100': 0,
94             '1417': 1,
95             '5': 1,
96             '228': 1,
97             '793+100': 0,
98             '761+1417+5+228': 5,
99         }
100         for bahnen, count in bahnen_count.items():
101             with self.subTest(bahnen=bahnen):
102                 result = self.app.get('/berichte/bahnen/{}'.format(bahnen))
103                 self.assertTrue(result.data.startswith(b'<?xml'))
104                 root = et.fromstring(result.data)
105                 self.assertIn('Rodelbahnberichte', root.find('{http://www.w3.org/2005/Atom}title').text)
106                 self.assertEqual(len(root.findall('{http://www.w3.org/2005/Atom}entry')), count,
107                                  f'bahnen "{bahnen}" not found {count} times')
108
109     def test_region(self):
110         region_count = {
111             'tirol': 6,
112             'schweiz': 1,
113             'innsbruck': 3,
114         }
115         for region, count in region_count.items():
116             with self.subTest(region=region):
117                 result = self.app.get('/berichte/region/{}'.format(region))
118                 self.assertTrue(result.data.startswith(b'<?xml'))
119                 root = et.fromstring(result.data)
120                 self.assertIn('Rodelbahnberichte', root.find('{http://www.w3.org/2005/Atom}title').text)
121                 self.assertEqual(len(root.findall('{http://www.w3.org/2005/Atom}entry')), count,
122                                  f'"{region}" not found {count} times')