1
0
mirror of https://github.com/django/django.git synced 2025-11-07 07:15:35 +00:00

Add some field schema alteration methods and tests.

This commit is contained in:
Andrew Godwin
2012-06-19 13:25:22 +01:00
parent 8ba5bf3198
commit 959a3f9791
4 changed files with 309 additions and 49 deletions

View File

@@ -2,8 +2,9 @@ from __future__ import absolute_import
import copy
import datetime
from django.test import TestCase
from django.db.models.loading import cache
from django.db import connection, DatabaseError, IntegrityError
from django.db.models.fields import IntegerField, TextField
from django.db.models.loading import cache
from .models import Author, Book
@@ -18,6 +19,8 @@ class SchemaTests(TestCase):
models = [Author, Book]
# Utility functions
def setUp(self):
# Make sure we're in manual transaction mode
connection.commit_unless_managed()
@@ -51,6 +54,18 @@ class SchemaTests(TestCase):
cache.app_store = self.old_app_store
cache._get_models_cache = {}
def column_classes(self, model):
cursor = connection.cursor()
return dict(
(d[0], (connection.introspection.get_field_type(d[1], d), d))
for d in connection.introspection.get_table_description(
cursor,
model._meta.db_table,
)
)
# Tests
def test_creation_deletion(self):
"""
Tries creating a model's table, and then deleting it.
@@ -100,3 +115,60 @@ class SchemaTests(TestCase):
pub_date = datetime.datetime.now(),
)
connection.commit()
def test_create_field(self):
"""
Tests adding fields to models
"""
# Create the table
editor = connection.schema_editor()
editor.start()
editor.create_model(Author)
editor.commit()
# Ensure there's no age field
columns = self.column_classes(Author)
self.assertNotIn("age", columns)
# Alter the name field to a TextField
new_field = IntegerField(null=True)
new_field.set_attributes_from_name("age")
editor = connection.schema_editor()
editor.start()
editor.create_field(
Author,
new_field,
)
editor.commit()
# Ensure the field is right afterwards
columns = self.column_classes(Author)
self.assertEqual(columns['age'][0], "IntegerField")
self.assertEqual(columns['age'][1][6], True)
def test_alter(self):
"""
Tests simple altering of fields
"""
# Create the table
editor = connection.schema_editor()
editor.start()
editor.create_model(Author)
editor.commit()
# Ensure the field is right to begin with
columns = self.column_classes(Author)
self.assertEqual(columns['name'][0], "CharField")
self.assertEqual(columns['name'][1][3], 255)
self.assertEqual(columns['name'][1][6], False)
# Alter the name field to a TextField
new_field = TextField(null=True)
new_field.set_attributes_from_name("name")
editor = connection.schema_editor()
editor.start()
editor.alter_field(
Author,
Author._meta.get_field_by_name("name")[0],
new_field,
)
editor.commit()
# Ensure the field is right afterwards
columns = self.column_classes(Author)
self.assertEqual(columns['name'][0], "TextField")
self.assertEqual(columns['name'][1][6], True)