The order of XML attributes is now retained.
[philipp/winterrodeln/wrpylib.git] / tests / test_mwdb.py
1 import unittest
2 import MySQLdb
3 import sqlalchemy
4 from sqlalchemy.engine import create_engine
5 from sqlalchemy.orm import sessionmaker
6 import wrpylib.mwdb
7
8
9 class TestMwDb(unittest.TestCase):
10     @classmethod
11     def setUpClass(cls):
12         cls.engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8mb4')
13         cls.Session = sessionmaker(bind=cls.engine)
14
15     def setUp(self):
16         self.metadata = sqlalchemy.MetaData()
17         self.session = self.Session()
18
19     def tearDown(self):
20         self.session.rollback()
21
22     def test_page_table(self):
23         Page = wrpylib.mwdb.page_table(self.metadata)
24         page = self.session.query(Page).filter(Page.c.page_id == 1321).first()
25         self.assertEqual(page.page_id, 1321)
26         self.assertEqual(type(page.page_title), str)
27         self.assertEqual(type(page.page_restrictions), bytes)
28         self.assertEqual(type(page.page_touched), str)
29
30     def test_revision_table(self):
31         Revision = wrpylib.mwdb.revision_table(self.metadata)
32         revision = self.session.query(Revision).filter(Revision.c.rev_id == 666).first()
33         self.assertEqual(revision.rev_id, 666)
34         self.assertEqual(type(revision.rev_comment_id), int)
35         self.assertEqual(type(revision.rev_actor), int)
36         self.assertEqual(type(revision.rev_timestamp), str)
37
38     def test_text_table(self):
39         Text = wrpylib.mwdb.text_table(self.metadata)
40         text = self.session.query(Text).filter(Text.c.old_id == 51).first()
41         self.assertEqual(text.old_id, 51)
42         self.assertEqual(type(text.old_text), str)
43         self.assertEqual(type(text.old_flags), str)
44         self.assertEqual(text.old_flags, 'utf-8')
45
46     def test_user_table(self):
47         User = wrpylib.mwdb.user_table(self.metadata)
48         user = self.session.query(User).filter(User.c.user_id == 1).first()
49         self.assertEqual(user.user_id, 1)
50         self.assertEqual(type(user.user_name), str)
51         self.assertEqual(type(user.user_real_name), str)
52         self.assertEqual(type(user.user_email), str)
53         self.assertEqual(user.user_name, 'Philipp')
54
55     def test_categorylinks_table(self):
56         Categorylinks = wrpylib.mwdb.categorylinks_table(self.metadata)
57         categorylinks = self.session.query(Categorylinks).filter(Categorylinks.c.cl_from == 609).first()
58         self.assertEqual(categorylinks.cl_from, 609)
59         self.assertEqual(type(categorylinks.cl_to), str)
60         self.assertEqual(type(categorylinks.cl_sortkey), str)
61         self.assertEqual(categorylinks.cl_sortkey, 'ALT BĂ„RNBAD')
62
63
64 class TestMySqlPython(unittest.TestCase):
65     """Note: Many of those tests failed in MySQL_python version 1.2.3 and earlier
66     because byte strings are returned instead of unicode for columns having
67     a _bin collation, see https://sourceforge.net/p/mysql-python/bugs/289/
68     This has been fixed in MySQL_python version 1.2.4."""
69
70     @classmethod
71     def setUpClass(cls):
72         cls.db = MySQLdb.connect(db='philipp_winterrodeln_wiki', charset='utf8mb4')
73
74     def setUp(self):
75         self.cursor = self.db.cursor()
76
77     def exec_sql(self, sql):
78         self.cursor.execute(sql)
79         row = self.cursor.fetchone()
80         return row
81
82     def test_datatype_page(self):
83         result = self.exec_sql('select page_title, page_restrictions, page_touched from page where page_id = 1321')
84         self.assertEqual(type(result[0]), bytes)  # varbinary(255) NOT NULL
85         self.assertEqual(type(result[1]), bytes)  # tinyblob NOT NULL
86         self.assertEqual(type(result[2]), bytes)  # binary(14) NOT NULL
87
88     def test_datatype_revision(self):
89         result = self.exec_sql('select rev_comment_id, rev_actor, rev_timestamp from revision where rev_id = 7586')
90         self.assertEqual(type(result[0]), int)  # tinyblob NOT NULL
91         self.assertEqual(type(result[1]), int)  # varbinary(255) NOT NULL DEFAULT ''
92         self.assertEqual(type(result[2]), bytes)  # binary(14) NOT NULL
93
94     def test_datatypes_text(self):
95         result = self.exec_sql('select old_text, old_flags from text where old_id = 7438')
96         self.assertEqual(type(result[0]), bytes)  # mediumblob NOT NULL
97         self.assertEqual(type(result[1]), bytes)  # tinyblob NOT NULL
98
99     def test_datatype_user(self):
100         result = self.exec_sql('select user_name, user_real_name, user_email from user where user_id = 1')
101         self.assertEqual(type(result[0]), bytes)  # varbinary(255) NOT NULL DEFAULT ''
102         self.assertEqual(type(result[1]), bytes)  # varbinary(255) NOT NULL DEFAULT ''
103         self.assertEqual(type(result[2]), bytes)  # tinyblob NOT NULL
104         assert result[0].decode('UTF-8') == 'Philipp'
105
106     def test_datatype_categorylinks(self):
107         result = self.exec_sql('select cl_to, cl_sortkey from categorylinks where cl_from = 609')
108         self.assertEqual(type(result[0]), bytes)  # varbinary(255) NOT NULL DEFAULT ''
109         self.assertEqual(type(result[1]), bytes)  # varbinary(230) NOT NULL