"""
noserun/__init__.py here
"""

# vim: tabstop=4 expandtab autoindent shiftwidth=4 fileencoding=utf-8

import os
import sys
if not os.environ.has_key('DJANGO_SETTINGS_MODULE'): 
    print 'DJANGO_SETTINGS_MODULE not set'
    sys.exit(1)

from django.conf import settings

from django.core.management.commands import syncdb   

from django.db import connection

from django.test import utils

import nose

def run_tests(test_labels, verbosity=2, interactive=True, extra_tests=[]):
    """Run tests with nose
    """

    ### Preamble
    # Remember our real database name for restore-after-destruct
    real_db = settings.DATABASE_NAME
    cmd_dict = {
        'verbosity': verbosity,
        'interactive': interactive,
    }

    ### The real deal
    ## Setup
    utils.setup_test_environment()

    ## Create test db
    test_db = connection.creation.create_test_db(verbosity)
    if verbosity:
        print 'Created db %s' % test_db

    # syncdb
    cmd = syncdb.Command()
    cmd.handle_noargs(**cmd_dict)

    ## Find tests
    # Not needed with nose <3

    ## Run tests
    # Command line handling
    argv = sys.argv
    if verbosity == 2:
        argv.append('-s')

    # Always do doctests, because Django does them too!
    # At least I believe/hope it does ;)
    argv.append('--with-doctest')

    # manage.py doesn't like arbitrary args, use environment
    if os.environ.has_key('NOSE_COVER'):
        argv.append('--with-coverage')

    if verbosity == 2:
        print 'Running nose'
        print '    Test labels', test_labels
        print '    Extra tests', extra_tests

    # Pass argv explicitly here
    # The above assignment sets a reference and Just Works,
    # but this makes it more obvious
    if test_labels:
        for label in test_labels:
            nose.run(module=label, argv=argv)
    else:
        nose.run(argv=argv)

    ## Destroy test db
    if not os.environ.has_key('NO_DROPDB'):
        connection.creation.destroy_test_db(real_db, verbosity)
    if verbosity:
        print 'OK'

    ## Teardown
    utils.teardown_test_environment()


# EOF

"""
noserun/test.py here
"""

# vim: tabstop=4 expandtab autoindent shiftwidth=4 fileencoding=utf-8

from django.core.management import call_command

from django.core import mail

from nose.util import try_run

from django import test

class TestCase(test.TestCase):
    """Sane TestCase for nose
    """

    def setUp(self):
        names = ('setup',)
        try_run(self, names)

    def tearDown(self):
        names = ('teardown',)
        try_run(self, names)

    def _pre_setup(self):
        """Otherwise the superclass _pre_setup but skip everything
        related to fixtures.
        """

        if hasattr(self, 'urls'):
            self._old_root_urlconf = settings.ROOT_URLCONF
            settings.ROOT_URLCONF = self.urls
            clear_url_caches()
        mail.outbox = []

def flush(verbosity=0, interactive=False):
    """Shortcut to flush db
    """

    call_command('flush', verbosity=verbosity, interactive=interactive)

def loaddata(*fixtures, **kwargs):
    """A list of fixtures to load, kwargs given as **{'verbosity': 0}
    and defaults to exactly that
    """

    if not kwargs:
        kwargs = {'verbosity': 0}
    call_command('loaddata', *fixtures, **kwargs)

# EOF