Fix state tests a little

This commit is contained in:
Andrew Godwin 2013-05-18 18:30:34 +02:00
parent 7d041b9394
commit 38a8cf1cdc
2 changed files with 35 additions and 7 deletions

View File

@ -14,6 +14,9 @@ class ProjectState(object):
self.models = models or {} self.models = models or {}
self.app_cache = None self.app_cache = None
def add_model_state(self, model_state):
self.models[(model_state.app_label, model_state.name.lower())] = model_state
def clone(self): def clone(self):
"Returns an exact copy of this ProjectState" "Returns an exact copy of this ProjectState"
return ProjectState( return ProjectState(
@ -24,7 +27,7 @@ class ProjectState(object):
"Turns the project state into actual models in a new AppCache" "Turns the project state into actual models in a new AppCache"
if self.app_cache is None: if self.app_cache is None:
self.app_cache = BaseAppCache() self.app_cache = BaseAppCache()
for model in self.model.values: for model in self.models.values():
model.render(self.app_cache) model.render(self.app_cache)
return self.app_cache return self.app_cache
@ -90,10 +93,6 @@ class ModelState(object):
meta = type("Meta", tuple(), meta_contents) meta = type("Meta", tuple(), meta_contents)
# Then, work out our bases # Then, work out our bases
# TODO: Use the actual bases # TODO: Use the actual bases
if self.bases:
raise NotImplementedError("Custom bases not quite done yet!")
else:
bases = [models.Model]
# Turn fields into a dict for the body, add other bits # Turn fields into a dict for the body, add other bits
body = dict(self.fields) body = dict(self.fields)
body['Meta'] = meta body['Meta'] = meta
@ -101,6 +100,6 @@ class ModelState(object):
# Then, make a Model object # Then, make a Model object
return type( return type(
self.name, self.name,
tuple(bases), tuple(self.bases),
body, body,
) )

View File

@ -1,7 +1,7 @@
from django.test import TestCase from django.test import TestCase
from django.db import models from django.db import models
from django.db.models.loading import BaseAppCache from django.db.models.loading import BaseAppCache
from django.db.migrations.state import ProjectState from django.db.migrations.state import ProjectState, ModelState
class StateTests(TestCase): class StateTests(TestCase):
@ -13,6 +13,7 @@ class StateTests(TestCase):
""" """
Tests making a ProjectState from an AppCache Tests making a ProjectState from an AppCache
""" """
new_app_cache = BaseAppCache() new_app_cache = BaseAppCache()
class Author(models.Model): class Author(models.Model):
@ -41,3 +42,31 @@ class StateTests(TestCase):
self.assertEqual(author_state.fields[2][1].null, False) self.assertEqual(author_state.fields[2][1].null, False)
self.assertEqual(author_state.fields[3][1].null, True) self.assertEqual(author_state.fields[3][1].null, True)
self.assertEqual(author_state.bases, (models.Model, )) self.assertEqual(author_state.bases, (models.Model, ))
self.assertEqual(book_state.app_label, "migrations")
self.assertEqual(book_state.name, "Book")
self.assertEqual([x for x, y in book_state.fields], ["id", "title", "author"])
self.assertEqual(book_state.fields[1][1].max_length, 1000)
self.assertEqual(book_state.fields[2][1].null, False)
self.assertEqual(book_state.bases, (models.Model, ))
def test_render(self):
"""
Tests rendering a ProjectState into an AppCache.
"""
project_state = ProjectState()
project_state.add_model_state(ModelState(
"migrations",
"Tag",
[
("id", models.AutoField(primary_key=True)),
("name", models.CharField(max_length=100)),
("hidden", models.BooleanField()),
],
{},
None,
))
new_app_cache = project_state.render()
self.assertEqual(new_app_cache.get_model("migrations", "Tag")._meta.get_field_by_name("name")[0].max_length, 100)
self.assertEqual(new_app_cache.get_model("migrations", "Tag")._meta.get_field_by_name("hidden")[0].null, False)