summaryrefslogtreecommitdiff
path: root/tests/othertests/ansi_sql.py
blob: f51ba7d0b2207697e3d0c0290c5ccccda2a839f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"""
>>> from django.db.backends.ansi import sql

# so we can test with a predicatable constraint setting
>>> real_cnst = Mod._meta.connection_info.backend.supports_constraints
>>> Mod._meta.connection_info.backend.supports_constraints = True
    
# generate create sql
>>> builder = sql.SchemaBuilder()
>>> builder.get_create_table(Car)
([BoundStatement('CREATE TABLE "ansi_sql_car" (...);')], {})
>>> builder.models_already_seen
Set([<class 'othertests.ansi_sql.Car'>])
>>> builder.models_already_seen = set()

# test that styles are used
>>> builder.get_create_table(Car, style=mockstyle())
([BoundStatement('SQL_KEYWORD(CREATE TABLE) SQL_TABLE("ansi_sql_car") (...SQL_FIELD("id")...);')], {})

# test pending relationships
>>> builder.models_already_seen = set()
>>> builder.get_create_table(Mod)
([BoundStatement('CREATE TABLE "ansi_sql_mod" (..."car_id" integer NOT NULL,...);')], {<class 'othertests.ansi_sql.Car'>: [BoundStatement('ALTER TABLE "ansi_sql_mod" ADD CONSTRAINT ... FOREIGN KEY ("car_id") REFERENCES "ansi_sql_car" ("id");')]})
>>> builder.models_already_seen = set()
>>> builder.get_create_table(Car)
([BoundStatement('CREATE TABLE "ansi_sql_car" (...);')], {})
>>> builder.get_create_table(Mod)
([BoundStatement('CREATE TABLE "ansi_sql_mod" (..."car_id" integer NOT NULL REFERENCES "ansi_sql_car" ("id"),...);')], {})

# test many-many
>>> builder.get_create_table(Collector)
([BoundStatement('CREATE TABLE "ansi_sql_collector" (...);')], {})
>>> builder.get_create_many_to_many(Collector)
{<class 'othertests.ansi_sql.Car'>: [BoundStatement('CREATE TABLE "ansi_sql_collector_cars" (...);')]}

# test indexes
>>> builder.get_create_indexes(Car)
[]
>>> builder.get_create_indexes(Mod)
[BoundStatement('CREATE INDEX ... ON "ansi_sql_mod" ("car_id");'), BoundStatement('CREATE INDEX ... ON "ansi_sql_mod" ("part");')]
>>> builder.get_create_indexes(Collector)
[]

# test initial data
# patch builder so that it looks for initial data where we want it to
>>> builder.get_initialdata_path = othertests_sql
>>> builder.get_initialdata(Car)
[BoundStatement('insert into ansi_sql_car (...)...values (...);')]

# test drop
>>> builder.get_drop_table(Mod)
[BoundStatement('DROP TABLE "ansi_sql_mod";')]
>>> builder.get_drop_table(Mod, cascade=True)
[BoundStatement('DROP TABLE "ansi_sql_mod";')]
>>> builder.get_drop_table(Car)
[BoundStatement('DROP TABLE "ansi_sql_car";')]
>>> builder.get_drop_table(Car, cascade=True)
[BoundStatement('DROP TABLE "ansi_sql_car";')]

>>> builder.tables = ['ansi_sql_car', 'ansi_sql_mod', 'ansi_sql_collector']
>>> Mod._meta.connection_info.backend.supports_constraints = False
>>> builder.get_drop_table(Car, cascade=True)
[BoundStatement('DROP TABLE "ansi_sql_car";')]
>>> Mod._meta.connection_info.backend.supports_constraints = True
>>> builder.get_drop_table(Car, cascade=True)
[BoundStatement('ALTER TABLE "ansi_sql_mod" ...'), BoundStatement('DROP TABLE "ansi_sql_car";')]
>>> builder.get_drop_table(Collector)
[BoundStatement('DROP TABLE "ansi_sql_collector";')]
>>> builder.get_drop_table(Collector, cascade=True)
[BoundStatement('DROP TABLE "ansi_sql_collector_cars";'), BoundStatement('DROP TABLE "ansi_sql_collector";')]
>>> Mod._meta.connection_info.backend.supports_constraints = real_cnst

"""
import os
from django.db import models
from django.core.management import install

# For Python 2.3
if not hasattr(__builtins__, 'set'):
    from sets import Set as set


# test models
class Car(models.Model):
    make = models.CharField(maxlength=32)
    model = models.CharField(maxlength=32)
    year = models.IntegerField()
    condition = models.CharField(maxlength=32)
    
    class Meta:
        app_label = 'ansi_sql'

        
class Collector(models.Model):
    name = models.CharField(maxlength=32)
    cars = models.ManyToManyField(Car)
    
    class Meta:
        app_label = 'ansi_sql'

        
class Mod(models.Model):
    car = models.ForeignKey(Car)
    part = models.CharField(maxlength=32, db_index=True)
    description = models.TextField()
    
    class Meta:
        app_label = 'ansi_sql'


class mockstyle:
    """mock style that wraps text in STYLE(text), for testing"""
    def __getattr__(self, attr):
        if attr in ('ERROR', 'ERROR_OUTPUT', 'SQL_FIELD', 'SQL_COLTYPE',
                    'SQL_KEYWORD', 'SQL_TABLE'):
            return lambda text: "%s(%s)" % (attr, text)

        
def othertests_sql(mod):
    """Look in othertests/sql for sql initialdata"""
    return os.path.normpath(os.path.join(os.path.dirname(__file__), 'sql'))


# install my stuff
Car.objects.install()
Collector.objects.install()
Mod.objects.install()