2
# -*- coding: utf-8 -*-
7
from migrate.versioning.schema import *
8
from migrate.versioning import script, exceptions, schemadiff
10
from sqlalchemy import *
12
from migrate.tests import fixture
15
class TestControlledSchema(fixture.Pathed, fixture.DB):
16
# Transactions break postgres in this test; we'll clean up after ourselves
17
level = fixture.DB.CONNECT
20
super(TestControlledSchema, self).setUp()
21
self.path_repos = self.temp_usable_dir + '/repo/'
22
self.repos = Repository.create(self.path_repos, 'repo_name')
24
def _setup(self, url):
26
super(TestControlledSchema, self)._setup(url)
30
super(TestControlledSchema, self)._teardown()
35
# drop existing version table if necessary
37
ControlledSchema(self.engine, self.repos).drop()
39
# No table to drop; that's fine, be silent
44
super(TestControlledSchema, self).tearDown()
47
def test_version_control(self):
48
"""Establish version control on a particular database"""
49
# Establish version control on this database
50
dbcontrol = ControlledSchema.create(self.engine, self.repos)
52
# Trying to create another DB this way fails: table exists
53
self.assertRaises(exceptions.DatabaseAlreadyControlledError,
54
ControlledSchema.create, self.engine, self.repos)
56
# We can load a controlled DB this way, too
57
dbcontrol0 = ControlledSchema(self.engine, self.repos)
58
self.assertEquals(dbcontrol, dbcontrol0)
60
# We can also use a repository path, instead of a repository
61
dbcontrol0 = ControlledSchema(self.engine, self.repos.path)
62
self.assertEquals(dbcontrol, dbcontrol0)
64
# We don't have to use the same connection
65
engine = create_engine(self.url)
66
dbcontrol0 = ControlledSchema(engine, self.repos.path)
67
self.assertEquals(dbcontrol, dbcontrol0)
72
# Attempting to drop vc from a db without it should fail
73
self.assertRaises(exceptions.DatabaseNotControlledError, dbcontrol.drop)
75
# No table defined should raise error
76
self.assertRaises(exceptions.DatabaseNotControlledError,
77
ControlledSchema, self.engine, self.repos)
80
def test_version_control_specified(self):
81
"""Establish version control with a specified version"""
82
# Establish version control on this database
84
dbcontrol = ControlledSchema.create(self.engine, self.repos, version)
85
self.assertEquals(dbcontrol.version, version)
87
# Correct when we load it, too
88
dbcontrol = ControlledSchema(self.engine, self.repos)
89
self.assertEquals(dbcontrol.version, version)
93
# Now try it with a nonzero value
95
for i in range(version):
96
self.repos.create_script('')
97
self.assertEquals(self.repos.latest, version)
99
# Test with some mid-range value
100
dbcontrol = ControlledSchema.create(self.engine,self.repos, 5)
101
self.assertEquals(dbcontrol.version, 5)
104
# Test with max value
105
dbcontrol = ControlledSchema.create(self.engine, self.repos, version)
106
self.assertEquals(dbcontrol.version, version)
110
def test_version_control_invalid(self):
111
"""Try to establish version control with an invalid version"""
112
versions = ('Thirteen', '-1', -1, '' , 13)
113
# A fresh repository doesn't go up to version 13 yet
114
for version in versions:
115
#self.assertRaises(ControlledSchema.InvalidVersionError,
116
# Can't have custom errors with assertRaises...
118
ControlledSchema.create(self.engine, self.repos, version)
119
self.assert_(False, repr(version))
120
except exceptions.InvalidVersionError:
124
def test_changeset(self):
125
"""Create changeset from controlled schema"""
126
dbschema = ControlledSchema.create(self.engine, self.repos)
128
# empty schema doesn't have changesets
129
cs = dbschema.changeset()
130
self.assertEqual(cs, {})
133
self.repos.create_script('')
134
self.assertEquals(self.repos.latest, 5)
136
cs = dbschema.changeset(5)
137
self.assertEqual(len(cs), 5)
143
def test_upgrade_runchange(self):
144
dbschema = ControlledSchema.create(self.engine, self.repos)
147
self.repos.create_script('')
149
self.assertEquals(self.repos.latest, 10)
153
self.assertRaises(ValueError, dbschema.upgrade, 'a')
154
self.assertRaises(exceptions.InvalidVersionError, dbschema.runchange, 20, '', 1)
156
# TODO: test for table version in db
162
def test_create_model(self):
163
"""Test workflow to generate create_model"""
164
model = ControlledSchema.create_model(self.engine, self.repos, declarative=False)
165
self.assertTrue(isinstance(model, basestring))
167
model = ControlledSchema.create_model(self.engine, self.repos.path, declarative=True)
168
self.assertTrue(isinstance(model, basestring))
171
def test_compare_model_to_db(self):
172
meta = self.construct_model()
174
diff = ControlledSchema.compare_model_to_db(self.engine, meta, self.repos)
175
self.assertTrue(isinstance(diff, schemadiff.SchemaDiff))
177
diff = ControlledSchema.compare_model_to_db(self.engine, meta, self.repos.path)
178
self.assertTrue(isinstance(diff, schemadiff.SchemaDiff))
179
meta.drop_all(self.engine)
182
def test_update_db_from_model(self):
183
dbschema = ControlledSchema.create(self.engine, self.repos)
185
meta = self.construct_model()
187
dbschema.update_db_from_model(meta)
189
# TODO: test for table version in db
193
meta.drop_all(self.engine)
195
def construct_model(self):
198
user = Table('temp_model_schema', meta, Column('id', Integer), Column('user', String(245)))
202
# TODO: test how are tables populated in db