From 60cd1c0639f21da401dc66efddc0db8be94ee6f0 Mon Sep 17 00:00:00 2001 From: Baptiste BEAUPLAT Date: Sun, 14 Oct 2018 19:03:59 +0200 Subject: [PATCH 1/7] Add coverage directory to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 79ccbc19..81730136 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ dist .coverage debexpo.egg-info/* development-arno.ini +cover -- GitLab From 331646cdd90f6a1c5fbbddc3bd2b18a485914d1e Mon Sep 17 00:00:00 2001 From: Baptiste BEAUPLAT Date: Sun, 14 Oct 2018 19:14:26 +0200 Subject: [PATCH 2/7] Automatically create upload dir --- .gitlab-ci.yml | 1 - debexpo/websetup.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c6ca2415..5c4db6bb 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/websetup.py b/debexpo/websetup.py index cfda9f62..a322f2ec 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') -- GitLab From b99fc5942d39f974748ec8f2eafffb8119393c22 Mon Sep 17 00:00:00 2001 From: Baptiste BEAUPLAT Date: Sun, 14 Oct 2018 19:41:16 +0200 Subject: [PATCH 3/7] Cover IndexController with tests * Add test for intro_reviewer and qa index pages * Cleanup code in test setup/teardown * Remove distinction between logged and anonymous user in intro_maintainers (previously used for templating .dput.rc) --- debexpo/controllers/index.py | 11 +-------- debexpo/tests/functional/test_index.py | 32 ++++++++++++++------------ 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/debexpo/controllers/index.py b/debexpo/controllers/index.py index 62187da5..140cb2c0 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/tests/functional/test_index.py b/debexpo/tests/functional/test_index.py index 6b4a7a58..03ebf711 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) -- GitLab From a9e401ec0c851da9e582b36f6dc23ec7783f8503 Mon Sep 17 00:00:00 2001 From: Baptiste BEAUPLAT Date: Wed, 17 Oct 2018 23:24:26 +0200 Subject: [PATCH 4/7] Cover RegisterController with tests * Add tests for sponsor signup * Add tests for account activation * Remove id parameter validation in RegisterController().activate(id) obsoleted by new routing system --- debexpo/controllers/register.py | 4 -- debexpo/tests/functional/test_register.py | 58 ++++++++++++++++++++++- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/debexpo/controllers/register.py b/debexpo/controllers/register.py index e6ffcc62..8e6918fb 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/tests/functional/test_register.py b/debexpo/tests/functional/test_register.py index f68f5508..2e928c87 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) -- GitLab From ebd3efbc7a6a14e0da8ab0d5a6579b6ba165ce99 Mon Sep 17 00:00:00 2001 From: Baptiste BEAUPLAT Date: Sat, 20 Oct 2018 19:16:49 +0200 Subject: [PATCH 5/7] Cover PackageController with tests --- debexpo/tests/functional/test_package.py | 248 ++++++++++++++++++----- 1 file changed, 193 insertions(+), 55 deletions(-) diff --git a/debexpo/tests/functional/test_package.py b/debexpo/tests/functional/test_package.py index 1febfb7d..ddefddfd 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) -- GitLab From 027765058a91b4020b296ca980454b45c2652436 Mon Sep 17 00:00:00 2001 From: Baptiste BEAUPLAT Date: Sun, 21 Oct 2018 11:48:09 +0200 Subject: [PATCH 6/7] Cover UploadController with tests --- debexpo/tests/functional/test_upload.py | 90 ++++++++++++++++++++----- 1 file changed, 72 insertions(+), 18 deletions(-) diff --git a/debexpo/tests/functional/test_upload.py b/debexpo/tests/functional/test_upload.py index 52b29d29..5d6d61fb 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) -- GitLab From d799dddb8a6566cd0765be81f661203a39e43753 Mon Sep 17 00:00:00 2001 From: Baptiste BEAUPLAT Date: Sun, 28 Oct 2018 16:07:37 +0100 Subject: [PATCH 7/7] Do not cover an always true condition in model/package_info. --- debexpo/model/package_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debexpo/model/package_info.py b/debexpo/model/package_info.py index ff1706e6..e9b2c838 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) -- GitLab