44from django .conf import settings
55from django .db .backends .base .creation import BaseDatabaseCreation
66from django .db .utils import DatabaseError
7+ from django .utils .crypto import get_random_string
78from django .utils .functional import cached_property
89from django .utils .six .moves import input
910
1011TEST_DATABASE_PREFIX = 'test_'
11- PASSWORD = 'Im_a_lumberjack'
1212
1313
1414class DatabaseCreation (BaseDatabaseCreation ):
@@ -223,7 +223,11 @@ def _create_test_user(self, cursor, parameters, verbosity, keepdb=False):
223223 ]
224224 # Ignore "user already exists" error when keepdb is on
225225 acceptable_ora_err = 'ORA-01920' if keepdb else None
226- self ._execute_allow_fail_statements (cursor , statements , parameters , verbosity , acceptable_ora_err )
226+ success = self ._execute_allow_fail_statements (cursor , statements , parameters , verbosity , acceptable_ora_err )
227+ # If the password was randomly generated, change the user accordingly.
228+ if not success and self ._test_settings_get ('PASSWORD' ) is None :
229+ set_password = "ALTER USER %(user)s IDENTIFIED BY %(password)s"
230+ self ._execute_statements (cursor , [set_password ], parameters , verbosity )
227231 # Most test-suites can be run without the create-view privilege. But some need it.
228232 extra = "GRANT CREATE VIEW TO %(user)s"
229233 success = self ._execute_allow_fail_statements (cursor , [extra ], parameters , verbosity , 'ORA-01031' )
@@ -298,7 +302,7 @@ def _test_settings_get(self, key, default=None, prefixed=None):
298302 """
299303 settings_dict = self .connection .settings_dict
300304 val = settings_dict ['TEST' ].get (key , default )
301- if val is None :
305+ if val is None and prefixed :
302306 val = TEST_DATABASE_PREFIX + settings_dict [prefixed ]
303307 return val
304308
@@ -315,7 +319,11 @@ def _test_database_user(self):
315319 return self ._test_settings_get ('USER' , prefixed = 'USER' )
316320
317321 def _test_database_passwd (self ):
318- return self ._test_settings_get ('PASSWORD' , default = PASSWORD )
322+ password = self ._test_settings_get ('PASSWORD' )
323+ if password is None and self ._test_user_create ():
324+ # Oracle passwords are limited to 30 chars and can't contain symbols.
325+ password = get_random_string (length = 30 )
326+ return password
319327
320328 def _test_database_tblspace (self ):
321329 return self ._test_settings_get ('TBLSPACE' , prefixed = 'USER' )
0 commit comments