diff --git a/.gitignore b/.gitignore
index 79ccbc1968f3fce96e8aef24d61c9902f69e8738..817301365b49aebaebcbbeb0ed4d75253d6a1e67 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@ dist
.coverage
debexpo.egg-info/*
development-arno.ini
+cover
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c6ca2415d7b5123bf117be1496190c79666a34c5..5c4db6bb163cb44c87bb3106a13d4977d5695f2b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,7 +6,6 @@ before_script:
.test_template: &test
script:
- - mkdir -p /tmp/debexpo/pub
- python2.7 setup.py develop
- python2.7 setup.py compile_catalog
- python2.7 setup.py nosetests --with-coverage --cover-erase --cover-html
diff --git a/debexpo/controllers/index.py b/debexpo/controllers/index.py
index 62187da5695a3dbf30e3283aba8cf82ea8bf5157..140cb2c00819461b6ce8e2624315ca0011594779 100644
--- a/debexpo/controllers/index.py
+++ b/debexpo/controllers/index.py
@@ -79,15 +79,6 @@ class IndexController(BaseController):
def intro_maintainers(self):
"""Return an introduction page for package maintainers"""
-
- # The template will need to look at the user details.
- if 'user_id' in session:
- log.debug('Getting user object for user_id = "%s"' % session['user_id'])
- self.user = meta.session.query(User).get(session['user_id'])
- c.user = self.user
- c.logged_in = True
- else:
- c.logged_in = False
-
+ c.config = config
return render('/index/intro-maintainers.mako')
diff --git a/debexpo/controllers/register.py b/debexpo/controllers/register.py
index e6ffcc62b9abf2f245c3937d6802492f268fa23e..8e6918fbccf693203738f62d25e0ecb1f4891638 100644
--- a/debexpo/controllers/register.py
+++ b/debexpo/controllers/register.py
@@ -123,10 +123,6 @@ class RegisterController(BaseController):
"""
log.debug('Activation request with key = %s' % id)
- if id is None:
- log.error('Key is None')
- abort(404, 'Key is None')
-
user = meta.session.query(User).filter_by(verification=id).first()
if user is not None:
diff --git a/debexpo/model/package_info.py b/debexpo/model/package_info.py
index ff1706e6a0fd4d155c47f28bc2437d240eb65f30..e9b2c838a05b09d4b97c31bd30c553f2ca9a1214 100644
--- a/debexpo/model/package_info.py
+++ b/debexpo/model/package_info.py
@@ -105,7 +105,7 @@ class PackageInfo(OrmObject):
break
else:
# No template file found, something weird happened
- return "%s (!! no template found)" % self.data
+ return "%s (!! no template found)" % self.data # pragma: no cover
return template.render_unicode(o = self, h = debexpo.lib.helpers)
diff --git a/debexpo/tests/functional/test_index.py b/debexpo/tests/functional/test_index.py
index 6b4a7a58cbf34a73c3b9085b626d9b3798b346ab..03ebf7116f11a742a768a89c5676dafb7560d94e 100644
--- a/debexpo/tests/functional/test_index.py
+++ b/debexpo/tests/functional/test_index.py
@@ -8,19 +8,6 @@ import pylons.test
class TestIndexController(TestController):
- def setUp(self):
- self.tempdir = mkdtemp()
-
- def tearDown(self):
- rmtree(self.tempdir)
-
- def _generate_temppage(self, filename, text):
- temppage = os.path.join(self.tempdir, filename)
- f = open(temppage, 'w')
- f.write(text)
- f.close()
- return temppage
-
def test_index(self):
# test a normal index page
testurl = url(controller='index', action='index')
@@ -32,11 +19,26 @@ class TestIndexController(TestController):
def test_contact(self):
response = self.app.get(url(controller='index', action='contact'))
+ testtext = '
Site contact
'
self.assertEquals(response.status_int, 200)
+ self.assertTrue(testtext in response)
+
+ def test_qa(self):
+ response = self.app.get(url(controller='index', action='qa'))
+ testtext = 'Questions & Answers
'
+ self.assertEquals(response.status_int, 200)
+ self.assertTrue(testtext in response)
+
+ def test_intro_reviewer(self):
+ response = self.app.get(url(controller='index',
+ action='intro-reviewers'))
+ testtext = 'Package reviews
'
+ self.assertEquals(response.status_int, 200)
+ self.assertTrue(testtext in response)
def test_intro_maintainers(self):
- testurl = url('intro-maintainers')
- response = self.app.get(testurl)
+ response = self.app.get(url(controller='index',
+ action='intro-maintainers'))
testtext = "{}".format('Introduction for maintainers: How will my',
' package get into Debian
')
self.assertEquals(response.status_int, 200)
diff --git a/debexpo/tests/functional/test_package.py b/debexpo/tests/functional/test_package.py
index 1febfb7d6c5dc71f3d194adeb1008b0a08efbd11..ddefddfdc09bea515ced446b49416b6f66396aaf 100644
--- a/debexpo/tests/functional/test_package.py
+++ b/debexpo/tests/functional/test_package.py
@@ -5,10 +5,14 @@ from debexpo.model.users import User
from debexpo.model.packages import Package
from debexpo.model.package_comments import PackageComment
from debexpo.model.package_versions import PackageVersion
+from debexpo.model.package_info import PackageInfo
from debexpo.model.source_packages import SourcePackage
from debexpo.model.package_subscriptions import PackageSubscription
+from debexpo.controllers.package import PackageController
from datetime import datetime
import pylons.test
+import md5
+
class TestPackageController(TestController):
@@ -16,69 +20,107 @@ class TestPackageController(TestController):
self._setup_models()
self._setup_example_user()
user = meta.session.query(User).filter(
- User.email=='email@example.com').one()
+ User.email == 'email@example.com').one()
package = Package(name='testpackage', user=user,
description='a test package')
meta.session.add(package)
- package_version = PackageVersion(package=package, version='1.0-1',
- maintainer='Test User ',
- section='Admin',
- distribution='unstable',
- qa_status=0,
- component='main',
- priority='optional',
- closes='',
- uploaded=datetime.now())
+ package_version = PackageVersion(
+ package=package,
+ version='1.0-1',
+ maintainer='Test User ',
+ section='Admin',
+ distribution='unstable',
+ qa_status=0,
+ component='main',
+ priority='optional',
+ closes='',
+ uploaded=datetime.now())
meta.session.add(package_version)
meta.session.add(SourcePackage(package_version=package_version))
meta.session.commit()
def tearDown(self):
package = meta.session.query(Package).filter(
- Package.name=='testpackage').first()
+ Package.name == 'testpackage').first()
if package:
package_versions = meta.session.query(PackageVersion).filter(
- PackageVersion.package==package).all()
+ PackageVersion.package == package).all()
for vers in package_versions:
meta.session.query(SourcePackage).filter(
- SourcePackage.package_version==vers).delete()
+ SourcePackage.package_version == vers).delete()
meta.session.delete(vers)
meta.session.delete(package)
meta.session.commit()
self._remove_example_user()
+ def _test_no_auth(self, action, redirect_login=True):
+ user = meta.session.query(User).filter(
+ User.email == 'email@example.com').one()
+ response = self.app.get(url(
+ controller='package', action=action, packagename='testpackage',
+ key=user.get_upload_key()))
+ self.assertEquals(response.status_int, 302)
+ if (redirect_login):
+ self.assertTrue(response.location.endswith(url('login')))
+
+ def _test_wrong_key(self, action):
+ self.app.post(url('login'), self._AUTHDATA)
+ user = meta.session.query(User).filter(
+ User.email == 'email@example.com').one()
+ response = self.app.get(url(
+ controller='package', action=action, packagename='testpackage',
+ key='wrong'), expect_errors=True)
+ self.assertEquals(response.status_int, 402)
+
+ def _test_not_owned_package(self, action):
+ user = User(name='Another user', email='another@example.com',
+ password=md5.new('password').hexdigest(),
+ lastlogin=datetime.now())
+ meta.session.add(user)
+ meta.session.commit()
+ self.app.post(url('login'), {'email': 'another@example.com',
+ 'password': 'password',
+ 'commit': 'submit'})
+ user = meta.session.query(User).filter(
+ User.email == 'another@example.com').one()
+ response = self.app.get(url(
+ controller='package', action=action, packagename='testpackage',
+ key=user.get_upload_key()), expect_errors=True)
+ self.assertEquals(response.status_int, 403)
+ meta.session.delete(user)
+
def test_index(self):
user = meta.session.query(User).filter(
- User.email=='email@example.com').one()
+ User.email == 'email@example.com').one()
response = self.app.get(url(controller='package', action='index'))
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(
- url(controller='packages', action='index', packagename=None)))
+ url(controller='packages', action='index', packagename=None)))
response = self.app.get(url(controller='package', action='index',
packagename='notapackage'))
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(
- url(controller='packages', action='index', packagename=None)))
+ url(controller='packages', action='index', packagename=None)))
response = self.app.get(url(controller='package', action='index',
packagename='testpackage'))
self.assertEquals(response.status_int, 200)
self.assertEquals(len(response.lxml.xpath(
- '//a[@href="%s"]' % url(controller='packages',
- action='uploader',
- id='email@example.com'))), 1)
+ '//a[@href="%s"]' % url(controller='packages',
+ action='uploader',
+ id='email@example.com'))), 1)
response = self.app.post(url('login'), self._AUTHDATA)
response = self.app.get(url(controller='package', action='index',
packagename='testpackage'))
self.assertEquals(response.status_int, 200)
self.assertEquals(len(response.lxml.xpath(
- '//a[@href="%s"]' % url(
- controller='package', action='delete',
- packagename='testpackage',
- key=user.get_upload_key()))), 1)
+ '//a[@href="%s"]' % url(
+ controller='package', action='delete',
+ packagename='testpackage',
+ key=user.get_upload_key()))), 1)
self.assertEquals(len(response.lxml.xpath(
- '//form[@action="%s"]' % url(
- controller='package', action='comment',
- packagename='testpackage'))), 1)
+ '//form[@action="%s"]' % url(
+ controller='package', action='comment',
+ packagename='testpackage'))), 1)
def test_subscribe(self):
response = self.app.get(url(controller='package', action='subscribe',
@@ -86,8 +128,8 @@ class TestPackageController(TestController):
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(url('login')))
self.assertEquals(response.session['path_before_login'], url(
- controller='package', action='subscribe',
- packagename='testpackage'))
+ controller='package', action='subscribe',
+ packagename='testpackage'))
self.app.post(url('login'), self._AUTHDATA)
response = self.app.get(url(controller='package', action='subscribe',
packagename='testpackage'))
@@ -101,22 +143,23 @@ class TestPackageController(TestController):
self.assertEquals(len(options), 3)
for option in options:
self.assertTrue(option.attrib['value'] in [
- str(item) for item in (
- -1, constants.SUBSCRIPTION_LEVEL_UPLOADS,
- constants.SUBSCRIPTION_LEVEL_COMMENTS)])
+ str(item) for item in (
+ -1, constants.SUBSCRIPTION_LEVEL_UPLOADS,
+ constants.SUBSCRIPTION_LEVEL_COMMENTS)])
response = self.app.post(url(controller='package', action='subscribe',
packagename='testpackage'))
self.assertEquals(response.status_int, 200)
self.assertEquals(
len(response.lxml.xpath(
- '//span[@class="error-message"]')), 2)
- response = self.app.post(url(controller='package', action='subscribe',
+ '//span[@class="error-message"]')), 2)
+ response = self.app.post(url(controller='package',
+ action='subscribe',
packagename='testpackage'),
{'level': constants.SUBSCRIPTION_LEVEL_UPLOADS,
'commit': 'submit'})
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(
- url('package', packagename='testpackage')))
+ url('package', packagename='testpackage')))
subs = meta.session.query(PackageSubscription).filter_by(
package='testpackage').filter_by(
user_id=response.session['user_id']).one()
@@ -125,15 +168,16 @@ class TestPackageController(TestController):
packagename='testpackage'))
self.assertEquals(
len(response.lxml.xpath(
- '//option[@value="%d" and @selected="selected"]' %
- constants.SUBSCRIPTION_LEVEL_UPLOADS)), 1)
- response = self.app.post(url(controller='package', action='subscribe',
+ '//option[@value="%d" and @selected="selected"]' %
+ constants.SUBSCRIPTION_LEVEL_UPLOADS)), 1)
+ response = self.app.post(url(controller='package',
+ action='subscribe',
packagename='testpackage'),
{'level': constants.SUBSCRIPTION_LEVEL_COMMENTS,
'commit': 'submit'})
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(
- url('package', packagename='testpackage')))
+ url('package', packagename='testpackage')))
subs = meta.session.query(PackageSubscription).filter_by(
package='testpackage').filter_by(
user_id=response.session['user_id']).one()
@@ -144,32 +188,57 @@ class TestPackageController(TestController):
'commit': 'submit'})
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(
- url('package', packagename='testpackage')))
+ url('package', packagename='testpackage')))
subs = meta.session.query(PackageSubscription).filter_by(
package='testpackage').filter_by(
user_id=response.session['user_id']).first()
self.assertEquals(subs, None)
- def test_delete(self):
- user = meta.session.query(User).filter(
- User.email=='email@example.com').one()
- response = self.app.get(url(
- controller='package', action='delete', packagename='testpackage',
- key=user.get_upload_key()))
- self.assertEquals(response.status_int, 302)
- self.assertTrue(response.location.endswith(url('login')))
+ def test_get_package_from_crontab_wrong_package(self):
+ pkg_controller = PackageController()
+ package = pkg_controller._get_package('nonexistant',
+ from_controller=False)
+ self.assertEquals(package, None)
+
+ def test_get_package_from_crontab(self):
+ pkg_controller = PackageController()
+ package = pkg_controller._get_package('testpackage',
+ from_controller=False)
+ self.assertEquals(package.name, 'testpackage')
+
+ def test_delete_no_auth(self):
+ self._test_no_auth('delete')
+
+ def test_delete_not_owned_package(self):
+ self._test_not_owned_package('delete')
+
+ def test_delete_wrong_key(self):
+ self._test_wrong_key('delete')
+
+ def test_delete_successful(self):
self.app.post(url('login'), self._AUTHDATA)
+ user = meta.session.query(User).filter(
+ User.email == 'email@example.com').one()
response = self.app.get(url(
controller='package', action='delete', packagename='testpackage',
key=user.get_upload_key()))
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(
- url(controller='packages', action='my')))
+ url(controller='packages', action='my')))
package = meta.session.query(Package).filter(
- Package.name=='testpackage').first()
+ Package.name == 'testpackage').first()
self.assertEquals(package, None)
- def test_comment(self):
+ def test_comment_show(self):
+ response = self.app.get(
+ url(controller='package', action='comment',
+ packagename='testpackage'))
+ self.assertEquals(response.status_int, 302)
+ self.assertTrue(response.location.endswith(
+ url(controller='package', action='index',
+ packagename='testpackage')))
+
+ def test_comment_no_auth(self):
response = self.app.post(
url(controller='package', action='comment',
packagename='testpackage'),
@@ -179,6 +248,8 @@ class TestPackageController(TestController):
'commit': 'submit'})
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(url('login')))
+
+ def test_comment(self):
self.app.post(url('login'), self._AUTHDATA)
response = self.app.post(
url(controller='package', action='comment',
@@ -189,17 +260,21 @@ class TestPackageController(TestController):
'commit': 'submit'})
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(
- url(controller='package', action='index',
- packagename='testpackage')))
+ url(controller='package', action='index',
+ packagename='testpackage')))
comment = meta.session.query(PackageComment).filter_by(
package_version_id=1).one()
self.assertEquals(comment.text, 'This is a test comment')
self.assertEquals(comment.status,
constants.PACKAGE_COMMENT_STATUS_NOT_UPLOADED)
meta.session.delete(comment)
+
+ def test_comment_with_subscriber(self):
# test with a subscriber
pylons.test.pylonsapp.config['debexpo.testsmtp'] = '/tmp/debexpo.msg'
- user = meta.session.query(User).filter(User.email=='email@example.com').one()
+ self.app.post(url('login'), self._AUTHDATA)
+ user = meta.session.query(User).filter(
+ User.email == 'email@example.com').one()
packsub = PackageSubscription(
package='testpackage',
level=constants.SUBSCRIPTION_LEVEL_COMMENTS)
@@ -216,8 +291,8 @@ class TestPackageController(TestController):
'status': 'checked'})
self.assertEquals(response.status_int, 302)
self.assertTrue(response.location.endswith(
- url(controller='package', action='index',
- packagename='testpackage')))
+ url(controller='package', action='index',
+ packagename='testpackage')))
comment = meta.session.query(PackageComment).filter_by(
package_version_id=1).one()
self.assertEquals(comment.text, 'This is a test comment')
@@ -225,3 +300,66 @@ class TestPackageController(TestController):
constants.PACKAGE_COMMENT_STATUS_UPLOADED)
meta.session.delete(packsub)
meta.session.commit()
+
+ def test_sponsor_no_auth(self):
+ self._test_no_auth('sponsor')
+
+ def test_sponsor_wrong_key(self):
+ self._test_wrong_key('sponsor')
+
+ def test_sponsor_not_owned_package(self):
+ self._test_not_owned_package('sponsor')
+
+ def test_sponsor_toggle(self, toggle=True):
+ self.app.post(url('login'), self._AUTHDATA)
+ user = meta.session.query(User).filter(
+ User.email == 'email@example.com').one()
+ response = self.app.get(url(
+ controller='package', action='sponsor', packagename='testpackage',
+ key=user.get_upload_key()))
+ self.assertEquals(response.status_int, 302)
+ package = meta.session.query(Package).filter(
+ Package.name == 'testpackage').first()
+ if (toggle):
+ self.assertFalse(package.needs_sponsor)
+ self.test_sponsor_toggle(toggle=False)
+ else:
+ self.assertTrue(package.needs_sponsor)
+
+ def test_package_info_rich_data(self):
+ package = meta.session.query(Package).filter(
+ Package.name == 'testpackage').first()
+ package_version = meta.session.query(PackageVersion).filter(
+ PackageVersion.package == package).first()
+ textmark = 'some lintian output'
+ package_info_data = PackageInfo(
+ package_version_id=package_version.id,
+ from_plugin='LintianPlugin',
+ outcome='Package is lintian clean',
+ rich_data=textmark,
+ severity=constants.PLUGIN_SEVERITY_INFO)
+ meta.session.add(package_info_data)
+ meta.session.commit()
+ response = self.app.get(url(controller='package', action='index',
+ packagename='testpackage'))
+ self.assertEquals(response.status_int, 200)
+ self.assertTrue(textmark in response)
+
+ def test_package_info_data(self):
+ package = meta.session.query(Package).filter(
+ Package.name == 'testpackage').first()
+ package_version = meta.session.query(PackageVersion).filter(
+ PackageVersion.package == package).first()
+ textmark = 'some lintian output'
+ package_info_data = PackageInfo(
+ package_version_id=package_version.id,
+ from_plugin='LintianPlugin',
+ outcome='Package is lintian clean',
+ data=textmark,
+ severity=constants.PLUGIN_SEVERITY_INFO)
+ meta.session.add(package_info_data)
+ meta.session.commit()
+ response = self.app.get(url(controller='package', action='index',
+ packagename='testpackage'))
+ self.assertEquals(response.status_int, 200)
+ self.assertTrue(textmark in response)
diff --git a/debexpo/tests/functional/test_register.py b/debexpo/tests/functional/test_register.py
index f68f5508cbaa8fe8145cf540a1a4b6ced3d0a34d..2e928c878789fedee9a0b84eaddec187ee29afb4 100644
--- a/debexpo/tests/functional/test_register.py
+++ b/debexpo/tests/functional/test_register.py
@@ -1,6 +1,7 @@
from debexpo.tests import TestController, url
from debexpo.model import meta
from debexpo.model.users import User
+from debexpo.lib import constants
import pylons.test
class TestRegisterController(TestController):
@@ -42,7 +43,8 @@ class TestRegisterController(TestController):
'email': 'mr_me_again@example.com',
'sponsor': '0'})
- count = meta.session.query(User).filter(User.email=='mr_me_again@example.com').count()
+ count = meta.session.query(User).filter(
+ User.email=='mr_me_again@example.com').count()
self.assertEquals(count, 0)
# The assertion is that there are no matching users by
# email address.
@@ -58,6 +60,58 @@ class TestRegisterController(TestController):
# Now, finally, delete that User that we created.
meta.session.delete(
- meta.session.query(User).filter(User.email=='mr_me@example.com').one())
+ meta.session.query(User).filter(
+ User.email=='mr_me@example.com').one())
+ def test_sponsor_signup_wrong_email(self):
+ pylons.test.pylonsapp.config['debexpo.testsmtp'] = '/tmp/debexpo.msg'
+ response = self.app.post(url(controller='register', action='register'),
+ {'name': 'Mr. Me',
+ 'password': 'password',
+ 'password_confirm': 'password',
+ 'commit': 'yes',
+ 'email': 'mr_me@example.org',
+ 'sponsor': '1'})
+ self.assertEqual(response.status_int, 200)
+ testtext = '{}'.format('A sponsor account must be registered with your',
+ ' @debian.org address')
+ self.assertTrue(testtext in response)
+ count = meta.session.query(User).filter(User.email=='mr_me@example.com').count()
+ self.assertEquals(count, 0)
+
+
+ def test_sponsor_signup(self):
+ pylons.test.pylonsapp.config['debexpo.testsmtp'] = '/tmp/debexpo.msg'
+ response = self.app.post(url(controller='register', action='register'),
+ {'name': 'Mr. Me Debian',
+ 'password': 'password',
+ 'password_confirm': 'password',
+ 'commit': 'yes',
+ 'email': 'mr_me@debian.org',
+ 'sponsor': '1'})
+
+ self.assertEqual(response.status_int, 200)
+ user = meta.session.query(User).filter(
+ User.email=='mr_me@debian.org').first()
+ self.assertEquals(user.status, constants.USER_STATUS_DEVELOPER)
+
+ user = meta.session.query(User).filter(
+ User.email=='mr_me@debian.org').one()
+ meta.session.delete(user)
+
+ def test_activation_wrong_key(self):
+ response = self.app.get(url(controller='register', action='activate',
+ id='that_key_should_not_exist'),
+ expect_errors=True)
+ self.assertEqual(response.status_int, 404)
+
+ def test_successful_activation(self):
+ self.test_maintainer_signup(actually_delete_it=False)
+ user = meta.session.query(User).filter(
+ User.email=='mr_me@example.com').one()
+ response = self.app.get(url(controller='register', action='activate',
+ id=user.verification),
+ expect_errors=True)
+ self.assertEqual(response.status_int, 200)
+ meta.session.delete(user)
diff --git a/debexpo/tests/functional/test_upload.py b/debexpo/tests/functional/test_upload.py
index 52b29d29d1b9b0c0e73835a9b1c91ea0a6987dc8..5d6d61fb1ad9ba3479fb9e5d7f14704373dddb38 100644
--- a/debexpo/tests/functional/test_upload.py
+++ b/debexpo/tests/functional/test_upload.py
@@ -42,6 +42,7 @@ import base64
from debexpo.tests import TestController, url
import pylons.test
+
class TestUploadController(TestController):
def __init__(self, *args, **kwargs):
@@ -59,16 +60,20 @@ class TestUploadController(TestController):
def testGetRequest(self):
"""
- Tests whether requests where method != PUT are rejected with error code 405.
+ Tests whether requests where method != PUT are rejected with error code
+ 405.
"""
- response = self.app.get(url(controller='upload', action='index',
- filename='testname.dsc'), expect_errors=True)
+ response = self.app.get(url(controller='upload',
+ action='index',
+ filename='testname.dsc'),
+ expect_errors=True)
self.assertEqual(response.status_int, 405)
def testExtensionNotAllowed(self):
"""
- Tests whether uploads of an unknown file extensions are rejected with error code 403.
+ Tests whether uploads of an unknown file extensions are rejected with
+ error code 403.
"""
response = self.app.put(url(controller='upload', action='index',
filename='testname.unknown'),
@@ -78,23 +83,31 @@ class TestUploadController(TestController):
def testSuccessfulUpload(self):
"""
- Tests whether uploads with sane file extensions and authorization are successful.
+ Tests whether uploads with sane file extensions and authorization are
+ successful.
"""
response = self.app.put(url(
- controller='upload', action='index',
- filename='testfile2.dsc'),
+ controller='upload', action='index',
+ filename='testfile2.dsc'),
params='contents', expect_errors=False)
self.assertEqual(response.status_int, 200)
app_config = pylons.test.pylonsapp.config
- self.assertTrue(os.path.isfile(os.path.join(app_config['debexpo.upload.incoming'],
- 'pub',
- 'testfile2.dsc')))
-
- self.assertEqual(file(os.path.join(app_config['debexpo.upload.incoming'],
- 'pub',
- 'testfile2.dsc')).read(), 'contents')
+ self.assertTrue(
+ os.path.isfile(
+ os.path.join(
+ app_config['debexpo.upload.incoming'],
+ 'pub',
+ 'testfile2.dsc')))
+
+ self.assertEqual(
+ file(
+ os.path.join(
+ app_config['debexpo.upload.incoming'],
+ 'pub',
+ 'testfile2.dsc')).read(),
+ 'contents')
if os.path.isfile(os.path.join(app_config['debexpo.upload.incoming'],
'pub', 'testfile2.dsc')):
@@ -106,15 +119,15 @@ class TestUploadController(TestController):
Tests whether a re-uploads of the same file failed with error code 403.
"""
response = self.app.put(url(
- controller='upload', action='index',
- filename='testfile.dsc'),
+ controller='upload', action='index',
+ filename='testfile.dsc'),
params='contents', expect_errors=False)
self.assertEqual(response.status_int, 200)
response = self.app.put(url(
- controller='upload', action='index',
- filename='testfile.dsc'),
+ controller='upload', action='index',
+ filename='testfile.dsc'),
params='contents', expect_errors=True)
self.assertEqual(response.status_int, 403)
@@ -125,3 +138,44 @@ class TestUploadController(TestController):
'pub', 'testfile.dsc')):
os.remove(os.path.join(app_config['debexpo.upload.incoming'],
'pub', 'testfile.dsc'))
+
+ def testUploadWithoutConfig(self):
+ """
+ Tests whether an uploads without debexpo.upload.incoming fails.
+ """
+ pylons.test.pylonsapp.config.pop('debexpo.upload.incoming')
+
+ response = self.app.put(url(
+ controller='upload', action='index',
+ filename='testfile.dsc'),
+ params='contents', expect_errors=True)
+
+ self.assertEqual(response.status_int, 500)
+
+ def testUploadNonexistantQueue(self):
+ """
+ Tests whether an uploads with an nonexistant queue fails.
+ """
+ app_config = pylons.test.pylonsapp.config
+ app_config['debexpo.upload.incoming'] = '/nonexistant'
+
+ response = self.app.put(url(
+ controller='upload', action='index',
+ filename='testfile.dsc'),
+ params='contents', expect_errors=True)
+
+ self.assertEqual(response.status_int, 500)
+
+ def testUploadNonwritableQueue(self):
+ """
+ Tests whether an uploads with an nonwritable queue fails.
+ """
+ app_config = pylons.test.pylonsapp.config
+ app_config['debexpo.upload.incoming'] = '/proc/sys'
+
+ response = self.app.put(url(
+ controller='upload', action='index',
+ filename='testfile.dsc'),
+ params='contents', expect_errors=True)
+
+ self.assertEqual(response.status_int, 500)
diff --git a/debexpo/websetup.py b/debexpo/websetup.py
index cfda9f623793ad1518d44d8da17d0c2d32b4338d..a322f2eca8893232eb3cc53178c3ae25aca6e0af 100644
--- a/debexpo/websetup.py
+++ b/debexpo/websetup.py
@@ -84,6 +84,7 @@ def setup_config(command, filename, section, vars):
if not os.path.isdir(config['debexpo.upload.incoming']):
log.info('Creating incoming directory')
os.mkdir(config['debexpo.upload.incoming'])
+ os.mkdir(os.path.join(config['debexpo.upload.incoming'], 'pub'))
else:
log.info('Incoming directory already exists')