11from xmlrunner .unittest import unittest
22
33import sys
4- from os import path , chdir , getcwd
4+ import os
5+ from os import path
6+ import glob
7+ import tempfile
8+ import shutil
59
610try :
711 import django
812except ImportError :
913 django = None
1014else :
1115 from django .test .utils import get_runner
16+ from django .conf import settings , UserSettingsHolder
17+ from django .apps import apps
18+
1219
1320TESTS_DIR = path .dirname (__file__ )
1421
1724class DjangoTest (unittest .TestCase ):
1825
1926 def setUp (self ):
20- self ._old_cwd = getcwd ()
27+ self ._old_cwd = os . getcwd ()
2128 self .project_dir = path .abspath (path .join (TESTS_DIR , 'django_example' ))
22- chdir (self .project_dir )
29+ self .tmpdir = tempfile .mkdtemp ()
30+ os .chdir (self .project_dir )
2331 sys .path .append (self .project_dir )
24- import django .conf
25- django .conf .settings = django .conf .LazySettings ()
32+ # allow changing settings
33+ self .old_settings = settings ._wrapped
34+ os .environ ['DJANGO_SETTINGS_MODULE' ] = 'example.settings'
35+ settings .INSTALLED_APPS # load settings on first access
36+ settings .DATABASES ['default' ]['NAME' ] = path .join (
37+ self .tmpdir , 'db.sqlilte3' )
38+ # this goes around the "settings already loaded" issue.
39+ self .override = UserSettingsHolder (settings ._wrapped )
40+ settings ._wrapped = self .override
2641
2742 def tearDown (self ):
28- chdir (self ._old_cwd )
43+ os .chdir (self ._old_cwd )
44+ shutil .rmtree (self .tmpdir )
45+ settings ._wrapped = self .old_settings
46+
47+ def _override_settings (self , ** kwargs ):
48+ # see django.test.utils.override_settings
49+ for key , new_value in kwargs .items ():
50+ setattr (self .override , key , new_value )
2951
3052 def _check_runner (self , runner ):
3153 suite = runner .build_suite (test_labels = ['app2' , 'app' ])
@@ -42,17 +64,42 @@ def _check_runner(self, runner):
4264 ]))
4365
4466 def test_django_runner (self ):
45- from django .conf import settings
46- settings .configure (INSTALLED_APPS = ['app' , 'app2' ])
4767 runner_class = get_runner (settings )
4868 runner = runner_class ()
4969 self ._check_runner (runner )
5070
5171 def test_django_xmlrunner (self ):
52- from django .conf import settings
53- settings .configure (
54- INSTALLED_APPS = ['app' , 'app2' ],
72+ self ._override_settings (
5573 TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' )
5674 runner_class = get_runner (settings )
5775 runner = runner_class ()
5876 self ._check_runner (runner )
77+
78+ def test_django_single_report (self ):
79+ self ._override_settings (
80+ TEST_OUTPUT_DIR = self .tmpdir ,
81+ TEST_OUTPUT_FILE_NAME = 'results.xml' ,
82+ TEST_OUTPUT_VERBOSE = 0 ,
83+ TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' )
84+ apps .populate (settings .INSTALLED_APPS )
85+ runner_class = get_runner (settings )
86+ runner = runner_class ()
87+ suite = runner .build_suite ()
88+ runner .run_suite (suite )
89+ expected_file = path .join (self .tmpdir , 'results.xml' )
90+ self .assertTrue (path .exists (expected_file ),
91+ 'did not generate xml report where expected.' )
92+
93+ def test_django_multiple_reports (self ):
94+ self ._override_settings (
95+ TEST_OUTPUT_DIR = self .tmpdir ,
96+ TEST_OUTPUT_VERBOSE = 0 ,
97+ TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' )
98+ apps .populate (settings .INSTALLED_APPS )
99+ runner_class = get_runner (settings )
100+ runner = runner_class ()
101+ suite = runner .build_suite (test_labels = None )
102+ runner .run_suite (suite )
103+ test_files = glob .glob (path .join (self .tmpdir , 'TEST*.xml' ))
104+ self .assertTrue (test_files ,
105+ 'did not generate xml reports where expected.' )
0 commit comments