Kaydet (Commit) 38a8cf1c authored tarafından Andrew Godwin's avatar Andrew Godwin

Fix state tests a little

üst 7d041b93
...@@ -14,6 +14,9 @@ class ProjectState(object): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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,
) )
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): ...@@ -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): ...@@ -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)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment