2
0

tests.py 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304
  1. """
  2. A series of tests to establish that the command-line managment tools work as
  3. advertised - especially with regards to the handling of the DJANGO_SETTINGS_MODULE
  4. and default settings.py files.
  5. """
  6. import os
  7. import shutil
  8. import sys
  9. import re
  10. from django import conf, bin, get_version
  11. from django.conf import settings
  12. from django.utils import unittest
  13. class AdminScriptTestCase(unittest.TestCase):
  14. def write_settings(self, filename, apps=None, is_dir=False, sdict=None):
  15. test_dir = os.path.dirname(os.path.dirname(__file__))
  16. if is_dir:
  17. settings_dir = os.path.join(test_dir,filename)
  18. os.mkdir(settings_dir)
  19. settings_file = open(os.path.join(settings_dir,'__init__.py'), 'w')
  20. else:
  21. settings_file = open(os.path.join(test_dir, filename), 'w')
  22. settings_file.write('# Settings file automatically generated by regressiontests.admin_scripts test case\n')
  23. exports = [
  24. 'DATABASES',
  25. 'ROOT_URLCONF'
  26. ]
  27. for s in exports:
  28. if hasattr(settings, s):
  29. o = getattr(settings, s)
  30. if not isinstance(o, dict):
  31. o = "'%s'" % o
  32. settings_file.write("%s = %s\n" % (s, o))
  33. if apps is None:
  34. apps = ['django.contrib.auth', 'django.contrib.contenttypes', 'admin_scripts']
  35. settings_file.write("INSTALLED_APPS = %s\n" % apps)
  36. if sdict:
  37. for k, v in sdict.items():
  38. settings_file.write("%s = %s\n" % (k, v))
  39. settings_file.close()
  40. def remove_settings(self, filename, is_dir=False):
  41. test_dir = os.path.dirname(os.path.dirname(__file__))
  42. full_name = os.path.join(test_dir, filename)
  43. if is_dir:
  44. shutil.rmtree(full_name)
  45. else:
  46. os.remove(full_name)
  47. # Also try to remove the compiled file; if it exists, it could
  48. # mess up later tests that depend upon the .py file not existing
  49. try:
  50. if sys.platform.startswith('java'):
  51. # Jython produces module$py.class files
  52. os.remove(re.sub(r'\.py$', '$py.class', full_name))
  53. else:
  54. # CPython produces module.pyc files
  55. os.remove(full_name + 'c')
  56. except OSError:
  57. pass
  58. def _ext_backend_paths(self):
  59. """
  60. Returns the paths for any external backend packages.
  61. """
  62. paths = []
  63. first_package_re = re.compile(r'(^[^\.]+)\.')
  64. for backend in settings.DATABASES.values():
  65. result = first_package_re.findall(backend['ENGINE'])
  66. if result and result != 'django':
  67. backend_pkg = __import__(result[0])
  68. backend_dir = os.path.dirname(backend_pkg.__file__)
  69. paths.append(os.path.dirname(backend_dir))
  70. return paths
  71. def run_test(self, script, args, settings_file=None, apps=None):
  72. test_dir = os.path.dirname(os.path.dirname(__file__))
  73. project_dir = os.path.dirname(test_dir)
  74. base_dir = os.path.dirname(project_dir)
  75. ext_backend_base_dirs = self._ext_backend_paths()
  76. # Remember the old environment
  77. old_django_settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', None)
  78. if sys.platform.startswith('java'):
  79. python_path_var_name = 'JYTHONPATH'
  80. else:
  81. python_path_var_name = 'PYTHONPATH'
  82. old_python_path = os.environ.get(python_path_var_name, None)
  83. old_cwd = os.getcwd()
  84. # Set the test environment
  85. if settings_file:
  86. os.environ['DJANGO_SETTINGS_MODULE'] = settings_file
  87. elif 'DJANGO_SETTINGS_MODULE' in os.environ:
  88. del os.environ['DJANGO_SETTINGS_MODULE']
  89. python_path = [test_dir, base_dir]
  90. python_path.extend(ext_backend_base_dirs)
  91. os.environ[python_path_var_name] = os.pathsep.join(python_path)
  92. # Build the command line
  93. executable = sys.executable
  94. arg_string = ' '.join(['%s' % arg for arg in args])
  95. # Silence the DeprecationWarning caused by having a locale directory
  96. # in the project directory.
  97. if ' ' in executable:
  98. cmd = '""%s" -Wignore:::django.utils.translation "%s" %s"' % (executable, script, arg_string)
  99. else:
  100. cmd = '%s -Wignore:::django.utils.translation "%s" %s' % (executable, script, arg_string)
  101. # Move to the test directory and run
  102. os.chdir(test_dir)
  103. try:
  104. from subprocess import Popen, PIPE
  105. except ImportError:
  106. stdin, stdout, stderr = os.popen3(cmd)
  107. else:
  108. p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
  109. stdin, stdout, stderr = (p.stdin, p.stdout, p.stderr)
  110. p.wait()
  111. out, err = stdout.read(), stderr.read()
  112. # Restore the old environment
  113. if old_django_settings_module:
  114. os.environ['DJANGO_SETTINGS_MODULE'] = old_django_settings_module
  115. if old_python_path:
  116. os.environ[python_path_var_name] = old_python_path
  117. # Move back to the old working directory
  118. os.chdir(old_cwd)
  119. return out, err
  120. def run_django_admin(self, args, settings_file=None):
  121. bin_dir = os.path.abspath(os.path.dirname(bin.__file__))
  122. return self.run_test(os.path.join(bin_dir,'django-admin.py'), args, settings_file)
  123. def run_manage(self, args, settings_file=None):
  124. conf_dir = os.path.dirname(conf.__file__)
  125. template_manage_py = os.path.join(conf_dir, 'project_template', 'manage.py')
  126. test_dir = os.path.dirname(os.path.dirname(__file__))
  127. test_manage_py = os.path.join(test_dir, 'manage.py')
  128. shutil.copyfile(template_manage_py, test_manage_py)
  129. stdout, stderr = self.run_test('./manage.py', args, settings_file)
  130. # Cleanup - remove the generated manage.py script
  131. os.remove(test_manage_py)
  132. return stdout, stderr
  133. def assertNoOutput(self, stream):
  134. "Utility assertion: assert that the given stream is empty"
  135. # HACK: Under Windows, ignore warnings of the form:
  136. # 'warning: Not loading directory '...\tests\regressiontests\locale': missing __init__.py'
  137. # It has been impossible to filter them out using other means like:
  138. # * Using warning.filterwarnings() (for the Python interpreter running the
  139. # tests) and/or
  140. # * Using -Wignore:... (for the python interpreter spawned in self.run_test())
  141. # Instead use a strategy copied from Mercurial's setup.py
  142. if sys.platform == 'win32':
  143. stream = [e for e in stream.splitlines()
  144. if not e.startswith('warning: Not importing directory')]
  145. self.assertEqual(len(stream), 0, "Stream should be empty: actually contains '%s'" % stream)
  146. def assertOutput(self, stream, msg):
  147. "Utility assertion: assert that the given message exists in the output"
  148. self.assertTrue(msg in stream, "'%s' does not match actual output text '%s'" % (msg, stream))
  149. ##########################################################################
  150. # DJANGO ADMIN TESTS
  151. # This first series of test classes checks the environment processing
  152. # of the django-admin.py script
  153. ##########################################################################
  154. class DjangoAdminNoSettings(AdminScriptTestCase):
  155. "A series of tests for django-admin.py when there is no settings.py file."
  156. def test_builtin_command(self):
  157. "no settings: django-admin builtin commands fail with an import error when no settings provided"
  158. args = ['sqlall','admin_scripts']
  159. out, err = self.run_django_admin(args)
  160. self.assertNoOutput(out)
  161. self.assertOutput(err, 'environment variable DJANGO_SETTINGS_MODULE is undefined')
  162. def test_builtin_with_bad_settings(self):
  163. "no settings: django-admin builtin commands fail if settings file (from argument) doesn't exist"
  164. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  165. out, err = self.run_django_admin(args)
  166. self.assertNoOutput(out)
  167. self.assertOutput(err, "Could not import settings 'bad_settings'")
  168. def test_builtin_with_bad_environment(self):
  169. "no settings: django-admin builtin commands fail if settings file (from environment) doesn't exist"
  170. args = ['sqlall','admin_scripts']
  171. out, err = self.run_django_admin(args,'bad_settings')
  172. self.assertNoOutput(out)
  173. self.assertOutput(err, "Could not import settings 'bad_settings'")
  174. class DjangoAdminDefaultSettings(AdminScriptTestCase):
  175. """A series of tests for django-admin.py when using a settings.py file that
  176. contains the test application.
  177. """
  178. def setUp(self):
  179. self.write_settings('settings.py')
  180. def tearDown(self):
  181. self.remove_settings('settings.py')
  182. def test_builtin_command(self):
  183. "default: django-admin builtin commands fail with an import error when no settings provided"
  184. args = ['sqlall','admin_scripts']
  185. out, err = self.run_django_admin(args)
  186. self.assertNoOutput(out)
  187. self.assertOutput(err, 'environment variable DJANGO_SETTINGS_MODULE is undefined')
  188. def test_builtin_with_settings(self):
  189. "default: django-admin builtin commands succeed if settings are provided as argument"
  190. args = ['sqlall','--settings=settings', 'admin_scripts']
  191. out, err = self.run_django_admin(args)
  192. self.assertNoOutput(err)
  193. self.assertOutput(out, 'CREATE TABLE')
  194. def test_builtin_with_environment(self):
  195. "default: django-admin builtin commands succeed if settings are provided in the environment"
  196. args = ['sqlall','admin_scripts']
  197. out, err = self.run_django_admin(args,'settings')
  198. self.assertNoOutput(err)
  199. self.assertOutput(out, 'CREATE TABLE')
  200. def test_builtin_with_bad_settings(self):
  201. "default: django-admin builtin commands fail if settings file (from argument) doesn't exist"
  202. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  203. out, err = self.run_django_admin(args)
  204. self.assertNoOutput(out)
  205. self.assertOutput(err, "Could not import settings 'bad_settings'")
  206. def test_builtin_with_bad_environment(self):
  207. "default: django-admin builtin commands fail if settings file (from environment) doesn't exist"
  208. args = ['sqlall','admin_scripts']
  209. out, err = self.run_django_admin(args,'bad_settings')
  210. self.assertNoOutput(out)
  211. self.assertOutput(err, "Could not import settings 'bad_settings'")
  212. def test_custom_command(self):
  213. "default: django-admin can't execute user commands if it isn't provided settings"
  214. args = ['noargs_command']
  215. out, err = self.run_django_admin(args)
  216. self.assertNoOutput(out)
  217. self.assertOutput(err, "Unknown command: 'noargs_command'")
  218. def test_custom_command_with_settings(self):
  219. "default: django-admin can execute user commands if settings are provided as argument"
  220. args = ['noargs_command', '--settings=settings']
  221. out, err = self.run_django_admin(args)
  222. self.assertNoOutput(err)
  223. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  224. def test_custom_command_with_environment(self):
  225. "default: django-admin can execute user commands if settings are provided in environment"
  226. args = ['noargs_command']
  227. out, err = self.run_django_admin(args,'settings')
  228. self.assertNoOutput(err)
  229. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  230. class DjangoAdminFullPathDefaultSettings(AdminScriptTestCase):
  231. """A series of tests for django-admin.py when using a settings.py file that
  232. contains the test application specified using a full path.
  233. """
  234. def setUp(self):
  235. self.write_settings('settings.py', ['django.contrib.auth', 'django.contrib.contenttypes', 'regressiontests.admin_scripts'])
  236. def tearDown(self):
  237. self.remove_settings('settings.py')
  238. def test_builtin_command(self):
  239. "fulldefault: django-admin builtin commands fail with an import error when no settings provided"
  240. args = ['sqlall','admin_scripts']
  241. out, err = self.run_django_admin(args)
  242. self.assertNoOutput(out)
  243. self.assertOutput(err, 'environment variable DJANGO_SETTINGS_MODULE is undefined')
  244. def test_builtin_with_settings(self):
  245. "fulldefault: django-admin builtin commands succeed if a settings file is provided"
  246. args = ['sqlall','--settings=settings', 'admin_scripts']
  247. out, err = self.run_django_admin(args)
  248. self.assertNoOutput(err)
  249. self.assertOutput(out, 'CREATE TABLE')
  250. def test_builtin_with_environment(self):
  251. "fulldefault: django-admin builtin commands succeed if the environment contains settings"
  252. args = ['sqlall','admin_scripts']
  253. out, err = self.run_django_admin(args,'settings')
  254. self.assertNoOutput(err)
  255. self.assertOutput(out, 'CREATE TABLE')
  256. def test_builtin_with_bad_settings(self):
  257. "fulldefault: django-admin builtin commands fail if settings file (from argument) doesn't exist"
  258. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  259. out, err = self.run_django_admin(args)
  260. self.assertNoOutput(out)
  261. self.assertOutput(err, "Could not import settings 'bad_settings'")
  262. def test_builtin_with_bad_environment(self):
  263. "fulldefault: django-admin builtin commands fail if settings file (from environment) doesn't exist"
  264. args = ['sqlall','admin_scripts']
  265. out, err = self.run_django_admin(args,'bad_settings')
  266. self.assertNoOutput(out)
  267. self.assertOutput(err, "Could not import settings 'bad_settings'")
  268. def test_custom_command(self):
  269. "fulldefault: django-admin can't execute user commands unless settings are provided"
  270. args = ['noargs_command']
  271. out, err = self.run_django_admin(args)
  272. self.assertNoOutput(out)
  273. self.assertOutput(err, "Unknown command: 'noargs_command'")
  274. def test_custom_command_with_settings(self):
  275. "fulldefault: django-admin can execute user commands if settings are provided as argument"
  276. args = ['noargs_command', '--settings=settings']
  277. out, err = self.run_django_admin(args)
  278. self.assertNoOutput(err)
  279. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  280. def test_custom_command_with_environment(self):
  281. "fulldefault: django-admin can execute user commands if settings are provided in environment"
  282. args = ['noargs_command']
  283. out, err = self.run_django_admin(args,'settings')
  284. self.assertNoOutput(err)
  285. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  286. class DjangoAdminMinimalSettings(AdminScriptTestCase):
  287. """A series of tests for django-admin.py when using a settings.py file that
  288. doesn't contain the test application.
  289. """
  290. def setUp(self):
  291. self.write_settings('settings.py', apps=['django.contrib.auth','django.contrib.contenttypes'])
  292. def tearDown(self):
  293. self.remove_settings('settings.py')
  294. def test_builtin_command(self):
  295. "minimal: django-admin builtin commands fail with an import error when no settings provided"
  296. args = ['sqlall','admin_scripts']
  297. out, err = self.run_django_admin(args)
  298. self.assertNoOutput(out)
  299. self.assertOutput(err, 'environment variable DJANGO_SETTINGS_MODULE is undefined')
  300. def test_builtin_with_settings(self):
  301. "minimal: django-admin builtin commands fail if settings are provided as argument"
  302. args = ['sqlall','--settings=settings', 'admin_scripts']
  303. out, err = self.run_django_admin(args)
  304. self.assertNoOutput(out)
  305. self.assertOutput(err, 'App with label admin_scripts could not be found')
  306. def test_builtin_with_environment(self):
  307. "minimal: django-admin builtin commands fail if settings are provided in the environment"
  308. args = ['sqlall','admin_scripts']
  309. out, err = self.run_django_admin(args,'settings')
  310. self.assertNoOutput(out)
  311. self.assertOutput(err, 'App with label admin_scripts could not be found')
  312. def test_builtin_with_bad_settings(self):
  313. "minimal: django-admin builtin commands fail if settings file (from argument) doesn't exist"
  314. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  315. out, err = self.run_django_admin(args)
  316. self.assertNoOutput(out)
  317. self.assertOutput(err, "Could not import settings 'bad_settings'")
  318. def test_builtin_with_bad_environment(self):
  319. "minimal: django-admin builtin commands fail if settings file (from environment) doesn't exist"
  320. args = ['sqlall','admin_scripts']
  321. out, err = self.run_django_admin(args,'bad_settings')
  322. self.assertNoOutput(out)
  323. self.assertOutput(err, "Could not import settings 'bad_settings'")
  324. def test_custom_command(self):
  325. "minimal: django-admin can't execute user commands unless settings are provided"
  326. args = ['noargs_command']
  327. out, err = self.run_django_admin(args)
  328. self.assertNoOutput(out)
  329. self.assertOutput(err, "Unknown command: 'noargs_command'")
  330. def test_custom_command_with_settings(self):
  331. "minimal: django-admin can't execute user commands, even if settings are provided as argument"
  332. args = ['noargs_command', '--settings=settings']
  333. out, err = self.run_django_admin(args)
  334. self.assertNoOutput(out)
  335. self.assertOutput(err, "Unknown command: 'noargs_command'")
  336. def test_custom_command_with_environment(self):
  337. "minimal: django-admin can't execute user commands, even if settings are provided in environment"
  338. args = ['noargs_command']
  339. out, err = self.run_django_admin(args,'settings')
  340. self.assertNoOutput(out)
  341. self.assertOutput(err, "Unknown command: 'noargs_command'")
  342. class DjangoAdminAlternateSettings(AdminScriptTestCase):
  343. """A series of tests for django-admin.py when using a settings file
  344. with a name other than 'settings.py'.
  345. """
  346. def setUp(self):
  347. self.write_settings('alternate_settings.py')
  348. def tearDown(self):
  349. self.remove_settings('alternate_settings.py')
  350. def test_builtin_command(self):
  351. "alternate: django-admin builtin commands fail with an import error when no settings provided"
  352. args = ['sqlall','admin_scripts']
  353. out, err = self.run_django_admin(args)
  354. self.assertNoOutput(out)
  355. self.assertOutput(err, 'environment variable DJANGO_SETTINGS_MODULE is undefined')
  356. def test_builtin_with_settings(self):
  357. "alternate: django-admin builtin commands succeed if settings are provided as argument"
  358. args = ['sqlall','--settings=alternate_settings', 'admin_scripts']
  359. out, err = self.run_django_admin(args)
  360. self.assertNoOutput(err)
  361. self.assertOutput(out, 'CREATE TABLE')
  362. def test_builtin_with_environment(self):
  363. "alternate: django-admin builtin commands succeed if settings are provided in the environment"
  364. args = ['sqlall','admin_scripts']
  365. out, err = self.run_django_admin(args,'alternate_settings')
  366. self.assertNoOutput(err)
  367. self.assertOutput(out, 'CREATE TABLE')
  368. def test_builtin_with_bad_settings(self):
  369. "alternate: django-admin builtin commands fail if settings file (from argument) doesn't exist"
  370. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  371. out, err = self.run_django_admin(args)
  372. self.assertNoOutput(out)
  373. self.assertOutput(err, "Could not import settings 'bad_settings'")
  374. def test_builtin_with_bad_environment(self):
  375. "alternate: django-admin builtin commands fail if settings file (from environment) doesn't exist"
  376. args = ['sqlall','admin_scripts']
  377. out, err = self.run_django_admin(args,'bad_settings')
  378. self.assertNoOutput(out)
  379. self.assertOutput(err, "Could not import settings 'bad_settings'")
  380. def test_custom_command(self):
  381. "alternate: django-admin can't execute user commands unless settings are provided"
  382. args = ['noargs_command']
  383. out, err = self.run_django_admin(args)
  384. self.assertNoOutput(out)
  385. self.assertOutput(err, "Unknown command: 'noargs_command'")
  386. def test_custom_command_with_settings(self):
  387. "alternate: django-admin can execute user commands if settings are provided as argument"
  388. args = ['noargs_command', '--settings=alternate_settings']
  389. out, err = self.run_django_admin(args)
  390. self.assertNoOutput(err)
  391. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  392. def test_custom_command_with_environment(self):
  393. "alternate: django-admin can execute user commands if settings are provided in environment"
  394. args = ['noargs_command']
  395. out, err = self.run_django_admin(args,'alternate_settings')
  396. self.assertNoOutput(err)
  397. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  398. class DjangoAdminMultipleSettings(AdminScriptTestCase):
  399. """A series of tests for django-admin.py when multiple settings files
  400. (including the default 'settings.py') are available. The default settings
  401. file is insufficient for performing the operations described, so the
  402. alternate settings must be used by the running script.
  403. """
  404. def setUp(self):
  405. self.write_settings('settings.py', apps=['django.contrib.auth','django.contrib.contenttypes'])
  406. self.write_settings('alternate_settings.py')
  407. def tearDown(self):
  408. self.remove_settings('settings.py')
  409. self.remove_settings('alternate_settings.py')
  410. def test_builtin_command(self):
  411. "alternate: django-admin builtin commands fail with an import error when no settings provided"
  412. args = ['sqlall','admin_scripts']
  413. out, err = self.run_django_admin(args)
  414. self.assertNoOutput(out)
  415. self.assertOutput(err, 'environment variable DJANGO_SETTINGS_MODULE is undefined')
  416. def test_builtin_with_settings(self):
  417. "alternate: django-admin builtin commands succeed if settings are provided as argument"
  418. args = ['sqlall','--settings=alternate_settings', 'admin_scripts']
  419. out, err = self.run_django_admin(args)
  420. self.assertNoOutput(err)
  421. self.assertOutput(out, 'CREATE TABLE')
  422. def test_builtin_with_environment(self):
  423. "alternate: django-admin builtin commands succeed if settings are provided in the environment"
  424. args = ['sqlall','admin_scripts']
  425. out, err = self.run_django_admin(args,'alternate_settings')
  426. self.assertNoOutput(err)
  427. self.assertOutput(out, 'CREATE TABLE')
  428. def test_builtin_with_bad_settings(self):
  429. "alternate: django-admin builtin commands fail if settings file (from argument) doesn't exist"
  430. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  431. out, err = self.run_django_admin(args)
  432. self.assertOutput(err, "Could not import settings 'bad_settings'")
  433. def test_builtin_with_bad_environment(self):
  434. "alternate: django-admin builtin commands fail if settings file (from environment) doesn't exist"
  435. args = ['sqlall','admin_scripts']
  436. out, err = self.run_django_admin(args,'bad_settings')
  437. self.assertNoOutput(out)
  438. self.assertOutput(err, "Could not import settings 'bad_settings'")
  439. def test_custom_command(self):
  440. "alternate: django-admin can't execute user commands unless settings are provided"
  441. args = ['noargs_command']
  442. out, err = self.run_django_admin(args)
  443. self.assertNoOutput(out)
  444. self.assertOutput(err, "Unknown command: 'noargs_command'")
  445. def test_custom_command_with_settings(self):
  446. "alternate: django-admin can't execute user commands, even if settings are provided as argument"
  447. args = ['noargs_command', '--settings=alternate_settings']
  448. out, err = self.run_django_admin(args)
  449. self.assertNoOutput(err)
  450. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  451. def test_custom_command_with_environment(self):
  452. "alternate: django-admin can't execute user commands, even if settings are provided in environment"
  453. args = ['noargs_command']
  454. out, err = self.run_django_admin(args,'alternate_settings')
  455. self.assertNoOutput(err)
  456. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  457. class DjangoAdminSettingsDirectory(AdminScriptTestCase):
  458. """
  459. A series of tests for django-admin.py when the settings file is in a
  460. directory. (see #9751).
  461. """
  462. def setUp(self):
  463. self.write_settings('settings', is_dir=True)
  464. def tearDown(self):
  465. self.remove_settings('settings', is_dir=True)
  466. def test_setup_environ(self):
  467. "directory: startapp creates the correct directory"
  468. test_dir = os.path.dirname(os.path.dirname(__file__))
  469. args = ['startapp','settings_test']
  470. app_path = os.path.join(test_dir, 'settings_test')
  471. out, err = self.run_django_admin(args,'settings')
  472. self.addCleanup(shutil.rmtree, app_path)
  473. self.assertNoOutput(err)
  474. self.assertTrue(os.path.exists(app_path))
  475. def test_builtin_command(self):
  476. "directory: django-admin builtin commands fail with an import error when no settings provided"
  477. args = ['sqlall','admin_scripts']
  478. out, err = self.run_django_admin(args)
  479. self.assertNoOutput(out)
  480. self.assertOutput(err, 'environment variable DJANGO_SETTINGS_MODULE is undefined')
  481. def test_builtin_with_bad_settings(self):
  482. "directory: django-admin builtin commands fail if settings file (from argument) doesn't exist"
  483. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  484. out, err = self.run_django_admin(args)
  485. self.assertOutput(err, "Could not import settings 'bad_settings'")
  486. def test_builtin_with_bad_environment(self):
  487. "directory: django-admin builtin commands fail if settings file (from environment) doesn't exist"
  488. args = ['sqlall','admin_scripts']
  489. out, err = self.run_django_admin(args,'bad_settings')
  490. self.assertNoOutput(out)
  491. self.assertOutput(err, "Could not import settings 'bad_settings'")
  492. def test_custom_command(self):
  493. "directory: django-admin can't execute user commands unless settings are provided"
  494. args = ['noargs_command']
  495. out, err = self.run_django_admin(args)
  496. self.assertNoOutput(out)
  497. self.assertOutput(err, "Unknown command: 'noargs_command'")
  498. def test_builtin_with_settings(self):
  499. "directory: django-admin builtin commands succeed if settings are provided as argument"
  500. args = ['sqlall','--settings=settings', 'admin_scripts']
  501. out, err = self.run_django_admin(args)
  502. self.assertNoOutput(err)
  503. self.assertOutput(out, 'CREATE TABLE')
  504. def test_builtin_with_environment(self):
  505. "directory: django-admin builtin commands succeed if settings are provided in the environment"
  506. args = ['sqlall','admin_scripts']
  507. out, err = self.run_django_admin(args,'settings')
  508. self.assertNoOutput(err)
  509. self.assertOutput(out, 'CREATE TABLE')
  510. ##########################################################################
  511. # MANAGE.PY TESTS
  512. # This next series of test classes checks the environment processing
  513. # of the generated manage.py script
  514. ##########################################################################
  515. class ManageNoSettings(AdminScriptTestCase):
  516. "A series of tests for manage.py when there is no settings.py file."
  517. def test_builtin_command(self):
  518. "no settings: manage.py builtin commands fail with an import error when no settings provided"
  519. args = ['sqlall','admin_scripts']
  520. out, err = self.run_manage(args)
  521. self.assertNoOutput(out)
  522. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  523. def test_builtin_with_bad_settings(self):
  524. "no settings: manage.py builtin commands fail if settings file (from argument) doesn't exist"
  525. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  526. out, err = self.run_manage(args)
  527. self.assertNoOutput(out)
  528. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  529. def test_builtin_with_bad_environment(self):
  530. "no settings: manage.py builtin commands fail if settings file (from environment) doesn't exist"
  531. args = ['sqlall','admin_scripts']
  532. out, err = self.run_manage(args,'bad_settings')
  533. self.assertNoOutput(out)
  534. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  535. class ManageDefaultSettings(AdminScriptTestCase):
  536. """A series of tests for manage.py when using a settings.py file that
  537. contains the test application.
  538. """
  539. def setUp(self):
  540. self.write_settings('settings.py')
  541. def tearDown(self):
  542. self.remove_settings('settings.py')
  543. def test_builtin_command(self):
  544. "default: manage.py builtin commands succeed when default settings are appropriate"
  545. args = ['sqlall','admin_scripts']
  546. out, err = self.run_manage(args)
  547. self.assertNoOutput(err)
  548. self.assertOutput(out, 'CREATE TABLE')
  549. def test_builtin_with_settings(self):
  550. "default: manage.py builtin commands succeed if settings are provided as argument"
  551. args = ['sqlall','--settings=settings', 'admin_scripts']
  552. out, err = self.run_manage(args)
  553. self.assertNoOutput(err)
  554. self.assertOutput(out, 'CREATE TABLE')
  555. def test_builtin_with_environment(self):
  556. "default: manage.py builtin commands succeed if settings are provided in the environment"
  557. args = ['sqlall','admin_scripts']
  558. out, err = self.run_manage(args,'settings')
  559. self.assertNoOutput(err)
  560. self.assertOutput(out, 'CREATE TABLE')
  561. def test_builtin_with_bad_settings(self):
  562. "default: manage.py builtin commands succeed if settings file (from argument) doesn't exist"
  563. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  564. out, err = self.run_manage(args)
  565. self.assertNoOutput(out)
  566. self.assertOutput(err, "Could not import settings 'bad_settings'")
  567. def test_builtin_with_bad_environment(self):
  568. "default: manage.py builtin commands fail if settings file (from environment) doesn't exist"
  569. args = ['sqlall','admin_scripts']
  570. out, err = self.run_manage(args,'bad_settings')
  571. self.assertNoOutput(out)
  572. self.assertOutput(err, "Could not import settings 'bad_settings'")
  573. def test_custom_command(self):
  574. "default: manage.py can execute user commands when default settings are appropriate"
  575. args = ['noargs_command']
  576. out, err = self.run_manage(args)
  577. self.assertNoOutput(err)
  578. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  579. def test_custom_command_with_settings(self):
  580. "default: manage.py can execute user commands when settings are provided as argument"
  581. args = ['noargs_command', '--settings=settings']
  582. out, err = self.run_manage(args)
  583. self.assertNoOutput(err)
  584. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  585. def test_custom_command_with_environment(self):
  586. "default: manage.py can execute user commands when settings are provided in environment"
  587. args = ['noargs_command']
  588. out, err = self.run_manage(args,'settings')
  589. self.assertNoOutput(err)
  590. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  591. class ManageFullPathDefaultSettings(AdminScriptTestCase):
  592. """A series of tests for manage.py when using a settings.py file that
  593. contains the test application specified using a full path.
  594. """
  595. def setUp(self):
  596. self.write_settings('settings.py', ['django.contrib.auth', 'django.contrib.contenttypes', 'regressiontests.admin_scripts'])
  597. def tearDown(self):
  598. self.remove_settings('settings.py')
  599. def test_builtin_command(self):
  600. "fulldefault: manage.py builtin commands succeed when default settings are appropriate"
  601. args = ['sqlall','admin_scripts']
  602. out, err = self.run_manage(args)
  603. self.assertNoOutput(err)
  604. self.assertOutput(out, 'CREATE TABLE')
  605. def test_builtin_with_settings(self):
  606. "fulldefault: manage.py builtin commands succeed if settings are provided as argument"
  607. args = ['sqlall','--settings=settings', 'admin_scripts']
  608. out, err = self.run_manage(args)
  609. self.assertNoOutput(err)
  610. self.assertOutput(out, 'CREATE TABLE')
  611. def test_builtin_with_environment(self):
  612. "fulldefault: manage.py builtin commands succeed if settings are provided in the environment"
  613. args = ['sqlall','admin_scripts']
  614. out, err = self.run_manage(args,'settings')
  615. self.assertNoOutput(err)
  616. self.assertOutput(out, 'CREATE TABLE')
  617. def test_builtin_with_bad_settings(self):
  618. "fulldefault: manage.py builtin commands succeed if settings file (from argument) doesn't exist"
  619. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  620. out, err = self.run_manage(args)
  621. self.assertNoOutput(out)
  622. self.assertOutput(err, "Could not import settings 'bad_settings'")
  623. def test_builtin_with_bad_environment(self):
  624. "fulldefault: manage.py builtin commands fail if settings file (from environment) doesn't exist"
  625. args = ['sqlall','admin_scripts']
  626. out, err = self.run_manage(args,'bad_settings')
  627. self.assertNoOutput(out)
  628. self.assertOutput(err, "Could not import settings 'bad_settings'")
  629. def test_custom_command(self):
  630. "fulldefault: manage.py can execute user commands when default settings are appropriate"
  631. args = ['noargs_command']
  632. out, err = self.run_manage(args)
  633. self.assertNoOutput(err)
  634. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  635. def test_custom_command_with_settings(self):
  636. "fulldefault: manage.py can execute user commands when settings are provided as argument"
  637. args = ['noargs_command', '--settings=settings']
  638. out, err = self.run_manage(args)
  639. self.assertNoOutput(err)
  640. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  641. def test_custom_command_with_environment(self):
  642. "fulldefault: manage.py can execute user commands when settings are provided in environment"
  643. args = ['noargs_command']
  644. out, err = self.run_manage(args,'settings')
  645. self.assertNoOutput(err)
  646. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  647. class ManageMinimalSettings(AdminScriptTestCase):
  648. """A series of tests for manage.py when using a settings.py file that
  649. doesn't contain the test application.
  650. """
  651. def setUp(self):
  652. self.write_settings('settings.py', apps=['django.contrib.auth','django.contrib.contenttypes'])
  653. def tearDown(self):
  654. self.remove_settings('settings.py')
  655. def test_builtin_command(self):
  656. "minimal: manage.py builtin commands fail with an import error when no settings provided"
  657. args = ['sqlall','admin_scripts']
  658. out, err = self.run_manage(args)
  659. self.assertNoOutput(out)
  660. self.assertOutput(err, 'App with label admin_scripts could not be found')
  661. def test_builtin_with_settings(self):
  662. "minimal: manage.py builtin commands fail if settings are provided as argument"
  663. args = ['sqlall','--settings=settings', 'admin_scripts']
  664. out, err = self.run_manage(args)
  665. self.assertNoOutput(out)
  666. self.assertOutput(err, 'App with label admin_scripts could not be found')
  667. def test_builtin_with_environment(self):
  668. "minimal: manage.py builtin commands fail if settings are provided in the environment"
  669. args = ['sqlall','admin_scripts']
  670. out, err = self.run_manage(args,'settings')
  671. self.assertNoOutput(out)
  672. self.assertOutput(err, 'App with label admin_scripts could not be found')
  673. def test_builtin_with_bad_settings(self):
  674. "minimal: manage.py builtin commands fail if settings file (from argument) doesn't exist"
  675. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  676. out, err = self.run_manage(args)
  677. self.assertNoOutput(out)
  678. self.assertOutput(err, "Could not import settings 'bad_settings'")
  679. def test_builtin_with_bad_environment(self):
  680. "minimal: manage.py builtin commands fail if settings file (from environment) doesn't exist"
  681. args = ['sqlall','admin_scripts']
  682. out, err = self.run_manage(args,'bad_settings')
  683. self.assertNoOutput(out)
  684. self.assertOutput(err, "Could not import settings 'bad_settings'")
  685. def test_custom_command(self):
  686. "minimal: manage.py can't execute user commands without appropriate settings"
  687. args = ['noargs_command']
  688. out, err = self.run_manage(args)
  689. self.assertNoOutput(out)
  690. self.assertOutput(err, "Unknown command: 'noargs_command'")
  691. def test_custom_command_with_settings(self):
  692. "minimal: manage.py can't execute user commands, even if settings are provided as argument"
  693. args = ['noargs_command', '--settings=settings']
  694. out, err = self.run_manage(args)
  695. self.assertNoOutput(out)
  696. self.assertOutput(err, "Unknown command: 'noargs_command'")
  697. def test_custom_command_with_environment(self):
  698. "minimal: manage.py can't execute user commands, even if settings are provided in environment"
  699. args = ['noargs_command']
  700. out, err = self.run_manage(args,'settings')
  701. self.assertNoOutput(out)
  702. self.assertOutput(err, "Unknown command: 'noargs_command'")
  703. class ManageAlternateSettings(AdminScriptTestCase):
  704. """A series of tests for manage.py when using a settings file
  705. with a name other than 'settings.py'.
  706. """
  707. def setUp(self):
  708. self.write_settings('alternate_settings.py')
  709. def tearDown(self):
  710. self.remove_settings('alternate_settings.py')
  711. def test_builtin_command(self):
  712. "alternate: manage.py builtin commands fail with an import error when no default settings provided"
  713. args = ['sqlall','admin_scripts']
  714. out, err = self.run_manage(args)
  715. self.assertNoOutput(out)
  716. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  717. def test_builtin_with_settings(self):
  718. "alternate: manage.py builtin commands fail if settings are provided as argument but no defaults"
  719. args = ['sqlall','--settings=alternate_settings', 'admin_scripts']
  720. out, err = self.run_manage(args)
  721. self.assertNoOutput(out)
  722. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  723. def test_builtin_with_environment(self):
  724. "alternate: manage.py builtin commands fail if settings are provided in the environment but no defaults"
  725. args = ['sqlall','admin_scripts']
  726. out, err = self.run_manage(args,'alternate_settings')
  727. self.assertNoOutput(out)
  728. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  729. def test_builtin_with_bad_settings(self):
  730. "alternate: manage.py builtin commands fail if settings file (from argument) doesn't exist"
  731. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  732. out, err = self.run_manage(args)
  733. self.assertNoOutput(out)
  734. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  735. def test_builtin_with_bad_environment(self):
  736. "alternate: manage.py builtin commands fail if settings file (from environment) doesn't exist"
  737. args = ['sqlall','admin_scripts']
  738. out, err = self.run_manage(args,'bad_settings')
  739. self.assertNoOutput(out)
  740. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  741. def test_custom_command(self):
  742. "alternate: manage.py can't execute user commands"
  743. args = ['noargs_command']
  744. out, err = self.run_manage(args)
  745. self.assertNoOutput(out)
  746. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  747. def test_custom_command_with_settings(self):
  748. "alternate: manage.py can't execute user commands, even if settings are provided as argument"
  749. args = ['noargs_command', '--settings=alternate_settings']
  750. out, err = self.run_manage(args)
  751. self.assertNoOutput(out)
  752. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  753. def test_custom_command_with_environment(self):
  754. "alternate: manage.py can't execute user commands, even if settings are provided in environment"
  755. args = ['noargs_command']
  756. out, err = self.run_manage(args,'alternate_settings')
  757. self.assertNoOutput(out)
  758. self.assertOutput(err, "Can't find the file 'settings.py' in the directory containing './manage.py'")
  759. class ManageMultipleSettings(AdminScriptTestCase):
  760. """A series of tests for manage.py when multiple settings files
  761. (including the default 'settings.py') are available. The default settings
  762. file is insufficient for performing the operations described, so the
  763. alternate settings must be used by the running script.
  764. """
  765. def setUp(self):
  766. self.write_settings('settings.py', apps=['django.contrib.auth','django.contrib.contenttypes'])
  767. self.write_settings('alternate_settings.py')
  768. def tearDown(self):
  769. self.remove_settings('settings.py')
  770. self.remove_settings('alternate_settings.py')
  771. def test_builtin_command(self):
  772. "multiple: manage.py builtin commands fail with an import error when no settings provided"
  773. args = ['sqlall','admin_scripts']
  774. out, err = self.run_manage(args)
  775. self.assertNoOutput(out)
  776. self.assertOutput(err, 'App with label admin_scripts could not be found.')
  777. def test_builtin_with_settings(self):
  778. "multiple: manage.py builtin commands succeed if settings are provided as argument"
  779. args = ['sqlall','--settings=alternate_settings', 'admin_scripts']
  780. out, err = self.run_manage(args)
  781. self.assertNoOutput(err)
  782. self.assertOutput(out, 'CREATE TABLE')
  783. def test_builtin_with_environment(self):
  784. "multiple: manage.py can execute builtin commands if settings are provided in the environment"
  785. args = ['sqlall','admin_scripts']
  786. out, err = self.run_manage(args,'alternate_settings')
  787. self.assertNoOutput(err)
  788. self.assertOutput(out, 'CREATE TABLE')
  789. def test_builtin_with_bad_settings(self):
  790. "multiple: manage.py builtin commands fail if settings file (from argument) doesn't exist"
  791. args = ['sqlall','--settings=bad_settings', 'admin_scripts']
  792. out, err = self.run_manage(args)
  793. self.assertNoOutput(out)
  794. self.assertOutput(err, "Could not import settings 'bad_settings'")
  795. def test_builtin_with_bad_environment(self):
  796. "multiple: manage.py builtin commands fail if settings file (from environment) doesn't exist"
  797. args = ['sqlall','admin_scripts']
  798. out, err = self.run_manage(args,'bad_settings')
  799. self.assertNoOutput(out)
  800. self.assertOutput(err, "Could not import settings 'bad_settings'")
  801. def test_custom_command(self):
  802. "multiple: manage.py can't execute user commands using default settings"
  803. args = ['noargs_command']
  804. out, err = self.run_manage(args)
  805. self.assertNoOutput(out)
  806. self.assertOutput(err, "Unknown command: 'noargs_command'")
  807. def test_custom_command_with_settings(self):
  808. "multiple: manage.py can execute user commands if settings are provided as argument"
  809. args = ['noargs_command', '--settings=alternate_settings']
  810. out, err = self.run_manage(args)
  811. self.assertNoOutput(err)
  812. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  813. def test_custom_command_with_environment(self):
  814. "multiple: manage.py can execute user commands if settings are provided in environment"
  815. args = ['noargs_command']
  816. out, err = self.run_manage(args,'alternate_settings')
  817. self.assertNoOutput(err)
  818. self.assertOutput(out, "EXECUTE:NoArgsCommand")
  819. class ManageSettingsWithImportError(AdminScriptTestCase):
  820. """Tests for manage.py when using the default settings.py file
  821. with an import error. Ticket #14130.
  822. """
  823. def setUp(self):
  824. self.write_settings_with_import_error('settings.py')
  825. def tearDown(self):
  826. self.remove_settings('settings.py')
  827. def write_settings_with_import_error(self, filename, apps=None, is_dir=False, sdict=None):
  828. test_dir = os.path.dirname(os.path.dirname(__file__))
  829. if is_dir:
  830. settings_dir = os.path.join(test_dir,filename)
  831. os.mkdir(settings_dir)
  832. settings_file = open(os.path.join(settings_dir,'__init__.py'), 'w')
  833. else:
  834. settings_file = open(os.path.join(test_dir, filename), 'w')
  835. settings_file.write('# Settings file automatically generated by regressiontests.admin_scripts test case\n')
  836. settings_file.write('# The next line will cause an import error:\nimport foo42bar\n')
  837. settings_file.close()
  838. def test_builtin_command(self):
  839. "import error: manage.py builtin commands shows useful diagnostic info when settings with import errors is provided"
  840. args = ['sqlall','admin_scripts']
  841. out, err = self.run_manage(args)
  842. self.assertNoOutput(out)
  843. self.assertOutput(err, "ImportError: No module named foo42bar")
  844. class ManageValidate(AdminScriptTestCase):
  845. def tearDown(self):
  846. self.remove_settings('settings.py')
  847. def test_nonexistent_app(self):
  848. "manage.py validate reports an error on a non-existent app in INSTALLED_APPS"
  849. self.write_settings('settings.py', apps=['admin_scriptz.broken_app'], sdict={'USE_I18N': False})
  850. args = ['validate']
  851. out, err = self.run_manage(args)
  852. self.assertNoOutput(out)
  853. self.assertOutput(err, 'No module named admin_scriptz')
  854. def test_broken_app(self):
  855. "manage.py validate reports an ImportError if an app's models.py raises one on import"
  856. self.write_settings('settings.py', apps=['admin_scripts.broken_app'])
  857. args = ['validate']
  858. out, err = self.run_manage(args)
  859. self.assertNoOutput(out)
  860. self.assertOutput(err, 'ImportError')
  861. def test_complex_app(self):
  862. "manage.py validate does not raise an ImportError validating a complex app with nested calls to load_app"
  863. self.write_settings('settings.py',
  864. apps=['admin_scripts.complex_app', 'admin_scripts.simple_app'],
  865. sdict={'DEBUG': True})
  866. args = ['validate']
  867. out, err = self.run_manage(args)
  868. self.assertNoOutput(err)
  869. self.assertOutput(out, '0 errors found')
  870. def test_app_with_import(self):
  871. "manage.py validate does not raise errors when an app imports a base class that itself has an abstract base"
  872. self.write_settings('settings.py',
  873. apps=['admin_scripts.app_with_import',
  874. 'django.contrib.comments',
  875. 'django.contrib.auth',
  876. 'django.contrib.contenttypes',
  877. 'django.contrib.sites'],
  878. sdict={'DEBUG': True})
  879. args = ['validate']
  880. out, err = self.run_manage(args)
  881. self.assertNoOutput(err)
  882. self.assertOutput(out, '0 errors found')
  883. class ManageRunserver(AdminScriptTestCase):
  884. def setUp(self):
  885. from django.core.management.commands.runserver import BaseRunserverCommand
  886. def monkey_run(*args, **options): return
  887. self.cmd = BaseRunserverCommand()
  888. self.cmd.run = monkey_run
  889. def assertServerSettings(self, addr, port, ipv6=None, raw_ipv6=False):
  890. self.assertEqual(self.cmd.addr, addr)
  891. self.assertEqual(self.cmd.port, port)
  892. self.assertEqual(self.cmd.use_ipv6, ipv6)
  893. self.assertEqual(self.cmd._raw_ipv6, raw_ipv6)
  894. def test_runserver_addrport(self):
  895. self.cmd.handle()
  896. self.assertServerSettings('127.0.0.1', '8000')
  897. self.cmd.handle(addrport="1.2.3.4:8000")
  898. self.assertServerSettings('1.2.3.4', '8000')
  899. self.cmd.handle(addrport="7000")
  900. self.assertServerSettings('127.0.0.1', '7000')
  901. # IPv6
  902. self.cmd.handle(addrport="", use_ipv6=True)
  903. self.assertServerSettings('::1', '8000', ipv6=True, raw_ipv6=True)
  904. self.cmd.handle(addrport="7000", use_ipv6=True)
  905. self.assertServerSettings('::1', '7000', ipv6=True, raw_ipv6=True)
  906. self.cmd.handle(addrport="[2001:0db8:1234:5678::9]:7000")
  907. self.assertServerSettings('2001:0db8:1234:5678::9', '7000', ipv6=True, raw_ipv6=True)
  908. # Hostname
  909. self.cmd.handle(addrport="localhost:8000")
  910. self.assertServerSettings('localhost', '8000')
  911. self.cmd.handle(addrport="test.domain.local:7000")
  912. self.assertServerSettings('test.domain.local', '7000')
  913. self.cmd.handle(addrport="test.domain.local:7000", use_ipv6=True)
  914. self.assertServerSettings('test.domain.local', '7000', ipv6=True)
  915. # Potentially ambiguous
  916. # Only 4 characters, all of which could be in an ipv6 address
  917. self.cmd.handle(addrport="beef:7654")
  918. self.assertServerSettings('beef', '7654')
  919. # Uses only characters that could be in an ipv6 address
  920. self.cmd.handle(addrport="deadbeef:7654")
  921. self.assertServerSettings('deadbeef', '7654')
  922. ##########################################################################
  923. # COMMAND PROCESSING TESTS
  924. # Check that user-space commands are correctly handled - in particular,
  925. # that arguments to the commands are correctly parsed and processed.
  926. ##########################################################################
  927. class CommandTypes(AdminScriptTestCase):
  928. "Tests for the various types of base command types that can be defined."
  929. def setUp(self):
  930. self.write_settings('settings.py')
  931. def tearDown(self):
  932. self.remove_settings('settings.py')
  933. def test_version(self):
  934. "--version is handled as a special case"
  935. args = ['--version']
  936. out, err = self.run_manage(args)
  937. self.assertNoOutput(err)
  938. # Only check the first part of the version number
  939. self.assertOutput(out, get_version().split('-')[0])
  940. def test_help(self):
  941. "--help is handled as a special case"
  942. args = ['--help']
  943. out, err = self.run_manage(args)
  944. self.assertOutput(out, "Usage: manage.py subcommand [options] [args]")
  945. self.assertOutput(out, "Type 'manage.py help <subcommand>' for help on a specific subcommand.")
  946. def test_short_help(self):
  947. "-h is handled as a short form of --help"
  948. args = ['-h']
  949. out, err = self.run_manage(args)
  950. self.assertOutput(out, "Usage: manage.py subcommand [options] [args]")
  951. self.assertOutput(out, "Type 'manage.py help <subcommand>' for help on a specific subcommand.")
  952. def test_specific_help(self):
  953. "--help can be used on a specific command"
  954. args = ['sqlall','--help']
  955. out, err = self.run_manage(args)
  956. self.assertNoOutput(err)
  957. self.assertOutput(out, "Prints the CREATE TABLE, custom SQL and CREATE INDEX SQL statements for the given model module name(s).")
  958. def test_base_command(self):
  959. "User BaseCommands can execute when a label is provided"
  960. args = ['base_command','testlabel']
  961. out, err = self.run_manage(args)
  962. self.assertNoOutput(err)
  963. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', '1'), ('option_b', '2'), ('option_c', '3'), ('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  964. def test_base_command_no_label(self):
  965. "User BaseCommands can execute when no labels are provided"
  966. args = ['base_command']
  967. out, err = self.run_manage(args)
  968. self.assertNoOutput(err)
  969. self.assertOutput(out, "EXECUTE:BaseCommand labels=(), options=[('option_a', '1'), ('option_b', '2'), ('option_c', '3'), ('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  970. def test_base_command_multiple_label(self):
  971. "User BaseCommands can execute when no labels are provided"
  972. args = ['base_command','testlabel','anotherlabel']
  973. out, err = self.run_manage(args)
  974. self.assertNoOutput(err)
  975. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel', 'anotherlabel'), options=[('option_a', '1'), ('option_b', '2'), ('option_c', '3'), ('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  976. def test_base_command_with_option(self):
  977. "User BaseCommands can execute with options when a label is provided"
  978. args = ['base_command','testlabel','--option_a=x']
  979. out, err = self.run_manage(args)
  980. self.assertNoOutput(err)
  981. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', 'x'), ('option_b', '2'), ('option_c', '3'), ('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  982. def test_base_command_with_options(self):
  983. "User BaseCommands can execute with multiple options when a label is provided"
  984. args = ['base_command','testlabel','-a','x','--option_b=y']
  985. out, err = self.run_manage(args)
  986. self.assertNoOutput(err)
  987. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', 'x'), ('option_b', 'y'), ('option_c', '3'), ('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  988. def test_noargs(self):
  989. "NoArg Commands can be executed"
  990. args = ['noargs_command']
  991. out, err = self.run_manage(args)
  992. self.assertNoOutput(err)
  993. self.assertOutput(out, "EXECUTE:NoArgsCommand options=[('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  994. def test_noargs_with_args(self):
  995. "NoArg Commands raise an error if an argument is provided"
  996. args = ['noargs_command','argument']
  997. out, err = self.run_manage(args)
  998. self.assertOutput(err, "Error: Command doesn't accept any arguments")
  999. def test_app_command(self):
  1000. "User AppCommands can execute when a single app name is provided"
  1001. args = ['app_command', 'auth']
  1002. out, err = self.run_manage(args)
  1003. self.assertNoOutput(err)
  1004. self.assertOutput(out, "EXECUTE:AppCommand app=<module 'django.contrib.auth.models'")
  1005. self.assertOutput(out, os.sep.join(['django','contrib','auth','models.py']))
  1006. self.assertOutput(out, "'>, options=[('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  1007. def test_app_command_no_apps(self):
  1008. "User AppCommands raise an error when no app name is provided"
  1009. args = ['app_command']
  1010. out, err = self.run_manage(args)
  1011. self.assertOutput(err, 'Error: Enter at least one appname.')
  1012. def test_app_command_multiple_apps(self):
  1013. "User AppCommands raise an error when multiple app names are provided"
  1014. args = ['app_command','auth','contenttypes']
  1015. out, err = self.run_manage(args)
  1016. self.assertNoOutput(err)
  1017. self.assertOutput(out, "EXECUTE:AppCommand app=<module 'django.contrib.auth.models'")
  1018. self.assertOutput(out, os.sep.join(['django','contrib','auth','models.py']))
  1019. self.assertOutput(out, "'>, options=[('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  1020. self.assertOutput(out, "EXECUTE:AppCommand app=<module 'django.contrib.contenttypes.models'")
  1021. self.assertOutput(out, os.sep.join(['django','contrib','contenttypes','models.py']))
  1022. self.assertOutput(out, "'>, options=[('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  1023. def test_app_command_invalid_appname(self):
  1024. "User AppCommands can execute when a single app name is provided"
  1025. args = ['app_command', 'NOT_AN_APP']
  1026. out, err = self.run_manage(args)
  1027. self.assertOutput(err, "App with label NOT_AN_APP could not be found")
  1028. def test_app_command_some_invalid_appnames(self):
  1029. "User AppCommands can execute when some of the provided app names are invalid"
  1030. args = ['app_command', 'auth', 'NOT_AN_APP']
  1031. out, err = self.run_manage(args)
  1032. self.assertOutput(err, "App with label NOT_AN_APP could not be found")
  1033. def test_label_command(self):
  1034. "User LabelCommands can execute when a label is provided"
  1035. args = ['label_command','testlabel']
  1036. out, err = self.run_manage(args)
  1037. self.assertNoOutput(err)
  1038. self.assertOutput(out, "EXECUTE:LabelCommand label=testlabel, options=[('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  1039. def test_label_command_no_label(self):
  1040. "User LabelCommands raise an error if no label is provided"
  1041. args = ['label_command']
  1042. out, err = self.run_manage(args)
  1043. self.assertOutput(err, 'Enter at least one label')
  1044. def test_label_command_multiple_label(self):
  1045. "User LabelCommands are executed multiple times if multiple labels are provided"
  1046. args = ['label_command','testlabel','anotherlabel']
  1047. out, err = self.run_manage(args)
  1048. self.assertNoOutput(err)
  1049. self.assertOutput(out, "EXECUTE:LabelCommand label=testlabel, options=[('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  1050. self.assertOutput(out, "EXECUTE:LabelCommand label=anotherlabel, options=[('pythonpath', None), ('settings', None), ('traceback', None), ('verbosity', '1')]")
  1051. class ArgumentOrder(AdminScriptTestCase):
  1052. """Tests for 2-stage argument parsing scheme.
  1053. django-admin command arguments are parsed in 2 parts; the core arguments
  1054. (--settings, --traceback and --pythonpath) are parsed using a Lax parser.
  1055. This Lax parser ignores any unknown options. Then the full settings are
  1056. passed to the command parser, which extracts commands of interest to the
  1057. individual command.
  1058. """
  1059. def setUp(self):
  1060. self.write_settings('settings.py', apps=['django.contrib.auth','django.contrib.contenttypes'])
  1061. self.write_settings('alternate_settings.py')
  1062. def tearDown(self):
  1063. self.remove_settings('settings.py')
  1064. self.remove_settings('alternate_settings.py')
  1065. def test_setting_then_option(self):
  1066. "Options passed after settings are correctly handled"
  1067. args = ['base_command','testlabel','--settings=alternate_settings','--option_a=x']
  1068. out, err = self.run_manage(args)
  1069. self.assertNoOutput(err)
  1070. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', 'x'), ('option_b', '2'), ('option_c', '3'), ('pythonpath', None), ('settings', 'alternate_settings'), ('traceback', None), ('verbosity', '1')]")
  1071. def test_setting_then_short_option(self):
  1072. "Short options passed after settings are correctly handled"
  1073. args = ['base_command','testlabel','--settings=alternate_settings','--option_a=x']
  1074. out, err = self.run_manage(args)
  1075. self.assertNoOutput(err)
  1076. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', 'x'), ('option_b', '2'), ('option_c', '3'), ('pythonpath', None), ('settings', 'alternate_settings'), ('traceback', None), ('verbosity', '1')]")
  1077. def test_option_then_setting(self):
  1078. "Options passed before settings are correctly handled"
  1079. args = ['base_command','testlabel','--option_a=x','--settings=alternate_settings']
  1080. out, err = self.run_manage(args)
  1081. self.assertNoOutput(err)
  1082. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', 'x'), ('option_b', '2'), ('option_c', '3'), ('pythonpath', None), ('settings', 'alternate_settings'), ('traceback', None), ('verbosity', '1')]")
  1083. def test_short_option_then_setting(self):
  1084. "Short options passed before settings are correctly handled"
  1085. args = ['base_command','testlabel','-a','x','--settings=alternate_settings']
  1086. out, err = self.run_manage(args)
  1087. self.assertNoOutput(err)
  1088. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', 'x'), ('option_b', '2'), ('option_c', '3'), ('pythonpath', None), ('settings', 'alternate_settings'), ('traceback', None), ('verbosity', '1')]")
  1089. def test_option_then_setting_then_option(self):
  1090. "Options are correctly handled when they are passed before and after a setting"
  1091. args = ['base_command','testlabel','--option_a=x','--settings=alternate_settings','--option_b=y']
  1092. out, err = self.run_manage(args)
  1093. self.assertNoOutput(err)
  1094. self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', 'x'), ('option_b', 'y'), ('option_c', '3'), ('pythonpath', None), ('settings', 'alternate_settings'), ('traceback', None), ('verbosity', '1')]")