diff --git a/rhodecode/config/environment.py b/rhodecode/config/environment.py
--- a/rhodecode/config/environment.py
+++ b/rhodecode/config/environment.py
@@ -52,8 +52,9 @@ def load_environment(global_conf, app_co
test = os.path.split(config['__file__'])[-1] == 'test.ini'
if test:
from rhodecode.lib.utils import create_test_env, create_test_index
- create_test_env('/tmp', config)
- create_test_index('/tmp', True)
+ from rhodecode.tests import TESTS_TMP_PATH
+ create_test_env(TESTS_TMP_PATH, config)
+ create_test_index(TESTS_TMP_PATH, True)
#MULTIPLE DB configs
# Setup the SQLAlchemy database engine
diff --git a/rhodecode/controllers/search.py b/rhodecode/controllers/search.py
--- a/rhodecode/controllers/search.py
+++ b/rhodecode/controllers/search.py
@@ -22,11 +22,11 @@ Created on Aug 7, 2010
search controller for pylons
@author: marcink
"""
-from pylons import request, response, session, tmpl_context as c, url
+from pylons import request, response, config, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect
from rhodecode.lib.auth import LoginRequired
from rhodecode.lib.base import BaseController, render
-from rhodecode.lib.indexers import IDX_LOCATION, SCHEMA, IDX_NAME, ResultWrapper
+from rhodecode.lib.indexers import SCHEMA, IDX_NAME, ResultWrapper
from webhelpers.paginate import Page
from webhelpers.util import update_params
from pylons.i18n.translation import _
@@ -42,7 +42,7 @@ class SearchController(BaseController):
@LoginRequired()
def __before__(self):
- super(SearchController, self).__before__()
+ super(SearchController, self).__before__()
def index(self, search_repo=None):
c.repo_name = search_repo
@@ -56,15 +56,16 @@ class SearchController(BaseController):
'repository':'repository'}\
.get(c.cur_type, 'content')
-
+
if c.cur_query:
cur_query = c.cur_query.lower()
-
+
if c.cur_query:
p = int(request.params.get('page', 1))
highlight_items = set()
try:
- idx = open_dir(IDX_LOCATION, indexname=IDX_NAME)
+ idx = open_dir(config['app_conf']['index_dir']
+ , indexname=IDX_NAME)
searcher = idx.searcher()
qp = QueryParser(search_type, schema=SCHEMA)
@@ -72,7 +73,7 @@ class SearchController(BaseController):
cur_query = u'repository:%s %s' % (c.repo_name, cur_query)
try:
query = qp.parse(unicode(cur_query))
-
+
if isinstance(query, Phrase):
highlight_items.update(query.words)
else:
@@ -81,14 +82,14 @@ class SearchController(BaseController):
highlight_items.add(i[1])
matcher = query.matcher(searcher)
-
+
log.debug(query)
log.debug(highlight_items)
results = searcher.search(query)
res_ln = len(results)
c.runtime = '%s results (%.3f seconds)' \
% (res_ln, results.runtime)
-
+
def url_generator(**kw):
return update_params("?q=%s&type=%s" \
% (c.cur_query, c.cur_search), **kw)
@@ -98,8 +99,8 @@ class SearchController(BaseController):
highlight_items),
page=p, item_count=res_ln,
items_per_page=10, url=url_generator)
-
-
+
+
except QueryParserError:
c.runtime = _('Invalid search query. Try quoting it.')
searcher.close()
@@ -107,6 +108,6 @@ class SearchController(BaseController):
log.error(traceback.format_exc())
log.error('Empty Index data')
c.runtime = _('There is no index to search in. Please run whoosh indexer')
-
+
# Return a rendered template
return render('/search/search.html')
diff --git a/rhodecode/lib/utils.py b/rhodecode/lib/utils.py
--- a/rhodecode/lib/utils.py
+++ b/rhodecode/lib/utils.py
@@ -64,7 +64,7 @@ def is_git(environ):
:param environ:
"""
http_user_agent = environ.get('HTTP_USER_AGENT')
- if http_user_agent.startswith('git'):
+ if http_user_agent and http_user_agent.startswith('git'):
return True
return False
@@ -455,15 +455,16 @@ def create_test_index(repo_location, ful
"""
from rhodecode.lib.indexers.daemon import WhooshIndexingDaemon
from rhodecode.lib.pidlock import DaemonLock, LockHeld
- from rhodecode.lib.indexers import IDX_LOCATION
import shutil
- if os.path.exists(IDX_LOCATION):
- shutil.rmtree(IDX_LOCATION)
+ index_location = os.path.join(repo_location, 'index')
+ if os.path.exists(index_location):
+ shutil.rmtree(index_location)
try:
l = DaemonLock()
- WhooshIndexingDaemon(repo_location=repo_location)\
+ WhooshIndexingDaemon(index_location=index_location,
+ repo_location=repo_location)\
.run(full_index=full_index)
l.release()
except LockHeld:
@@ -474,6 +475,8 @@ def create_test_env(repos_test_path, con
install test repository into tmp dir
"""
from rhodecode.lib.db_manage import DbManage
+ from rhodecode.tests import HG_REPO, GIT_REPO, NEW_HG_REPO, NEW_GIT_REPO, \
+ HG_FORK, GIT_FORK, TESTS_TMP_PATH
import tarfile
import shutil
from os.path import dirname as dn, join as jn, abspath
@@ -509,13 +512,19 @@ def create_test_env(repos_test_path, con
dbmanage.populate_default_permissions()
#PART TWO make test repo
- log.debug('making test vcs repo')
- if os.path.isdir('/tmp/vcs_test'):
- shutil.rmtree('/tmp/vcs_test')
+ log.debug('making test vcs repositories')
+
+ #remove old one from previos tests
+ for r in [HG_REPO, GIT_REPO, NEW_HG_REPO, NEW_GIT_REPO, HG_FORK, GIT_FORK]:
+ if os.path.isdir(jn(TESTS_TMP_PATH, r)):
+ log.debug('removing %s', r)
+ shutil.rmtree(jn(TESTS_TMP_PATH, r))
+
+ #CREATE DEFAULT HG REPOSITORY
cur_dir = dn(dn(abspath(__file__)))
- tar = tarfile.open(jn(cur_dir, 'tests', "vcs_test.tar.gz"))
- tar.extractall('/tmp')
+ tar = tarfile.open(jn(cur_dir, 'tests', "vcs_test_hg.tar.gz"))
+ tar.extractall(jn(TESTS_TMP_PATH, HG_REPO))
tar.close()
class UpgradeDb(command.Command):
diff --git a/rhodecode/tests/__init__.py b/rhodecode/tests/__init__.py
--- a/rhodecode/tests/__init__.py
+++ b/rhodecode/tests/__init__.py
@@ -19,11 +19,12 @@ from rhodecode.model import meta
import logging
-log = logging.getLogger(__name__)
+log = logging.getLogger(__name__)
import pylons.test
-__all__ = ['environ', 'url', 'TestController']
+__all__ = ['environ', 'url', 'TestController', 'TESTS_TMP_PATH', 'HG_REPO',
+ 'GIT_REPO', 'NEW_HG_REPO', 'NEW_GIT_REPO', 'HG_FORK', 'GIT_FORK', ]
# Invoke websetup with the current config file
#SetupCommand('setup-app').run([config_file])
@@ -33,26 +34,39 @@ import pylons.test
environ = {}
+#SOME GLOBALS FOR TESTS
+TESTS_TMP_PATH = '/tmp'
+
+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'
+
class TestController(TestCase):
def __init__(self, *args, **kwargs):
wsgiapp = pylons.test.pylonsapp
config = wsgiapp.config
+
self.app = TestApp(wsgiapp)
url._push_object(URLGenerator(config['routes.map'], environ))
self.sa = meta.Session
-
+ self.index_location = config['app_conf']['index_dir']
TestCase.__init__(self, *args, **kwargs)
-
+
def log_user(self, username='test_admin', password='test12'):
response = self.app.post(url(controller='login', action='index'),
{'username':username,
'password':password})
print response
-
+
if 'invalid user name' in response.body:
assert False, 'could not login using %s %s' % (username, password)
-
+
assert response.status == '302 Found', 'Wrong response code from login got %s' % response.status
assert response.session['rhodecode_user'].username == username, 'wrong logged in user got %s expected %s' % (response.session['rhodecode_user'].username, username)
return response.follow()
diff --git a/rhodecode/tests/functional/test_branches.py b/rhodecode/tests/functional/test_branches.py
--- a/rhodecode/tests/functional/test_branches.py
+++ b/rhodecode/tests/functional/test_branches.py
@@ -4,5 +4,15 @@ class TestBranchesController(TestControl
def test_index(self):
self.log_user()
- response = self.app.get(url(controller='branches', action='index',repo_name='vcs_test'))
+ response = self.app.get(url(controller='branches', action='index', repo_name=HG_REPO))
+
+ assert """default """ % HG_REPO in response.body, 'wrong info about default branch'
+ assert """git """ % HG_REPO in response.body, 'wrong info about default git'
+ assert """web """ % HG_REPO in response.body, 'wrong info about default web'
+
+
+
+
+
+
# Test response...
diff --git a/rhodecode/tests/functional/test_changelog.py b/rhodecode/tests/functional/test_changelog.py
--- a/rhodecode/tests/functional/test_changelog.py
+++ b/rhodecode/tests/functional/test_changelog.py
@@ -2,30 +2,35 @@ from rhodecode.tests import *
class TestChangelogController(TestController):
- def test_index(self):
+ def test_index_hg(self):
self.log_user()
- response = self.app.get(url(controller='changelog', action='index', repo_name='vcs_test'))
-
- print response
- assert """
""" in response.body, 'wrong info about number ofchanges'
+ response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO))
+
+ assert """
""" in response.body, 'wrong info about number of changes'
assert """Small update at simplevcs app""" in response.body, 'missing info about commit message'
- assert """
0 """ in response.body, 'wrong info about removed nodes'
- assert """
2 """ in response.body, 'wrong info about changed nodes'
- assert """
1 """ in response.body, 'wrong info about added nodes'
-
+ assert """
0 """ in response.body, 'wrong info about removed nodes'
+ assert """
2 """ in response.body, 'wrong info about changed nodes'
+ assert """
1 """ in response.body, 'wrong info about added nodes'
+
#pagination
-
- response = self.app.get(url(controller='changelog', action='index', repo_name='vcs_test'), {'page':1})
- response = self.app.get(url(controller='changelog', action='index', repo_name='vcs_test'), {'page':2})
- response = self.app.get(url(controller='changelog', action='index', repo_name='vcs_test'), {'page':3})
- response = self.app.get(url(controller='changelog', action='index', repo_name='vcs_test'), {'page':4})
- response = self.app.get(url(controller='changelog', action='index', repo_name='vcs_test'), {'page':5})
- response = self.app.get(url(controller='changelog', action='index', repo_name='vcs_test'), {'page':6})
+
+ response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':1})
+ response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':2})
+ response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':3})
+ response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':4})
+ response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':5})
+ response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':6})
+
# Test response after pagination...
- assert """
20 """in response.body, 'wrong info about number of removed'
- assert """
1 """in response.body, 'wrong info about number of changes'
- assert """
0 """in response.body, 'wrong info about number of added'
assert """
commit 64: 46ad32a4f974@2010-04-20 00:33:21
"""in response.body, 'wrong info about commit 64'
- assert """
"""in response.body, 'wrong info about commit 64 is a merge'
-
+ assert """
1 """in response.body, 'wrong info about number of removed'
+ assert """
13 """in response.body, 'wrong info about number of changes'
+ assert """
20 """in response.body, 'wrong info about number of added'
+ assert """
""" % HG_REPO in response.body, 'wrong info about commit 64 is a merge'
+
+
+
+ #def test_index_git(self):
+ # self.log_user()
+ # response = self.app.get(url(controller='changelog', action='index', repo_name=GIT_REPO))
diff --git a/rhodecode/tests/functional/test_changeset.py b/rhodecode/tests/functional/test_changeset.py
--- a/rhodecode/tests/functional/test_changeset.py
+++ b/rhodecode/tests/functional/test_changeset.py
@@ -4,5 +4,5 @@ class TestChangesetController(TestContro
def test_index(self):
response = self.app.get(url(controller='changeset', action='index',
- repo_name='vcs_test',revision='tip'))
+ repo_name=HG_REPO,revision='tip'))
# Test response...
diff --git a/rhodecode/tests/functional/test_feed.py b/rhodecode/tests/functional/test_feed.py
--- a/rhodecode/tests/functional/test_feed.py
+++ b/rhodecode/tests/functional/test_feed.py
@@ -5,11 +5,11 @@ class TestFeedController(TestController)
def test_rss(self):
self.log_user()
response = self.app.get(url(controller='feed', action='rss',
- repo_name='vcs_test'))
+ repo_name=HG_REPO))
# Test response...
def test_atom(self):
self.log_user()
response = self.app.get(url(controller='feed', action='atom',
- repo_name='vcs_test'))
+ repo_name=HG_REPO))
# Test response...
\ No newline at end of file
diff --git a/rhodecode/tests/functional/test_files.py b/rhodecode/tests/functional/test_files.py
--- a/rhodecode/tests/functional/test_files.py
+++ b/rhodecode/tests/functional/test_files.py
@@ -5,7 +5,7 @@ class TestFilesController(TestController
def test_index(self):
self.log_user()
response = self.app.get(url(controller='files', action='index',
- repo_name='vcs_test',
+ repo_name=HG_REPO,
revision='tip',
f_path='/'))
# Test response...
diff --git a/rhodecode/tests/functional/test_hg.py b/rhodecode/tests/functional/test_hg.py
--- a/rhodecode/tests/functional/test_hg.py
+++ b/rhodecode/tests/functional/test_hg.py
@@ -4,8 +4,8 @@ class TestAdminController(TestController
def test_index(self):
self.log_user()
- response = self.app.get(url(controller='hg', action='index'))
+ response = self.app.get(url(controller='home', action='index'))
#if global permission is set
assert 'ADD NEW REPOSITORY' in response.body, 'Wrong main page'
- assert 'href="/vcs_test/summary"' in response.body, ' mising repository in list'
+ assert 'href="/%s/summary"' % HG_REPO in response.body, ' mising repository in list'
# Test response...
diff --git a/rhodecode/tests/functional/test_login.py b/rhodecode/tests/functional/test_login.py
--- a/rhodecode/tests/functional/test_login.py
+++ b/rhodecode/tests/functional/test_login.py
@@ -17,7 +17,7 @@ class TestLoginController(TestController
assert response.status == '302 Found', 'Wrong response code from login got %s' % response.status
assert response.session['rhodecode_user'].username == 'test_admin', 'wrong logged in user'
response = response.follow()
- assert 'vcs_test repository' in response.body
+ assert '%s repository' % HG_REPO in response.body
def test_login_regular_ok(self):
response = self.app.post(url(controller='login', action='index'),
@@ -27,7 +27,7 @@ class TestLoginController(TestController
assert response.status == '302 Found', 'Wrong response code from login got %s' % response.status
assert response.session['rhodecode_user'].username == 'test_regular', 'wrong logged in user'
response = response.follow()
- assert 'vcs_test repository' in response.body
+ assert '%s repository' % HG_REPO in response.body
assert '
' not in response.body
def test_login_ok_came_from(self):
diff --git a/rhodecode/tests/functional/test_repos.py b/rhodecode/tests/functional/test_repos.py
--- a/rhodecode/tests/functional/test_repos.py
+++ b/rhodecode/tests/functional/test_repos.py
@@ -11,34 +11,61 @@ class TestReposController(TestController
def test_index_as_xml(self):
response = self.app.get(url('formatted_repos', format='xml'))
- def test_create(self):
+ def test_create_hg(self):
self.log_user()
- repo_name = 'vcs_test_new'
+ repo_name = NEW_HG_REPO
description = 'description for newly created repo'
private = False
response = self.app.post(url('repos'), {'repo_name':repo_name,
- 'description':description,
- 'private':private})
+ 'repo_type':'hg',
+ 'description':description,
+ 'private':private})
print response
-
+
#test if we have a message for that repository
print '-' * 100
print response.session
assert '''created repository %s''' % (repo_name) in response.session['flash'][0], 'No flash message about new repo'
-
+
#test if the fork was created in the database
new_repo = self.sa.query(Repository).filter(Repository.repo_name == repo_name).one()
-
+
assert new_repo.repo_name == repo_name, 'wrong name of repo name in db'
assert new_repo.description == description, 'wrong description'
-
+
#test if repository is visible in the list ?
response = response.follow()
-
+
assert repo_name in response.body, 'missing new repo from the main repos list'
-
-
+
+ def test_create_git(self):
+ self.log_user()
+ repo_name = NEW_GIT_REPO
+ description = 'description for newly created repo'
+ private = False
+ response = self.app.post(url('repos'), {'repo_name':repo_name,
+ 'repo_type':'git',
+ 'description':description,
+ 'private':private})
+
+ print response
+
+ #test if we have a message for that repository
+ print '-' * 100
+ print response.session
+ assert '''created repository %s''' % (repo_name) in response.session['flash'][0], 'No flash message about new repo'
+
+ #test if the fork was created in the database
+ new_repo = self.sa.query(Repository).filter(Repository.repo_name == repo_name).one()
+
+ assert new_repo.repo_name == repo_name, 'wrong name of repo name in db'
+ assert new_repo.description == description, 'wrong description'
+
+ #test if repository is visible in the list ?
+ response = response.follow()
+
+ assert repo_name in response.body, 'missing new repo from the main repos list'
def test_new(self):
@@ -49,10 +76,10 @@ class TestReposController(TestController
response = self.app.get(url('formatted_new_repo', format='xml'))
def test_update(self):
- response = self.app.put(url('repo', repo_name='vcs_test'))
+ response = self.app.put(url('repo', repo_name=HG_REPO))
def test_update_browser_fakeout(self):
- response = self.app.post(url('repo', repo_name='vcs_test'), params=dict(_method='put'))
+ response = self.app.post(url('repo', repo_name=HG_REPO), params=dict(_method='put'))
def test_delete(self):
self.log_user()
@@ -60,54 +87,55 @@ class TestReposController(TestController
description = 'description for newly created repo'
private = False
response = self.app.post(url('repos'), {'repo_name':repo_name,
+ 'repo_type':'hg',
'description':description,
'private':private})
print response
-
+
#test if we have a message for that repository
print '-' * 100
print response.session
assert '''created repository %s''' % (repo_name) in response.session['flash'][0], 'No flash message about new repo'
-
+
#test if the repo was created in the database
new_repo = self.sa.query(Repository).filter(Repository.repo_name == repo_name).one()
-
+
assert new_repo.repo_name == repo_name, 'wrong name of repo name in db'
assert new_repo.description == description, 'wrong description'
-
+
#test if repository is visible in the list ?
response = response.follow()
-
+
assert repo_name in response.body, 'missing new repo from the main repos list'
-
-
+
+
response = self.app.delete(url('repo', repo_name=repo_name))
-
+
print '-' * 100
print response.session
assert '''deleted repository %s''' % (repo_name) in response.session['flash'][0], 'No flash message about delete repo'
-
+
response.follow()
-
+
#check if repo was deleted from db
deleted_repo = self.sa.query(Repository).filter(Repository.repo_name == repo_name).scalar()
-
+
assert deleted_repo is None, 'Deleted repository was found in db'
-
+
def test_delete_browser_fakeout(self):
- response = self.app.post(url('repo', repo_name='vcs_test'), params=dict(_method='delete'))
+ response = self.app.post(url('repo', repo_name=HG_REPO), params=dict(_method='delete'))
def test_show(self):
self.log_user()
- response = self.app.get(url('repo', repo_name='vcs_test'))
+ response = self.app.get(url('repo', repo_name=HG_REPO))
def test_show_as_xml(self):
- response = self.app.get(url('formatted_repo', repo_name='vcs_test', format='xml'))
+ response = self.app.get(url('formatted_repo', repo_name=HG_REPO, format='xml'))
def test_edit(self):
- response = self.app.get(url('edit_repo', repo_name='vcs_test'))
+ response = self.app.get(url('edit_repo', repo_name=HG_REPO))
def test_edit_as_xml(self):
- response = self.app.get(url('formatted_edit_repo', repo_name='vcs_test', format='xml'))
+ response = self.app.get(url('formatted_edit_repo', repo_name=HG_REPO, format='xml'))
diff --git a/rhodecode/tests/functional/test_search.py b/rhodecode/tests/functional/test_search.py
--- a/rhodecode/tests/functional/test_search.py
+++ b/rhodecode/tests/functional/test_search.py
@@ -1,5 +1,4 @@
from rhodecode.tests import *
-from rhodecode.lib.indexers import IDX_LOCATION
import os
from nose.plugins.skip import SkipTest
@@ -13,26 +12,25 @@ class TestSearchController(TestControlle
# Test response...
def test_empty_search(self):
-
- if os.path.isdir(IDX_LOCATION):
+ if os.path.isdir(self.index_location):
raise SkipTest('skipped due to existing index')
else:
self.log_user()
- response = self.app.get(url(controller='search', action='index'), {'q':'vcs_test'})
+ response = self.app.get(url(controller='search', action='index'), {'q':HG_REPO})
assert 'There is no index to search in. Please run whoosh indexer' in response.body, 'No error message about empty index'
-
+
def test_normal_search(self):
self.log_user()
response = self.app.get(url(controller='search', action='index'), {'q':'def repo'})
print response.body
assert '10 results' in response.body, 'no message about proper search results'
assert 'Permission denied' not in response.body, 'Wrong permissions settings for that repo and user'
-
-
+
+
def test_repo_search(self):
self.log_user()
- response = self.app.get(url(controller='search', action='index'), {'q':'repository:vcs_test def test'})
+ response = self.app.get(url(controller='search', action='index'), {'q':'repository:%s def test' % HG_REPO})
print response.body
assert '4 results' in response.body, 'no message about proper search results'
assert 'Permission denied' not in response.body, 'Wrong permissions settings for that repo and user'
-
+
diff --git a/rhodecode/tests/functional/test_settings.py b/rhodecode/tests/functional/test_settings.py
--- a/rhodecode/tests/functional/test_settings.py
+++ b/rhodecode/tests/functional/test_settings.py
@@ -6,40 +6,38 @@ class TestSettingsController(TestControl
def test_index(self):
self.log_user()
response = self.app.get(url(controller='settings', action='index',
- repo_name='vcs_test'))
+ repo_name=HG_REPO))
# Test response...
-
+
def test_fork(self):
self.log_user()
response = self.app.get(url(controller='settings', action='fork',
- repo_name='vcs_test'))
-
+ repo_name=HG_REPO))
+
def test_fork_create(self):
self.log_user()
- fork_name = 'vcs_test_fork'
+ fork_name = HG_FORK
description = 'fork of vcs test'
- repo_name = 'vcs_test'
+ repo_name = HG_REPO
response = self.app.post(url(controller='settings', action='fork_create',
repo_name=repo_name),
{'fork_name':fork_name,
+ 'repo_type':'hg',
'description':description,
'private':'False'})
-
-
- print response
-
+
#test if we have a message that fork is ok
assert 'fork %s repository as %s task added' \
% (repo_name, fork_name) in response.session['flash'][0], 'No flash message about fork'
-
+
#test if the fork was created in the database
fork_repo = self.sa.query(Repository).filter(Repository.repo_name == fork_name).one()
-
+
assert fork_repo.repo_name == fork_name, 'wrong name of repo name in new db fork repo'
assert fork_repo.fork.repo_name == repo_name, 'wrong fork parrent'
-
-
+
+
#test if fork is visible in the list ?
response = response.follow()
@@ -47,9 +45,6 @@ class TestSettingsController(TestControl
#check if fork is marked as fork
response = self.app.get(url(controller='summary', action='index',
repo_name=fork_name))
-
-
- print response
-
+
assert 'Fork of %s' % repo_name in response.body, 'no message about that this repo is a fork'
-
+
diff --git a/rhodecode/tests/functional/test_shortlog.py b/rhodecode/tests/functional/test_shortlog.py
--- a/rhodecode/tests/functional/test_shortlog.py
+++ b/rhodecode/tests/functional/test_shortlog.py
@@ -4,5 +4,5 @@ class TestShortlogController(TestControl
def test_index(self):
self.log_user()
- response = self.app.get(url(controller='shortlog', action='index',repo_name='vcs_test'))
+ response = self.app.get(url(controller='shortlog', action='index',repo_name=HG_REPO))
# Test response...
diff --git a/rhodecode/tests/functional/test_summary.py b/rhodecode/tests/functional/test_summary.py
--- a/rhodecode/tests/functional/test_summary.py
+++ b/rhodecode/tests/functional/test_summary.py
@@ -4,8 +4,14 @@ class TestSummaryController(TestControll
def test_index(self):
self.log_user()
- response = self.app.get(url(controller='summary', action='index', repo_name='vcs_test'))
- print response
- assert """ """ in response.body
-
- # Test response...
+ response = self.app.get(url(controller='summary', action='index', repo_name=HG_REPO))
+
+ #repo type
+ assert """ """ in response.body
+ assert """ """ in response.body
+
+ #codes stats
+ assert """var data = {"text/x-python": 42, "text/plain": 12};""" in response.body, 'wrong info about % of codes stats'
+
+ # clone url...
+ assert """ """ % HG_REPO in response.body
diff --git a/rhodecode/tests/functional/test_tags.py b/rhodecode/tests/functional/test_tags.py
--- a/rhodecode/tests/functional/test_tags.py
+++ b/rhodecode/tests/functional/test_tags.py
@@ -4,5 +4,10 @@ class TestTagsController(TestController)
def test_index(self):
self.log_user()
- response = self.app.get(url(controller='tags', action='index',repo_name='vcs_test'))
+ response = self.app.get(url(controller='tags', action='index', repo_name=HG_REPO))
+ assert """ tip """ % HG_REPO, 'wrong info about tip tag'
+ assert """
0.1.4 """ % HG_REPO, 'wrong info about 0.1.4 tag'
+ assert """
0.1.3 """ % HG_REPO, 'wrong info about 0.1.3 tag'
+ assert """
0.1.2 """ % HG_REPO, 'wrong info about 0.1.2 tag'
+ assert """
0.1.1 """ % HG_REPO, 'wrong info about 0.1.1 tag'
# Test response...
diff --git a/rhodecode/tests/functional/test_users.py b/rhodecode/tests/functional/test_users.py
--- a/rhodecode/tests/functional/test_users.py
+++ b/rhodecode/tests/functional/test_users.py
@@ -10,7 +10,13 @@ class TestUsersController(TestController
response = self.app.get(url('formatted_users', format='xml'))
def test_create(self):
- response = self.app.post(url('users'))
+ self.log_user()
+# user_name = 'new_user'
+# response = self.app.post(url('users'),{'repo_name':user_name,
+# 'repo_type':'hg',
+# 'description':description,
+# 'private':private})
+
def test_new(self):
response = self.app.get(url('new_user'))
diff --git a/rhodecode/tests/vcs_test.tar.gz b/rhodecode/tests/vcs_test.tar.gz
deleted file mode 100644
index f0156b56eec65853396254c9d9124df8861e8674..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@
+PbRStDBYAMaoA(d`YxbQ7(!k
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