+# encoding: utf8
+from nose.tools import *
+import unittest
+from sqlalchemy.orm import class_mapper
+
+from pokedex.db import tables, markdown
+
+def test_variable_names():
+ """We want pokedex.db.tables to export tables using the class name"""
+ for varname in dir(tables):
+ if not varname[0].isupper():
+ continue
+ table = getattr(tables, varname)
+ try:
+ if not issubclass(table, tables.TableBase) or table is tables.TableBase:
+ continue
+ except TypeError:
+ continue
+ classname = table.__name__
+ if classname and varname[0].isupper():
+ assert varname == classname, '%s refers to %s' % (varname, classname)
+ for table in tables.all_tables():
+ assert getattr(tables, table.__name__) is table
+
+def test_texts():
+ """Check DB schema for integrity of text columns & translations.
+
+ Mostly protects against copy/paste oversights and rebase hiccups.
+ If there's a reason to relax the tests, do it
+ """
+ for table in sorted(tables.all_tables(), key=lambda t: t.__name__):
+ if issubclass(table, tables.LanguageSpecific):
+ good_formats = 'markdown plaintext gametext'.split()
+ assert_text = '%s is language-specific'
+ else:
+ good_formats = 'identifier latex'.split()
+ assert_text = '%s is not language-specific'
+ mapper = class_mapper(table)
+ for column in sorted(mapper.c, key=lambda c: c.name):
+ format = column.info.get('format', None)
+ if format is not None:
+ if format not in good_formats:
+ raise AssertionError(assert_text % column)
+ is_markdown = isinstance(column.type, markdown.MarkdownColumn)
+ if is_markdown != (format == 'markdown'):
+ raise AssertionError('%s: markdown format/column type mismatch' % column)
+ if (format != 'identifier') and (column.name == 'identifier'):
+ raise AssertionError('%s: identifier column name/type mismatch' % column)
+ if column.info.get('official', None) and format not in 'gametext plaintext':
+ raise AssertionError('%s: official text with bad format' % column)
+ else:
+ if isinstance(column.type, (markdown.MarkdownColumn, tables.Unicode)):
+ raise AssertionError('%s: text column without format' % column)
+ if column.name == 'name' and format != 'plaintext':
+ raise AssertionError('%s: non-plaintext name' % column)
+ # No mention of English in the description
+ assert 'English' not in column.info['description'], column
+
+def test_identifiers_with_names():
+ """Test that named tables have identifiers, and non-named tables don't
+
+ ...have either names or identifiers.
+ """
+ for table in sorted(tables.all_tables(), key=lambda t: t.__name__):
+ if issubclass(table, tables.Named):
+ assert issubclass(table, tables.OfficiallyNamed) or issubclass(table, tables.UnofficiallyNamed), table
+ assert hasattr(table, 'identifier'), table
+ else:
+ assert not hasattr(table, 'identifier'), table
+ if not issubclass(table, tables.LanguageSpecific):
+ assert not hasattr(table, 'name'), table