__init__.py
193 lines
| 6.2 KiB
| text/x-python
|
PythonLexer
r547 | """Pylons application test package | |||
This package assumes the Pylons environment is already loaded, such as | ||||
when this script is imported from the `nosetests --with-pylons=test.ini` | ||||
command. | ||||
This module initializes the application via ``websetup`` (`paster | ||||
setup-app`) and provides the base testing objects. | ||||
r3637 | ||||
nosetests -x - fail on first error | ||||
nosetests rhodecode.tests.functional.test_admin_settings:TestSettingsController.test_my_account | ||||
nosetests --pdb --pdb-failures | ||||
nosetests --with-coverage --cover-package=rhodecode.model.validators rhodecode.tests.test_validators | ||||
optional FLAGS: | ||||
RC_WHOOSH_TEST_DISABLE=1 - skip whoosh index building and tests | ||||
RC_NO_TMP_PATH=1 - disable new temp path for tests, used mostly for test_vcs_operations | ||||
r547 | """ | |||
r1366 | import os | |||
r1707 | import time | |||
r1712 | import logging | |||
r2451 | import datetime | |||
import hashlib | ||||
import tempfile | ||||
r1366 | from os.path import join as jn | |||
r547 | from unittest import TestCase | |||
r1723 | from tempfile import _RandomNameSequence | |||
r547 | ||||
from paste.deploy import loadapp | ||||
from paste.script.appinstall import SetupCommand | ||||
r3797 | ||||
import pylons | ||||
import pylons.test | ||||
r547 | from pylons import config, url | |||
r3797 | from pylons.i18n.translation import _get_translator | |||
r547 | from routes.util import URLGenerator | |||
from webtest import TestApp | ||||
r3646 | from nose.plugins.skip import SkipTest | |||
r1366 | ||||
r2254 | from rhodecode import is_windows | |||
r1723 | from rhodecode.model.meta import Session | |||
r1712 | from rhodecode.model.db import User | |||
r2466 | from rhodecode.tests.nose_parametrized import parameterized | |||
r3550 | from rhodecode.lib.utils2 import safe_unicode, safe_str | |||
r1707 | ||||
r2451 | ||||
r1707 | os.environ['TZ'] = 'UTC' | |||
r2254 | if not is_windows: | |||
time.tzset() | ||||
r547 | ||||
r688 | log = logging.getLogger(__name__) | |||
r547 | ||||
r1758 | __all__ = [ | |||
r2466 | 'parameterized', 'environ', 'url', 'get_new_dir', 'TestController', | |||
r3674 | 'SkipTest', 'ldap_lib_installed', | |||
r2466 | 'TESTS_TMP_PATH', 'HG_REPO', 'GIT_REPO', 'NEW_HG_REPO', 'NEW_GIT_REPO', | |||
r2728 | 'HG_FORK', 'GIT_FORK', 'TEST_USER_ADMIN_LOGIN', 'TEST_USER_ADMIN_PASS', | |||
'TEST_USER_REGULAR_LOGIN', 'TEST_USER_REGULAR_PASS', | ||||
'TEST_USER_REGULAR_EMAIL', 'TEST_USER_REGULAR2_LOGIN', | ||||
'TEST_USER_REGULAR2_PASS', 'TEST_USER_REGULAR2_EMAIL', 'TEST_HG_REPO', | ||||
'TEST_HG_REPO_CLONE', 'TEST_HG_REPO_PULL', 'TEST_GIT_REPO', | ||||
'TEST_GIT_REPO_CLONE', 'TEST_GIT_REPO_PULL', 'HG_REMOTE_REPO', | ||||
r3647 | 'GIT_REMOTE_REPO', 'SCM_TESTS', | |||
r1758 | ] | |||
r547 | ||||
# Invoke websetup with the current config file | ||||
r1628 | # SetupCommand('setup-app').run([config_file]) | |||
r547 | ||||
environ = {} | ||||
r688 | #SOME GLOBALS FOR TESTS | |||
r1723 | ||||
r1397 | TESTS_TMP_PATH = jn('/', 'tmp', 'rc_test_%s' % _RandomNameSequence().next()) | |||
r1416 | TEST_USER_ADMIN_LOGIN = 'test_admin' | |||
TEST_USER_ADMIN_PASS = 'test12' | ||||
r1758 | TEST_USER_ADMIN_EMAIL = 'test_admin@mail.com' | |||
TEST_USER_REGULAR_LOGIN = 'test_regular' | ||||
TEST_USER_REGULAR_PASS = 'test12' | ||||
TEST_USER_REGULAR_EMAIL = 'test_regular@mail.com' | ||||
TEST_USER_REGULAR2_LOGIN = 'test_regular2' | ||||
TEST_USER_REGULAR2_PASS = 'test12' | ||||
TEST_USER_REGULAR2_EMAIL = 'test_regular2@mail.com' | ||||
r688 | HG_REPO = 'vcs_test_hg' | |||
GIT_REPO = 'vcs_test_git' | ||||
NEW_HG_REPO = 'vcs_test_hg_new' | ||||
NEW_GIT_REPO = 'vcs_test_git_new' | ||||
HG_FORK = 'vcs_test_hg_fork' | ||||
GIT_FORK = 'vcs_test_git_fork' | ||||
r2451 | ## VCS | |||
SCM_TESTS = ['hg', 'git'] | ||||
uniq_suffix = str(int(time.mktime(datetime.datetime.now().timetuple()))) | ||||
r2459 | GIT_REMOTE_REPO = 'git://github.com/codeinn/vcs.git' | |||
r2451 | ||||
TEST_GIT_REPO = jn(TESTS_TMP_PATH, GIT_REPO) | ||||
TEST_GIT_REPO_CLONE = jn(TESTS_TMP_PATH, 'vcsgitclone%s' % uniq_suffix) | ||||
TEST_GIT_REPO_PULL = jn(TESTS_TMP_PATH, 'vcsgitpull%s' % uniq_suffix) | ||||
HG_REMOTE_REPO = 'http://bitbucket.org/marcinkuzminski/vcs' | ||||
r2459 | ||||
TEST_HG_REPO = jn(TESTS_TMP_PATH, HG_REPO) | ||||
r2451 | TEST_HG_REPO_CLONE = jn(TESTS_TMP_PATH, 'vcshgclone%s' % uniq_suffix) | |||
TEST_HG_REPO_PULL = jn(TESTS_TMP_PATH, 'vcshgpull%s' % uniq_suffix) | ||||
TEST_DIR = tempfile.gettempdir() | ||||
TEST_REPO_PREFIX = 'vcs-test' | ||||
r2459 | # cached repos if any ! | |||
# comment out to get some other repos from bb or github | ||||
GIT_REMOTE_REPO = jn(TESTS_TMP_PATH, GIT_REPO) | ||||
HG_REMOTE_REPO = jn(TESTS_TMP_PATH, HG_REPO) | ||||
r3674 | #skip ldap tests if LDAP lib is not installed | |||
ldap_lib_installed = False | ||||
try: | ||||
import ldap | ||||
ldap_lib_installed = True | ||||
except ImportError: | ||||
# means that python-ldap is not installed | ||||
pass | ||||
r2451 | ||||
def get_new_dir(title): | ||||
""" | ||||
Returns always new directory path. | ||||
""" | ||||
from rhodecode.tests.vcs.utils import get_normalized_path | ||||
name = TEST_REPO_PREFIX | ||||
if title: | ||||
name = '-'.join((name, title)) | ||||
hex = hashlib.sha1(str(time.time())).hexdigest() | ||||
name = '-'.join((name, hex)) | ||||
path = os.path.join(TEST_DIR, name) | ||||
return get_normalized_path(path) | ||||
r547 | class TestController(TestCase): | |||
def __init__(self, *args, **kwargs): | ||||
wsgiapp = pylons.test.pylonsapp | ||||
config = wsgiapp.config | ||||
r688 | ||||
r547 | self.app = TestApp(wsgiapp) | |||
url._push_object(URLGenerator(config['routes.map'], environ)) | ||||
r3797 | pylons.app_globals._push_object(config['pylons.app_globals']) | |||
pylons.config._push_object(config) | ||||
# Initialize a translator for tests that utilize i18n | ||||
translator = _get_translator(pylons.config.get('lang')) | ||||
pylons.translator._push_object(translator) | ||||
r688 | self.index_location = config['app_conf']['index_dir'] | |||
r547 | TestCase.__init__(self, *args, **kwargs) | |||
r688 | ||||
r1416 | def log_user(self, username=TEST_USER_ADMIN_LOGIN, | |||
password=TEST_USER_ADMIN_PASS): | ||||
r1712 | self._logged_username = username | |||
r547 | response = self.app.post(url(controller='login', action='index'), | |||
r2451 | {'username': username, | |||
'password': password}) | ||||
r1712 | ||||
r547 | if 'invalid user name' in response.body: | |||
r1366 | self.fail('could not login using %s %s' % (username, password)) | |||
r688 | ||||
r1366 | self.assertEqual(response.status, '302 Found') | |||
r1723 | ses = response.session['rhodecode_user'] | |||
self.assertEqual(ses.get('username'), username) | ||||
response = response.follow() | ||||
self.assertEqual(ses.get('is_authenticated'), True) | ||||
return response.session['rhodecode_user'] | ||||
r1382 | ||||
r1712 | def _get_logged_user(self): | |||
return User.get_by_username(self._logged_username) | ||||
r1382 | def checkSessionFlash(self, response, msg): | |||
r3219 | self.assertTrue('flash' in response.session, | |||
r3550 | msg='Response session:%r have no flash' | |||
% response.session) | ||||
r2530 | if not msg in response.session['flash'][0][1]: | |||
r3550 | msg = u'msg `%s` not found in session flash: got `%s` instead' % ( | |||
msg, response.session['flash'][0][1]) | ||||
self.fail(safe_str(msg)) | ||||