-#!/usr/bin/python3.4
import unittest
+import MySQLdb
import sqlalchemy
from sqlalchemy.engine import create_engine
from sqlalchemy.orm import sessionmaker
class TestMwDb(unittest.TestCase):
@classmethod
def setUpClass(cls):
- cls.engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8&use_unicode=1')
+ cls.engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8mb4')
cls.Session = sessionmaker(bind=cls.engine)
def setUp(self):
def test_page_table(self):
Page = wrpylib.mwdb.page_table(self.metadata)
- page = self.session.query(Page).filter(Page.c.page_id==1321).first()
+ page = self.session.query(Page).filter(Page.c.page_id == 1321).first()
self.assertEqual(page.page_id, 1321)
self.assertEqual(type(page.page_title), str)
self.assertEqual(type(page.page_restrictions), bytes)
Revision = wrpylib.mwdb.revision_table(self.metadata)
revision = self.session.query(Revision).filter(Revision.c.rev_id == 666).first()
self.assertEqual(revision.rev_id, 666)
- self.assertEqual(type(revision.rev_comment), str)
- self.assertEqual(type(revision.rev_user_text), str)
+ self.assertEqual(type(revision.rev_comment_id), int)
+ self.assertEqual(type(revision.rev_actor), int)
self.assertEqual(type(revision.rev_timestamp), str)
def test_text_table(self):
self.assertEqual(type(text.old_flags), str)
self.assertEqual(text.old_flags, 'utf-8')
-
def test_user_table(self):
User = wrpylib.mwdb.user_table(self.metadata)
user = self.session.query(User).filter(User.c.user_id == 1).first()
self.assertEqual(type(user.user_email), str)
self.assertEqual(user.user_name, 'Philipp')
-
def test_categorylinks_table(self):
Categorylinks = wrpylib.mwdb.categorylinks_table(self.metadata)
categorylinks = self.session.query(Categorylinks).filter(Categorylinks.c.cl_from == 609).first()
self.assertEqual(type(categorylinks.cl_to), str)
self.assertEqual(type(categorylinks.cl_sortkey), str)
self.assertEqual(categorylinks.cl_sortkey, 'ALT BÄRNBAD')
+
+
+class TestMySqlPython(unittest.TestCase):
+ """Note: Many of those tests failed in MySQL_python version 1.2.3 and earlier
+ because byte strings are returned instead of unicode for columns having
+ a _bin collation, see https://sourceforge.net/p/mysql-python/bugs/289/
+ This has been fixed in MySQL_python version 1.2.4."""
+
+ @classmethod
+ def setUpClass(cls):
+ cls.db = MySQLdb.connect(db='philipp_winterrodeln_wiki', charset='utf8mb4')
+
+ def setUp(self):
+ self.cursor = self.db.cursor()
+
+ def exec_sql(self, sql):
+ self.cursor.execute(sql)
+ row = self.cursor.fetchone()
+ return row
+
+ def test_datatype_page(self):
+ result = self.exec_sql('select page_title, page_restrictions, page_touched from page where page_id = 1321')
+ self.assertEqual(type(result[0]), bytes) # varbinary(255) NOT NULL
+ self.assertEqual(type(result[1]), bytes) # tinyblob NOT NULL
+ self.assertEqual(type(result[2]), bytes) # binary(14) NOT NULL
+
+ def test_datatype_revision(self):
+ result = self.exec_sql('select rev_comment_id, rev_actor, rev_timestamp from revision where rev_id = 7586')
+ self.assertEqual(type(result[0]), int) # tinyblob NOT NULL
+ self.assertEqual(type(result[1]), int) # varbinary(255) NOT NULL DEFAULT ''
+ self.assertEqual(type(result[2]), bytes) # binary(14) NOT NULL
+
+ def test_datatypes_text(self):
+ result = self.exec_sql('select old_text, old_flags from text where old_id = 7438')
+ self.assertEqual(type(result[0]), bytes) # mediumblob NOT NULL
+ self.assertEqual(type(result[1]), bytes) # tinyblob NOT NULL
+
+ def test_datatype_user(self):
+ result = self.exec_sql('select user_name, user_real_name, user_email from user where user_id = 1')
+ self.assertEqual(type(result[0]), bytes) # varbinary(255) NOT NULL DEFAULT ''
+ self.assertEqual(type(result[1]), bytes) # varbinary(255) NOT NULL DEFAULT ''
+ self.assertEqual(type(result[2]), bytes) # tinyblob NOT NULL
+ assert result[0].decode('UTF-8') == 'Philipp'
+
+ def test_datatype_categorylinks(self):
+ result = self.exec_sql('select cl_to, cl_sortkey from categorylinks where cl_from = 609')
+ self.assertEqual(type(result[0]), bytes) # varbinary(255) NOT NULL DEFAULT ''
+ self.assertEqual(type(result[1]), bytes) # varbinary(230) NOT NULL