@@ -1731,6 +1731,72 @@ def run_cli(*args):
17311731 return rc , out .getvalue (), err .getvalue ()
17321732
17331733
1734+ @requires_postgresql
1735+ class TestRunnerSchema (DatabaseTestCase ):
1736+ """One set of migration files runs against any number of schemas."""
1737+ target = 'runner_target'
1738+ decoy = 'runner_decoy'
1739+
1740+ def setUp (self ):
1741+ super (TestRunnerSchema , self ).setUp ()
1742+ self .dir = tempfile .mkdtemp ()
1743+ for schema in (self .target , self .decoy ):
1744+ self .execute ('DROP SCHEMA IF EXISTS %s CASCADE' % schema )
1745+ self .execute ('CREATE SCHEMA %s' % schema )
1746+ self .execute ('CREATE TABLE %s.person (id SERIAL PRIMARY KEY, '
1747+ 'first_name TEXT)' % schema )
1748+ with open (os .path .join (self .dir , '0001_notes.py' ), 'w' ) as fh :
1749+ fh .write (add_column_mig ('notes' ))
1750+ self .runner = Runner (self .database , self .dir , schema = self .target )
1751+
1752+ def tearDown (self ):
1753+ try :
1754+ shutil .rmtree (self .dir , ignore_errors = True )
1755+ for schema in (self .target , self .decoy ):
1756+ self .execute ('DROP SCHEMA IF EXISTS %s CASCADE' % schema )
1757+ finally :
1758+ super (TestRunnerSchema , self ).tearDown ()
1759+
1760+ def columns (self , schema ):
1761+ return sorted (c .name for c in
1762+ self .database .get_columns ('person' , schema ))
1763+
1764+ def tables (self , schema ):
1765+ return self .database .get_tables (schema )
1766+
1767+ def test_up_down (self ):
1768+ self .assertEqual (self .runner .up (), ['0001_notes' ])
1769+ self .assertEqual (self .columns (self .target ),
1770+ ['first_name' , 'id' , 'notes' ])
1771+ self .assertEqual (self .columns (self .decoy ), ['first_name' , 'id' ])
1772+ # History lives in the schema it describes.
1773+ self .assertTrue ('schema_migration' in self .tables (self .target ))
1774+ self .assertFalse ('schema_migration' in self .tables (self .decoy ))
1775+
1776+ self .assertEqual (self .runner .down (), ['0001_notes' ])
1777+ self .assertEqual (self .columns (self .target ), ['first_name' , 'id' ])
1778+
1779+ def test_per_schema_history (self ):
1780+ self .runner .up ()
1781+ other = Runner (self .database , self .dir , schema = self .decoy )
1782+ self .assertEqual (other .up (), ['0001_notes' ])
1783+ self .assertEqual (self .columns (self .decoy ),
1784+ ['first_name' , 'id' , 'notes' ])
1785+ self .assertEqual (sorted (self .runner .applied ()), ['0001_notes' ])
1786+ self .assertEqual (sorted (other .applied ()), ['0001_notes' ])
1787+
1788+ # Each schema reverts independently.
1789+ other .down ()
1790+ self .assertEqual (self .columns (self .decoy ), ['first_name' , 'id' ])
1791+ self .assertEqual (self .columns (self .target ),
1792+ ['first_name' , 'id' , 'notes' ])
1793+
1794+ def test_fake_backfill (self ):
1795+ self .assertEqual (self .runner .fake (), ['0001_notes' ])
1796+ self .assertEqual (self .columns (self .target ), ['first_name' , 'id' ])
1797+ self .assertEqual (self .runner .up (), [])
1798+
1799+
17341800class TestMigrationRunnerCLI (BaseTestCase ):
17351801 def setUp (self ):
17361802 super (TestMigrationRunnerCLI , self ).setUp ()
0 commit comments