# coding: utf-8
 
"""   
    unittest base
    ~~~~~~~~~~~~~
 
    :copyleft: 2009 by the django-dbpreferences team, see AUTHORS for more details.
    :license: GNU GPL v3 or above, see LICENSE for more details.
"""
 
from django.test import TransactionTestCase
from django.test.client import Client
from django.contrib.auth.models import User
 
from BrowserDebug import debug_response
 
 
 
class BaseTestCase(TransactionTestCase):
    # Open only one traceback in a browser (=True) ?
    one_browser_traceback = True
    _open = []
 
    TEST_USERS = {
        "superuser": {
            "username": "superuser",
            "email": "superuser@example.org",
            "password": "superuser_password",
            "is_staff": True,
            "is_superuser": True,
        },
        "staff": {
            "username": "staff test user",
            "email": "staff_test_user@example.org",
            "password": "staff_test_user_password",
            "is_staff": True,
            "is_superuser": False,
        },
        "normal": {
            "username": "normal test user",
            "email": "normal_test_user@example.org",
            "password": "normal_test_user_password",
            "is_staff": False,
            "is_superuser": False,
        },
    }
 
    def _pre_setup(self):
        super(BaseTestCase, self).setUp()
        self._create_testusers()
 
    def login(self, usertype):
        """
        Login the user defined in self.TEST_USERS
        """
        ok = self.client.login(username=self.TEST_USERS[usertype]["username"],
                               password=self.TEST_USERS[usertype]["password"])
        self.failUnless(ok, "Can't login test user '%s'!" % usertype)
 
    def get_user(self, usertype):
        return User.objects.get(username=self.TEST_USERS[usertype]["username"])
 
    def _create_testusers(self):
        """
        Create all available testusers.
        """
        def create_user(username, password, email, is_staff, is_superuser):
            """
            Create a user and return the instance.
            """
            defaults = {'password':password, 'email':email}
            user, created = User.objects.get_or_create(
                username=username, defaults=defaults
            )
            if not created:
                user.email = email
            user.set_password(password)
            user.is_staff = is_staff
            user.is_superuser = is_superuser
            user.save()
        for usertype, userdata in self.TEST_USERS.iteritems():
            create_user(**userdata)
 
    def assertResponse(self, response, must_contain=(), must_not_contain=()):
        """
        Check the content of the response
        must_contain - a list with string how must be exists in the response.
        must_not_contain - a list of string how should not exists.
        """
        def error(respose, msg):
            debug_response(
                response, self.one_browser_traceback, msg, display_tb=False
            )
            raise self.failureException, msg
 
        for txt in must_contain:
            if not txt in response.content:
                error(response, "Text not in response: '%s'" % txt)
 
        for txt in must_not_contain:
            if txt in response.content:
                error(response, "Text should not be in response: '%s'" % txt)