|
1 | 1 | from __future__ import with_statement
|
2 | 2 |
|
3 |
| -import os |
4 | 3 | import atexit
|
5 | 4 | import unittest
|
6 | 5 | from datetime import datetime
|
7 | 6 | import flask
|
8 | 7 | from flask.ext import sqlalchemy
|
| 8 | +from sqlalchemy.ext.declarative import declared_attr |
9 | 9 | from sqlalchemy.orm import sessionmaker
|
10 | 10 |
|
11 | 11 |
|
@@ -157,20 +157,108 @@ def committed(sender, changes):
|
157 | 157 | self.assertEqual(recorded[0][1], 'delete')
|
158 | 158 |
|
159 | 159 |
|
160 |
| -class HelperTestCase(unittest.TestCase): |
161 |
| - |
162 |
| - def test_default_table_name(self): |
| 160 | +class TablenameTestCase(unittest.TestCase): |
| 161 | + def test_name(self): |
163 | 162 | app = flask.Flask(__name__)
|
164 |
| - app.config['SQLALCHEMY_ENGINE'] = 'sqlite://' |
| 163 | + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' |
165 | 164 | db = sqlalchemy.SQLAlchemy(app)
|
166 | 165 |
|
167 | 166 | class FOOBar(db.Model):
|
168 | 167 | id = db.Column(db.Integer, primary_key=True)
|
| 168 | + |
169 | 169 | class BazBar(db.Model):
|
170 | 170 | id = db.Column(db.Integer, primary_key=True)
|
171 | 171 |
|
| 172 | + class Ham(db.Model): |
| 173 | + __tablename__ = 'spam' |
| 174 | + id = db.Column(db.Integer, primary_key=True) |
| 175 | + |
172 | 176 | self.assertEqual(FOOBar.__tablename__, 'foo_bar')
|
173 | 177 | self.assertEqual(BazBar.__tablename__, 'baz_bar')
|
| 178 | + self.assertEqual(Ham.__tablename__, 'spam') |
| 179 | + |
| 180 | + def test_single_name(self): |
| 181 | + """Single table inheritance should not set a new name.""" |
| 182 | + |
| 183 | + app = flask.Flask(__name__) |
| 184 | + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' |
| 185 | + db = sqlalchemy.SQLAlchemy(app) |
| 186 | + |
| 187 | + class Duck(db.Model): |
| 188 | + id = db.Column(db.Integer, primary_key=True) |
| 189 | + |
| 190 | + class Mallard(Duck): |
| 191 | + pass |
| 192 | + |
| 193 | + self.assertEqual(Mallard.__tablename__, 'duck') |
| 194 | + |
| 195 | + def test_joined_name(self): |
| 196 | + """Model has a separate primary key; it should set a new name.""" |
| 197 | + |
| 198 | + app = flask.Flask(__name__) |
| 199 | + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' |
| 200 | + db = sqlalchemy.SQLAlchemy(app) |
| 201 | + |
| 202 | + class Duck(db.Model): |
| 203 | + id = db.Column(db.Integer, primary_key=True) |
| 204 | + |
| 205 | + class Donald(Duck): |
| 206 | + id = db.Column(db.Integer, db.ForeignKey(Duck.id), primary_key=True) |
| 207 | + |
| 208 | + self.assertEqual(Donald.__tablename__, 'donald') |
| 209 | + |
| 210 | + def test_mixin_name(self): |
| 211 | + """Primary key provided by mixin should still allow model to set tablename.""" |
| 212 | + |
| 213 | + app = flask.Flask(__name__) |
| 214 | + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' |
| 215 | + db = sqlalchemy.SQLAlchemy(app) |
| 216 | + |
| 217 | + class Base(object): |
| 218 | + id = db.Column(db.Integer, primary_key=True) |
| 219 | + |
| 220 | + class Duck(Base, db.Model): |
| 221 | + pass |
| 222 | + |
| 223 | + self.assertFalse(hasattr(Base, '__tablename__')) |
| 224 | + self.assertEqual(Duck.__tablename__, 'duck') |
| 225 | + |
| 226 | + def test_abstract_name(self): |
| 227 | + """Abstract model should not set a name. Subclass should set a name.""" |
| 228 | + |
| 229 | + app = flask.Flask(__name__) |
| 230 | + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' |
| 231 | + db = sqlalchemy.SQLAlchemy(app) |
| 232 | + |
| 233 | + class Base(db.Model): |
| 234 | + __abstract__ = True |
| 235 | + id = db.Column(db.Integer, primary_key=True) |
| 236 | + |
| 237 | + class Duck(Base): |
| 238 | + pass |
| 239 | + |
| 240 | + self.assertFalse(hasattr(Base, '__tablename__')) |
| 241 | + self.assertEqual(Duck.__tablename__, 'duck') |
| 242 | + |
| 243 | + def test_complex_inheritance(self): |
| 244 | + """Joined table inheritance, but the new primary key is provided by a mixin, not directly on the class.""" |
| 245 | + |
| 246 | + app = flask.Flask(__name__) |
| 247 | + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' |
| 248 | + db = sqlalchemy.SQLAlchemy(app) |
| 249 | + |
| 250 | + class Duck(db.Model): |
| 251 | + id = db.Column(db.Integer, primary_key=True) |
| 252 | + |
| 253 | + class IdMixin(object): |
| 254 | + @declared_attr |
| 255 | + def id(cls): |
| 256 | + return db.Column(db.Integer, db.ForeignKey(Duck.id), primary_key=True) |
| 257 | + |
| 258 | + class RubberDuck(IdMixin, Duck): |
| 259 | + pass |
| 260 | + |
| 261 | + self.assertEqual(RubberDuck.__tablename__, 'rubber_duck') |
174 | 262 |
|
175 | 263 |
|
176 | 264 | class PaginationTestCase(unittest.TestCase):
|
@@ -493,7 +581,7 @@ def suite():
|
493 | 581 | suite = unittest.TestSuite()
|
494 | 582 | suite.addTest(unittest.makeSuite(BasicAppTestCase))
|
495 | 583 | suite.addTest(unittest.makeSuite(TestQueryProperty))
|
496 |
| - suite.addTest(unittest.makeSuite(HelperTestCase)) |
| 584 | + suite.addTest(unittest.makeSuite(TablenameTestCase)) |
497 | 585 | suite.addTest(unittest.makeSuite(PaginationTestCase))
|
498 | 586 | suite.addTest(unittest.makeSuite(BindsTestCase))
|
499 | 587 | suite.addTest(unittest.makeSuite(DefaultQueryClassTestCase))
|
|
0 commit comments