2009-01-16 22:23:58 +00:00
# -*- coding: utf-8 -*-
2009-03-29 23:15:58 +00:00
# Unit and doctests for specific database backends.
2010-02-24 15:29:25 +00:00
import datetime
import models
2009-01-16 22:23:58 +00:00
import unittest
2009-12-22 15:18:51 +00:00
from django . db import backend , connection , DEFAULT_DB_ALIAS
2009-03-29 23:15:58 +00:00
from django . db . backends . signals import connection_created
2009-01-16 22:23:58 +00:00
from django . conf import settings
2010-02-24 15:29:25 +00:00
from django . test import TestCase
2009-01-16 22:23:58 +00:00
class Callproc ( unittest . TestCase ) :
def test_dbms_session ( self ) :
# If the backend is Oracle, test that we can call a standard
# stored procedure through our cursor wrapper.
2009-12-22 15:18:51 +00:00
if settings . DATABASES [ DEFAULT_DB_ALIAS ] [ ' ENGINE ' ] == ' django.db.backends.oracle ' :
2009-08-24 15:45:48 +00:00
convert_unicode = backend . convert_unicode
2009-01-16 22:23:58 +00:00
cursor = connection . cursor ( )
2009-08-24 15:45:48 +00:00
cursor . callproc ( convert_unicode ( ' DBMS_SESSION.SET_IDENTIFIER ' ) ,
[ convert_unicode ( ' _django_testing! ' ) , ] )
2009-01-16 22:23:58 +00:00
return True
else :
return True
2009-12-22 15:18:51 +00:00
2010-04-28 17:08:06 +00:00
def test_cursor_var ( self ) :
# If the backend is Oracle, test that we can pass cursor variables
# as query parameters.
if settings . DATABASES [ DEFAULT_DB_ALIAS ] [ ' ENGINE ' ] == ' django.db.backends.oracle ' :
cursor = connection . cursor ( )
var = cursor . var ( backend . Database . STRING )
cursor . execute ( " BEGIN %s := ' X ' ; END; " , [ var ] )
self . assertEqual ( var . getvalue ( ) , ' X ' )
2009-07-21 21:20:18 +00:00
class LongString ( unittest . TestCase ) :
def test_long_string ( self ) :
# If the backend is Oracle, test that we can save a text longer
# than 4000 chars and read it properly
2009-12-22 15:18:51 +00:00
if settings . DATABASES [ DEFAULT_DB_ALIAS ] [ ' ENGINE ' ] == ' django.db.backends.oracle ' :
2009-07-21 21:20:18 +00:00
c = connection . cursor ( )
c . execute ( ' CREATE TABLE ltext ( " TEXT " NCLOB) ' )
long_str = ' ' . join ( [ unicode ( x ) for x in xrange ( 4000 ) ] )
c . execute ( ' INSERT INTO ltext VALUES ( %s ) ' , [ long_str ] )
c . execute ( ' SELECT text FROM ltext ' )
row = c . fetchone ( )
self . assertEquals ( long_str , row [ 0 ] . read ( ) )
2010-04-04 17:06:13 +00:00
c . execute ( ' DROP TABLE ltext ' )
2009-01-16 22:23:58 +00:00
2010-02-24 15:29:25 +00:00
class DateQuotingTest ( TestCase ) :
def test_django_date_trunc ( self ) :
"""
Test the custom ` ` django_date_trunc method ` ` , in particular against
fields which clash with strings passed to it ( e . g . ' year ' ) - see
#12818__.
__ : http : / / code . djangoproject . com / ticket / 12818
"""
updated = datetime . datetime ( 2010 , 2 , 20 )
models . SchoolClass . objects . create ( year = 2009 , last_updated = updated )
years = models . SchoolClass . objects . dates ( ' last_updated ' , ' year ' )
self . assertEqual ( list ( years ) , [ datetime . datetime ( 2010 , 1 , 1 , 0 , 0 ) ] )
def test_django_extract ( self ) :
"""
Test the custom ` ` django_extract method ` ` , in particular against fields
which clash with strings passed to it ( e . g . ' day ' ) - see #12818__.
__ : http : / / code . djangoproject . com / ticket / 12818
"""
updated = datetime . datetime ( 2010 , 2 , 20 )
models . SchoolClass . objects . create ( year = 2009 , last_updated = updated )
classes = models . SchoolClass . objects . filter ( last_updated__day = 20 )
self . assertEqual ( len ( classes ) , 1 )
2010-03-23 13:51:11 +00:00
class ParameterHandlingTest ( TestCase ) :
def test_bad_parameter_count ( self ) :
" An executemany call with too many/not enough parameters will raise an exception (Refs #12612) "
cursor = connection . cursor ( )
query = ( ' INSERT INTO %s ( %s , %s ) VALUES ( %% s, %% s) ' % (
connection . introspection . table_name_converter ( ' backends_square ' ) ,
connection . ops . quote_name ( ' root ' ) ,
connection . ops . quote_name ( ' square ' )
) )
self . assertRaises ( Exception , cursor . executemany , query , [ ( 1 , 2 , 3 ) , ] )
self . assertRaises ( Exception , cursor . executemany , query , [ ( 1 , ) , ] )
2009-03-29 23:15:58 +00:00
def connection_created_test ( sender , * * kwargs ) :
print ' connection_created signal '
2009-05-10 09:22:06 +00:00
__test__ = { ' API_TESTS ' : """
# Check Postgres version parsing
>> > from django . db . backends . postgresql import version as pg_version
>> > pg_version . _parse_version ( " PostgreSQL 8.3.1 on i386-apple-darwin9.2.2, compiled by GCC i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5478) " )
( 8 , 3 , 1 )
>> > pg_version . _parse_version ( " PostgreSQL 8.3.6 " )
( 8 , 3 , 6 )
>> > pg_version . _parse_version ( " PostgreSQL 8.3 " )
( 8 , 3 , None )
>> > pg_version . _parse_version ( " EnterpriseDB 8.3 " )
( 8 , 3 , None )
>> > pg_version . _parse_version ( " PostgreSQL 8.3 beta4 " )
( 8 , 3 , None )
>> > pg_version . _parse_version ( " PostgreSQL 8.4beta1 " )
( 8 , 4 , None )
""" }
2009-03-29 23:15:58 +00:00
# Unfortunately with sqlite3 the in-memory test database cannot be
# closed, and so it cannot be re-opened during testing, and so we
# sadly disable this test for now.
2009-12-22 15:18:51 +00:00
if settings . DATABASES [ DEFAULT_DB_ALIAS ] [ ' ENGINE ' ] != ' django.db.backends.sqlite3 ' :
2009-03-29 23:15:58 +00:00
__test__ [ ' API_TESTS ' ] + = """
>> > connection_created . connect ( connection_created_test )
>> > connection . close ( ) # Ensure the connection is closed
>> > cursor = connection . cursor ( )
connection_created signal
>> > connection_created . disconnect ( connection_created_test )
>> > cursor = connection . cursor ( )
"""
2009-01-16 22:23:58 +00:00
if __name__ == ' __main__ ' :
unittest . main ( )