#14415: Multiple aliases for one database: testing problems
-----------------------------------------------------------+----------------
 Reporter:  shai                                           |       Owner:  
nobody    
   Status:  new                                            |   Milestone:       
     
Component:  Testing framework                              |     Version:  1.2  
     
 Keywords:  multidb, multiple databases, multiple aliases  |       Stage:  
Unreviewed
Has_patch:  0                                              |  
-----------------------------------------------------------+----------------
 In a setting where the multiple-databases feature is used to create
 multiple aliases for one database, the testing framework can get a little
 confused.

 For ease of reference, assume we have the following dictionary defining
 database parameters:
 {{{
 db_params = dict (
     NAME = 'main',
     ENGINE = 'django.db.backends.whatever',
     USER = 'user',
     PASSWORD = 'password',
     HOST = '',
     PORT = ''
 )
 }}}

 == The relatively benign cases ==

 In these cases, the test framework just treats the two aliases as separate
 databases; which means it first creates the test database for one alias,
 then tries to create the test database for the second one, running into an
 error because (of course) it already exists. The user is asked to choose
 between destroying the existing database (in order to recreate it) and
 canceling the test. In cases where database routers constrict models to a
 specific alias, this may completely prevent testing (or at least some of
 the tests).

 This happens if at least one of two conditions hold:

 === The dictionaries used to define the alias are distinct ===

 That is, the databases are defined by
 {{{
 DATABASES = {
     'default' : db_params,
     'other' :   db_params.copy()
 }
 }}}
 or some equivalent

 === Test name is explicitly specified ===

 That is, `db_params` looks like:
 {{{
 db_params = dict (
     NAME = 'main',
     TEST_NAME = 'test_main',
     ... # same as above
 )
 }}}

 The databases may then be specified by the more natural
 {{{
 DATABASES = {
     'default' : db_params,
     'other' :   db_params
 }
 }}}

 == The more dangerous case ==

 In this case, the testing framework creates spurious databases and
 finalizes be destroying the main, non-test database.

 This happens when none of the above applies -- that is, `db_params` does
 not include
 the `TEST_NAME` entry, relying on the default `test_` prefix addition, and
 databases
 are specified by two references to the same dictionary (as in the last
 definition above).
 Regretfully, one may expect this to be the common use case in a multiple-
 aliases-for-one-database
 approach.

 In detail: With the definitions above, the testing framework first creates
 a `test_main` database, then a `test_test_main` database, and runs its
 tests with both of them present; then, during tear-down, it drops the
 `test_test_main` and *`main`* databases, leaving `test_main` in place.

 == A word for fixers ==

 For whoever wants to work on this ticket (perhaps myself...), Russel
 Keith-Magee has [http://groups.google.com/group/django-
 developers/browse_thread/thread/f3fac51f7ec56dfa said] that
 {{{
 #!html
 <blockquote style="padding-left: 3em;">
  ...this almost rates as an 'easy pickings' ticket. This
  is a situation where you'll get a pass on having a test as part of the
  patch; testing test setup is one of those areas that's almost
  impossible to validate, so whoever commits (probably me) will just
  take it for a very good walk before checking in.
 </blockquote>
 }}}

-- 
Ticket URL: <http://code.djangoproject.com/ticket/14415>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to