From e4868841d5922f6313821ff49d3e70426816d4fb Mon Sep 17 00:00:00 2001
From: iElectric <unknown>
Date: Sat, 24 Apr 2010 21:40:16 +0200
Subject: [PATCH] partly fix SA0.6 tests on postgres

---
 migrate/changeset/schema.py         |  4 ++--
 migrate/versioning/genmodel.py      |  8 +++-----
 migrate/versioning/schema.py        |  4 ++--
 setup.py                            |  2 +-
 test-requirements.pip               |  2 +-
 tests/changeset/test_changeset.py   | 18 ++++++++++--------
 tests/fixture/database.py           |  9 +++++++++
 tests/versioning/test_schemadiff.py | 13 ++++++-------
 tests/versioning/test_util.py       | 14 +++++++-------
 9 files changed, 41 insertions(+), 33 deletions(-)

diff --git a/migrate/changeset/schema.py b/migrate/changeset/schema.py
index a3a0d1f..b25c9a0 100644
--- a/migrate/changeset/schema.py
+++ b/migrate/changeset/schema.py
@@ -403,7 +403,7 @@ class ChangesetTable(object):
 
     def drop_column(self, column, *p, **kw):
         """Drop a column, given its name or definition.
-        
+
         API to :meth:`ChangesetColumn.drop`
 
         :param column: Column to be droped
@@ -417,7 +417,7 @@ class ChangesetTable(object):
                 # That column isn't part of the table. We don't need
                 # its entire definition to drop the column, just its
                 # name, so create a dummy column with the same name.
-                column = sqlalchemy.Column(str(column))
+                column = sqlalchemy.Column(str(column), sqlalchemy.Integer())
         column.drop(table=self, *p, **kw)
 
     def rename(self, name, *args, **kwargs):
diff --git a/migrate/versioning/genmodel.py b/migrate/versioning/genmodel.py
index 1715175..066e0c9 100644
--- a/migrate/versioning/genmodel.py
+++ b/migrate/versioning/genmodel.py
@@ -9,9 +9,11 @@
 import sys
 import logging
 
-import migrate
 import sqlalchemy
 
+import migrate
+import migrate.changeset
+
 
 log = logging.getLogger(__name__)
 HEADER = """
@@ -37,7 +39,6 @@ class ModelGenerator(object):
         self.diff = diff
         self.declarative = declarative
 
-
     def column_repr(self, col):
         kwarg = []
         if col.key != col.name:
@@ -174,9 +175,6 @@ class ModelGenerator(object):
 
     def applyModel(self):
         """Apply model to current database."""
-        # Yuck! We have to import from changeset to apply the
-        # monkey-patch to allow column adding/dropping.
-        from migrate.changeset import schema
 
         def dbCanHandleThisChange(missingInDatabase, missingInModel, diffDecl):
             if missingInDatabase and not missingInModel and not diffDecl:
diff --git a/migrate/versioning/schema.py b/migrate/versioning/schema.py
index 8014bcb..eb3beba 100644
--- a/migrate/versioning/schema.py
+++ b/migrate/versioning/schema.py
@@ -45,9 +45,9 @@ class ControlledSchema(object):
                 self.table.c.repository_id == str(self.repository.id)))
 
             data = list(result)[0]
-        except Exception:
+        except:
             cls, exc, tb = sys.exc_info()
-            raise exceptions.DatabaseNotControlledError, exc.message, tb
+            raise exceptions.DatabaseNotControlledError, exc.__str__(), tb
 
         self.version = data['version']
         return data
diff --git a/setup.py b/setup.py
index dd9ddc0..7ba7842 100644
--- a/setup.py
+++ b/setup.py
@@ -14,7 +14,7 @@ try:
 except ImportError:
     pass
 
-test_requirements = ['nose >= 0.10', 'ScriptTest']
+test_requirements = ['nose >= 0.10', 'ScriptTest==1.0.1']
 required_deps = ['sqlalchemy >= 0.5', 'decorator', 'tempita']
 readme_file = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'README'))
 
diff --git a/test-requirements.pip b/test-requirements.pip
index c500481..e659a36 100644
--- a/test-requirements.pip
+++ b/test-requirements.pip
@@ -3,4 +3,4 @@ nose
 -e git://github.com/cmheisel/nose-xcover.git#egg=nosexcover
 pytz
 psycopg2
-scripttest
+scripttest==1.0.1
diff --git a/tests/changeset/test_changeset.py b/tests/changeset/test_changeset.py
index 8e9dcc2..999f88f 100644
--- a/tests/changeset/test_changeset.py
+++ b/tests/changeset/test_changeset.py
@@ -41,7 +41,7 @@ class TestAddDropColumn(fixture.DB):
             # number of cols should be correct in table object and in database
             self.refresh_table(self.table_name)
             result = len(self.table.c)
-            
+
             self.assertEquals(result, num_of_expected_cols),
             if col_k.get('primary_key', None):
                 # new primary key: check its length too
@@ -273,7 +273,7 @@ class TestAddDropColumn(fixture.DB):
         col.create(self.table)
 
         self.table.insert(values={'id': 10}).execute()
-        row = self.table.select(autocommit=True).execute().fetchone()
+        row = self._select_row()
         self.assertEqual(u'foobar', row['data'])
 
         col.drop()
@@ -287,7 +287,7 @@ class TestAddDropColumn(fixture.DB):
         col.create(self.table, populate_default=True)
 
         self.table.insert(values={'id': 10}).execute()
-        row = self.table.select(autocommit=True).execute().fetchone()
+        row = self._select_row()
         self.assertEqual(u'foobar', row['data'])
 
         col.drop()
@@ -509,7 +509,7 @@ class TestColumnChange(fixture.DB):
         # TextClause returned by autoload
         self.assert_(default in str(self.table.c.data.server_default.arg))
         self.engine.execute(self.table.insert(), id=12)
-        row = self.table.select(autocommit=True).execute().fetchone()
+        row = self._select_row()
         self.assertEqual(row['data'], default)
 
         # Column object
@@ -526,15 +526,17 @@ class TestColumnChange(fixture.DB):
         # server_default isn't necessarily None for Oracle
         #self.assert_(self.table.c.data.server_default is None,self.table.c.data.server_default)
         self.engine.execute(self.table.insert(), id=11)
-        row = self.table.select(self.table.c.id == 11, autocommit=True).execute().fetchone()
+        if SQLA_06:
+            row = self.table.select(self.table.c.id == 11).execution_options(autocommit=True).execute().fetchone()
+        else:
+            row = self.table.select(self.table.c.id == 11, autocommit=True).execute().fetchone()
         self.assert_(row['data'] is None, row['data'])
-        
 
     @fixture.usedb(not_supported='firebird')
     def test_null(self):
         """Can change a column's null constraint"""
         self.assertEquals(self.table.c.data.nullable, True)
-        
+
         # Column object
         self.table.c.data.alter(Column('data', String(40), nullable=False))
         self.table.nullable = None
@@ -607,7 +609,7 @@ class TestColumnChange(fixture.DB):
 
         # insert data and assert default
         self.table.insert(values={'id': 10}).execute()
-        row = self.table.select(autocommit=True).execute().fetchone()
+        row = self._select_row()
         self.assertEqual(u'foobar', row['data_new'])
 
 
diff --git a/tests/fixture/database.py b/tests/fixture/database.py
index f9a4980..5fac0ef 100644
--- a/tests/fixture/database.py
+++ b/tests/fixture/database.py
@@ -8,6 +8,7 @@ from sqlalchemy import create_engine, Table, MetaData
 from sqlalchemy.orm import create_session
 from sqlalchemy.pool import StaticPool
 
+from migrate.changeset import SQLA_06
 from migrate.versioning.util import Memoize
 from tests.fixture.base import Base
 from tests.fixture.pathed import Pathed
@@ -131,6 +132,14 @@ class DB(Base):
     def _not_supported(self, url):
         return not self._supported(url)
 
+    def _select_row(self):
+        """Select rows, used in multiple tests"""
+        if SQLA_06:
+            row = self.table.select().execution_options(autocommit=True).execute().fetchone()
+        else:
+            row = self.table.select(autocommit=True).execute().fetchone()
+        return row
+
     def refresh_table(self, name=None):
         """Reload the table from the database
         Assumes we're working with only a single table, self.table, and
diff --git a/tests/versioning/test_schemadiff.py b/tests/versioning/test_schemadiff.py
index c35a9b5..fd29ebe 100644
--- a/tests/versioning/test_schemadiff.py
+++ b/tests/versioning/test_schemadiff.py
@@ -3,7 +3,9 @@ import os
 import sqlalchemy
 from sqlalchemy import *
 from nose.tools import eq_
+
 from migrate.versioning import genmodel, schemadiff
+from migrate.changeset import schema
 
 from tests import fixture
 
@@ -37,22 +39,19 @@ class TestSchemaDiff(fixture.DB):
     def _applyLatestModel(self):
         diff = schemadiff.getDiffOfModelAgainstDatabase(self.meta, self.engine, excludeTables=['migrate_version'])
         genmodel.ModelGenerator(diff).applyModel()
-        
+
     @fixture.usedb()
     def test_rundiffs(self):
-        
-        # Yuck! We have to import from changeset to apply the monkey-patch to allow column adding/dropping.
-        from migrate.changeset import schema
-        
+
         def assertDiff(isDiff, tablesMissingInDatabase, tablesMissingInModel, tablesWithDiff):
             diff = schemadiff.getDiffOfModelAgainstDatabase(self.meta, self.engine, excludeTables=['migrate_version'])
             eq_(bool(diff), isDiff)
             eq_( ([t.name for t in diff.tablesMissingInDatabase], [t.name for t in diff.tablesMissingInModel], [t.name for t in diff.tablesWithDiff]),
                            (tablesMissingInDatabase, tablesMissingInModel, tablesWithDiff) )
-                
+
         # Model is defined but database is empty.
         assertDiff(True, [self.table_name], [], [])
-        
+
         # Check Python upgrade and downgrade of database from updated model.
         diff = schemadiff.getDiffOfModelAgainstDatabase(self.meta, self.engine, excludeTables=['migrate_version'])
         decls, upgradeCommands, downgradeCommands = genmodel.ModelGenerator(diff).toUpgradeDowngradePython()
diff --git a/tests/versioning/test_util.py b/tests/versioning/test_util.py
index f913285..0ccb6de 100644
--- a/tests/versioning/test_util.py
+++ b/tests/versioning/test_util.py
@@ -19,12 +19,12 @@ class TestUtil(fixture.Pathed):
         self.assert_(engine.name == 'sqlite')
 
         # keyword arg
-        engine = construct_engine(url, engine_arg_assert_unicode=True)
-        self.assertTrue(engine.dialect.assert_unicode)
+        engine = construct_engine(url, engine_arg_encoding=True)
+        self.assertTrue(engine.dialect.encoding)
 
         # dict
-        engine = construct_engine(url, engine_dict={'assert_unicode': True})
-        self.assertTrue(engine.dialect.assert_unicode)
+        engine = construct_engine(url, engine_dict={'encoding': True})
+        self.assertTrue(engine.dialect.encoding)
 
         # engine parameter
         engine_orig = create_engine('sqlite://')
@@ -32,9 +32,9 @@ class TestUtil(fixture.Pathed):
         self.assertEqual(engine, engine_orig)
 
         # test precedance
-        engine = construct_engine(url, engine_dict={'assert_unicode': False},
-            engine_arg_assert_unicode=True)
-        self.assertTrue(engine.dialect.assert_unicode)
+        engine = construct_engine(url, engine_dict={'encoding': False},
+            engine_arg_encoding=True)
+        self.assertTrue(engine.dialect.encoding)
 
         # deprecated echo=True parameter
         engine = construct_engine(url, echo='True')