From 09824ba127cfe06428df1fab27e880c4069d1784 Mon Sep 17 00:00:00 2001 From: Kasper Brandt Date: Mon, 23 Nov 2015 14:40:34 +0300 Subject: [PATCH] [#1925] Add IATI version DB entry to test databases --- akvo/rsr/tests/pages/test_homepage.py | 4 + akvo/rsr/tests/pages/test_project_dir.py | 5 + akvo/rsr/tests/test_middleware.py | 5 + akvo/test_runner.py | 201 ----------------------- akvo/test_runner_nodb.py | 12 -- 5 files changed, 14 insertions(+), 213 deletions(-) delete mode 100644 akvo/test_runner.py delete mode 100644 akvo/test_runner_nodb.py diff --git a/akvo/rsr/tests/pages/test_homepage.py b/akvo/rsr/tests/pages/test_homepage.py index 6a77688ed7..6423368815 100644 --- a/akvo/rsr/tests/pages/test_homepage.py +++ b/akvo/rsr/tests/pages/test_homepage.py @@ -6,6 +6,8 @@ For additional details on the GNU license please see < http://www.gnu.org/licenses/agpl.html >. """ +from akvo.codelists.models import Version + from django.conf import settings from django.test import Client, TestCase @@ -17,6 +19,8 @@ class PingTest(TestCase): def setUp(self): """Setup.""" self.c = Client(HTTP_HOST=settings.RSR_DOMAIN) + iati_version = Version(code=settings.IATI_VERSION) + iati_version.save() def test_redirect(self): """Ping /.""" diff --git a/akvo/rsr/tests/pages/test_project_dir.py b/akvo/rsr/tests/pages/test_project_dir.py index 2af10aa358..6103fa4688 100644 --- a/akvo/rsr/tests/pages/test_project_dir.py +++ b/akvo/rsr/tests/pages/test_project_dir.py @@ -6,6 +6,8 @@ For additional details on the GNU license please see < http://www.gnu.org/licenses/agpl.html >. """ +from akvo.codelists.models import Version + from django.conf import settings from django.test import Client, TestCase from ..utils import contains_template_errors @@ -18,6 +20,9 @@ class PingTest(TestCase): def setUp(self): """Setup.""" self.c = Client(HTTP_HOST=settings.RSR_DOMAIN) + iati_version = Version(code=settings.IATI_VERSION) + iati_version.save() + self.resp = self.c.get('/projects/') self.en_resp = self.c.get('/en/projects/') self.es_resp = self.c.get('/es/projects/') diff --git a/akvo/rsr/tests/test_middleware.py b/akvo/rsr/tests/test_middleware.py index e238198379..b8c8a8a9b9 100644 --- a/akvo/rsr/tests/test_middleware.py +++ b/akvo/rsr/tests/test_middleware.py @@ -12,6 +12,7 @@ from django.test.client import RequestFactory from akvo.rsr.middleware import _is_rsr_host, _is_naked_app_host, _partner_site from akvo.rsr.models import PartnerSite, Organisation +from akvo.codelists.models import Version STOCK_RSR_NETLOC = "http://{}".format(settings.RSR_DOMAIN) AKVOAPP_NETLOC = "http://{}".format(settings.AKVOAPP_DOMAIN) @@ -128,6 +129,8 @@ def setUp(self): o1.save() ps1 = PartnerSite(organisation=o1, hostname='partner1', cname='projects.partner1.org') ps1.save() + iati_version = Version(code=settings.IATI_VERSION) + iati_version.save() def test_partner_site(self): """.""" @@ -155,6 +158,8 @@ def setUp(self): o1.save() ps1 = PartnerSite(organisation=o1, hostname='partner1', cname=self.cname) ps1.save() + iati_version = Version(code=settings.IATI_VERSION) + iati_version.save() def test_partner_site(self): """.""" diff --git a/akvo/test_runner.py b/akvo/test_runner.py deleted file mode 100644 index e62ced5660..0000000000 --- a/akvo/test_runner.py +++ /dev/null @@ -1,201 +0,0 @@ -# This is a modified version of the Django simple.py test runner, altered to emit TeamCity messages. - -import unittest -from django.conf import settings -from django.db.models import get_app, get_apps -from django.test import _doctest as doctest -from django.test.utils import setup_test_environment, teardown_test_environment -from django.test.testcases import OutputChecker, DocTestRunner, TestCase - -from teamcity.unittestpy import TeamcityTestRunner - -# The module name for tests outside models.py -TEST_MODULE = 'tests' - -doctestOutputChecker = OutputChecker() - -def get_tests(app_module): - try: - app_path = app_module.__name__.split('.')[:-1] - test_module = __import__('.'.join(app_path + [TEST_MODULE]), {}, {}, TEST_MODULE) - except ImportError, e: - # Couldn't import tests.py. Was it due to a missing file, or - # due to an import error in a tests.py that actually exists? - import os.path - from imp import find_module - try: - mod = find_module(TEST_MODULE, [os.path.dirname(app_module.__file__)]) - except ImportError: - # 'tests' module doesn't exist. Move on. - test_module = None - else: - # The module exists, so there must be an import error in the - # test module itself. We don't need the module; so if the - # module was a single file module (i.e., tests.py), close the file - # handle returned by find_module. Otherwise, the test module - # is a directory, and there is nothing to close. - if mod[0]: - mod[0].close() - raise - return test_module - -def build_suite(app_module): - "Create a complete Django test suite for the provided application module" - suite = unittest.TestSuite() - - # Load unit and doctests in the models.py module. If module has - # a suite() method, use it. Otherwise build the test suite ourselves. - if hasattr(app_module, 'suite'): - suite.addTest(app_module.suite()) - else: - suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(app_module)) - try: - suite.addTest(doctest.DocTestSuite(app_module, - checker=doctestOutputChecker, - runner=DocTestRunner)) - except ValueError: - # No doc tests in models.py - pass - - # Check to see if a separate 'tests' module exists parallel to the - # models module - test_module = get_tests(app_module) - if test_module: - # Load unit and doctests in the tests.py module. If module has - # a suite() method, use it. Otherwise build the test suite ourselves. - if hasattr(test_module, 'suite'): - suite.addTest(test_module.suite()) - else: - suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_module)) - try: - suite.addTest(doctest.DocTestSuite(test_module, - checker=doctestOutputChecker, - runner=DocTestRunner)) - except ValueError: - # No doc tests in tests.py - pass - return suite - -def build_test(label): - """Construct a test case a test with the specified label. Label should - be of the form model.TestClass or model.TestClass.test_method. Returns - an instantiated test or test suite corresponding to the label provided. - - """ - parts = label.split('.') - if len(parts) < 2 or len(parts) > 3: - raise ValueError("Test label '%s' should be of the form app.TestCase or app.TestCase.test_method" % label) - - app_module = get_app(parts[0]) - TestClass = getattr(app_module, parts[1], None) - - # Couldn't find the test class in models.py; look in tests.py - if TestClass is None: - test_module = get_tests(app_module) - if test_module: - TestClass = getattr(test_module, parts[1], None) - - if len(parts) == 2: # label is app.TestClass - try: - return unittest.TestLoader().loadTestsFromTestCase(TestClass) - except TypeError: - raise ValueError("Test label '%s' does not refer to a test class" % label) - else: # label is app.TestClass.test_method - if not TestClass: - raise ValueError("Test label '%s' does not refer to a test class" % label) - return TestClass(parts[2]) - -# Python 2.3 compatibility: TestSuites were made iterable in 2.4. -# We need to iterate over them, so we add the missing method when -# necessary. -try: - getattr(unittest.TestSuite, '__iter__') -except AttributeError: - setattr(unittest.TestSuite, '__iter__', lambda s: iter(s._tests)) - -def partition_suite(suite, classes, bins): - """ - Partitions a test suite by test type. - - classes is a sequence of types - bins is a sequence of TestSuites, one more than classes - - Tests of type classes[i] are added to bins[i], - tests with no match found in classes are place in bins[-1] - """ - for test in suite: - if isinstance(test, unittest.TestSuite): - partition_suite(test, classes, bins) - else: - for i in range(len(classes)): - if isinstance(test, classes[i]): - bins[i].addTest(test) - break - else: - bins[-1].addTest(test) - -def reorder_suite(suite, classes): - """ - Reorders a test suite by test type. - - classes is a sequence of types - - All tests of type clases[0] are placed first, then tests of type classes[1], etc. - Tests with no match in classes are placed last. - """ - class_count = len(classes) - bins = [unittest.TestSuite() for i in range(class_count+1)] - partition_suite(suite, classes, bins) - for i in range(class_count): - bins[0].addTests(bins[i+1]) - return bins[0] - -def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]): - """ - Run the unit tests for all the test labels in the provided list. - Labels must be of the form: - - app.TestClass.test_method - Run a single specific test method - - app.TestClass - Run all the test methods in a given class - - app - Search for doctests and unittests in the named application. - - When looking for tests, the test runner will look in the models and - tests modules for the application. - - A list of 'extra' tests may also be provided; these tests - will be added to the test suite. - - Returns the number of tests that failed. - """ - setup_test_environment() - - settings.DEBUG = False - suite = unittest.TestSuite() - - if test_labels: - for label in test_labels: - if '.' in label: - suite.addTest(build_test(label)) - else: - app = get_app(label) - suite.addTest(build_suite(app)) - else: - for app in get_apps(): - suite.addTest(build_suite(app)) - - for test in extra_tests: - suite.addTest(test) - - suite = reorder_suite(suite, (TestCase,)) - - old_name = settings.DATABASE_NAME - from django.db import connection - connection.creation.create_test_db(verbosity, autoclobber=not interactive) - result = TeamcityTestRunner().run(suite) - connection.creation.destroy_test_db(old_name, verbosity) - - teardown_test_environment() - - return len(result.failures) + len(result.errors) diff --git a/akvo/test_runner_nodb.py b/akvo/test_runner_nodb.py deleted file mode 100644 index 95fcf0a645..0000000000 --- a/akvo/test_runner_nodb.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.test.simple import DjangoTestSuiteRunner - -class NoDbTestRunner(DjangoTestSuiteRunner): - """ A test runner to test without database creation """ - - def setup_databases(self, **kwargs): - """ Override the database creation defined in parent class """ - pass - - def teardown_databases(self, old_config, **kwargs): - """ Override the database teardown defined in parent class """ - pass \ No newline at end of file