evorepo/packages/tests.py
2018-11-30 19:05:46 +01:00

363 lines
14 KiB
Python

import unittest
from django.core import mail
from django.test import TestCase, TransactionTestCase
from django.contrib.auth.models import User
from main.models import Package, Repo
from packages.models import PackageRelation
from devel.models import UserProfile
from .alpm import AlpmAPI
alpm = AlpmAPI()
class AlpmTestCase(unittest.TestCase):
@unittest.skipUnless(alpm.available, "ALPM is unavailable")
def test_version(self):
version = alpm.version()
self.assertIsNotNone(version)
version = version.split('.')
# version is a 3-tuple, e.g., '7.0.2'
self.assertEqual(3, len(version))
@unittest.skipUnless(alpm.available, "ALPM is unavailable")
def test_vercmp(self):
self.assertEqual(0, alpm.vercmp("1.0", "1.0"))
self.assertEqual(1, alpm.vercmp("1.1", "1.0"))
@unittest.skipUnless(alpm.available, "ALPM is unavailable")
def test_compare_versions(self):
self.assertTrue(alpm.compare_versions("1.0", "<=", "2.0"))
self.assertTrue(alpm.compare_versions("1.0", "<", "2.0"))
self.assertFalse(alpm.compare_versions("1.0", ">=", "2.0"))
self.assertFalse(alpm.compare_versions("1.0", ">", "2.0"))
self.assertTrue(alpm.compare_versions("1:1.0", ">", "2.0"))
self.assertFalse(alpm.compare_versions("1.0.2", ">=", "2.1.0"))
self.assertTrue(alpm.compare_versions("1.0", "=", "1.0"))
self.assertTrue(alpm.compare_versions("1.0", "=", "1.0-1"))
self.assertFalse(alpm.compare_versions("1.0", "!=", "1.0"))
def test_behavior_when_unavailable(self):
mock_alpm = AlpmAPI()
mock_alpm.available = False
self.assertIsNone(mock_alpm.version())
self.assertIsNone(mock_alpm.vercmp("1.0", "1.0"))
self.assertIsNone(mock_alpm.compare_versions("1.0", "=", "1.0"))
class PackagesTest(TestCase):
def test_feed(self):
response = self.client.get('/feeds/packages/')
self.assertEqual(response.status_code, 200)
def test_sitemap(self):
for sitemap in ['packages', 'package-groups', 'package-files', 'split-packages']:
response = self.client.get('/sitemap-{}.xml'.format(sitemap))
self.assertEqual(response.status_code, 200)
class PackageSearchJson(TestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
'main/fixtures/package.json']
def test_invalid(self):
response = self.client.get('/packages/search/json/')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertEqual(data['limit'], 250)
self.assertEqual(data['results'], [])
self.assertEqual(data['valid'], False)
def test_reponame(self):
response = self.client.get('/packages/search/json/?repository=core')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertEqual(len(data['results']), 5)
self.assertEqual(set(map(lambda r: r['pkgname'], data['results'])),
{"coreutils", "glibc", "linux", "pacman", "systemd"})
def test_packagename(self):
response = self.client.get('/packages/search/json/?name=linux')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertEqual(len(data['results']), 1)
def test_no_results(self):
response = self.client.get('/packages/search/json/?name=none')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertEqual(len(data['results']), 0)
def test_limit_four(self):
response = self.client.get('/packages/search/json/?limit=4')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertEqual(data['page'], 1)
self.assertEqual(data['num_pages'], 2)
self.assertEqual(data['limit'], 4)
self.assertEqual(len(data['results']), 4)
def test_second_page(self):
response = self.client.get('/packages/search/json/?limit=4&page=2')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertEqual(data['page'], 2)
self.assertEqual(data['num_pages'], 2)
self.assertEqual(len(data['results']), 1)
class PackageSearch(TestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
'main/fixtures/package.json']
def test_invalid(self):
response = self.client.get('/packages/?q=test')
self.assertEqual(response.status_code, 200)
self.assertIn('0 matching packages found', response.content)
def test_exact_match(self):
response = self.client.get('/packages/?q=linux')
self.assertEqual(response.status_code, 200)
self.assertIn('1 matching package found', response.content)
def test_filter_name(self):
response = self.client.get('/packages/?name=name')
self.assertEqual(response.status_code, 200)
self.assertIn('0 matching packages found', response.content)
def test_filter_repo(self):
response = self.client.get('/packages/?repo=Core')
self.assertEqual(response.status_code, 200)
self.assertIn('5 matching packages found', response.content)
def test_filter_desc(self):
response = self.client.get('/packages/?desc=kernel')
self.assertEqual(response.status_code, 200)
self.assertIn('1 matching package found', response.content)
def test_filter_flagged(self):
response = self.client.get('/packages/?flagged=Flagged')
self.assertEqual(response.status_code, 200)
self.assertIn('0 matching packages found', response.content)
def test_filter_not_flagged(self):
response = self.client.get('/packages/?flagged=Not Flagged')
self.assertEqual(response.status_code, 200)
self.assertIn('5 matching packages found', response.content)
def test_filter_arch(self):
response = self.client.get('/packages/?arch=any')
self.assertEqual(response.status_code, 200)
self.assertIn('0 matching packages found', response.content)
def test_filter_maintainer_orphan(self):
response = self.client.get('/packages/?maintainer=orphan')
self.assertEqual(response.status_code, 200)
self.assertIn('5 matching packages found', response.content)
def test_filter_packager_unknown(self):
response = self.client.get('/packages/?packager=unknown')
self.assertEqual(response.status_code, 200)
self.assertIn('5 matching packages found', response.content)
def test_sort(self):
response = self.client.get('/packages/?sort=pkgname')
self.assertEqual(response.status_code, 200)
self.assertIn('5 matching packages found', response.content)
def test_head(self):
response = self.client.head('/packages/?q=unknown')
self.assertEqual(response.status_code, 200)
class OpenSearch(TestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
'main/fixtures/package.json']
def test_packages(self):
response = self.client.get('/opensearch/packages/')
self.assertEqual(response.status_code, 200)
def test_packages_suggest(self):
response = self.client.get('/opensearch/packages/suggest?q=linux')
self.assertEqual(response.status_code, 200)
self.assertIn('linux', response.content)
response = self.client.get('/opensearch/packages/suggest')
class PackageViews(TestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
'main/fixtures/package.json']
def test_arch_differences(self):
response = self.client.get('/packages/differences/')
self.assertEqual(response.status_code, 200)
class PackageDisplay(TestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
'main/fixtures/package.json']
def test_packages_detail(self):
response = self.client.get('/packages/core/x86_64/linux/')
self.assertEqual(response.status_code, 200)
response = self.client.get('/packages/core/x86_64/nope/')
self.assertEqual(response.status_code, 404)
# Redirect to search
response = self.client.get('/packages/core/x86_64/')
self.assertEqual(response.status_code, 302)
def test_packages_json(self):
response = self.client.get('/packages/core/x86_64/linux/json/')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertEqual(data['pkgbase'], 'linux')
# TODO verify more of the structure
def test_packages_files(self):
response = self.client.get('/packages/core/x86_64/linux/files/')
self.assertEqual(response.status_code, 200)
def test_packages_files_json(self):
response = self.client.get('/packages/core/x86_64/linux/files/json/')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertEqual(data['pkgname'], 'linux')
# TODO verify more of the structure
def test_packages_download(self):
response = self.client.get('/packages/core/x86_64/linux/download/')
self.assertEqual(response.status_code, 404)
# TODO: Figure out how to fake a mirror
def test_head(self):
response = self.client.head('/packages/core/x86_64/linux/')
self.assertEqual(response.status_code, 200)
def test_groups(self):
response = self.client.get('/groups/')
self.assertEqual(response.status_code, 200)
def test_groups_arch(self):
response = self.client.get('/groups/x86_64/')
self.assertEqual(response.status_code, 200)
def test_groups_details(self):
response = self.client.get('/groups/x86_64/base/')
self.assertEqual(response.status_code, 404)
# FIXME: add group fixtures.
class FlagPackage(TestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
'main/fixtures/package.json']
def test_flag_package(self):
data = {
'website': '',
'email': 'nobody@archlinux.org',
'message': 'new linux version',
}
response = self.client.post('/packages/core/x86_64/linux/flag/',
data,
follow=True)
self.assertEqual(response.status_code, 200)
self.assertIn('Package Flagged - linux', response.content)
self.assertEqual(len(mail.outbox), 1)
self.assertIn('package [linux] marked out-of-date', mail.outbox[0].subject)
# Flag again, should fail
response = self.client.post('/packages/core/x86_64/linux/flag/',
data,
follow=True)
self.assertEqual(response.status_code, 200)
self.assertIn('has already been flagged out-of-date.', response.content)
def test_flag_package_invalid(self):
data = {
'website': '',
'email': 'nobody@archlinux.org',
'message': 'a',
}
response = self.client.post('/packages/core/x86_64/linux/flag/',
data,
follow=True)
self.assertEqual(response.status_code, 200)
self.assertIn('Enter a valid and useful out-of-date message', response.content)
self.assertEqual(len(mail.outbox), 0)
class AdoptOrphanPackage(TransactionTestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
'main/fixtures/package.json']
def setUp(self):
password = 'test'
self.user = User.objects.create_superuser('admin',
'admin@archlinux.org',
password)
self.profile = UserProfile.objects.create(user=self.user,
public_email="{}@awesome.com".format(self.user.username))
self.profile.allowed_repos.add(Repo.objects.get(name='Core'))
self.profile.save()
self.client.post('/login/', {
'username': self.user.username,
'password': password
})
def tearDown(self):
self.profile.delete()
self.user.delete()
PackageRelation.objects.all().delete()
def request(self, pkgid, adopt=True):
data = {
'pkgid': pkgid,
}
if adopt:
data['adopt'] = 'adopt'
else:
data['disown'] = 'disown'
return self.client.post('/packages/update/', data, follow=True)
def test_adopt_package(self):
pkg = Package.objects.first()
response = self.request(pkg.id)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(PackageRelation.objects.all()), 1)
response = self.request(pkg.id, False)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(PackageRelation.objects.all()), 0)
def test_no_permissions(self):
self.profile.allowed_repos = []
self.profile.save()
pkg = Package.objects.first()
response = self.request(pkg.id)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(PackageRelation.objects.all()), 0)
def test_wrong_request(self):
pkg = Package.objects.first()
response = self.client.post('/packages/update/', {'pkgid': pkg.id, }, follow=True)
self.assertEqual(response.status_code, 200)
self.assertIn('Are you trying to adopt or disown', response.content)
def test_stale_relations(self):
response = self.client.get('/packages/stale_relations/')
self.assertEqual(response.status_code, 200)
# vim: set ts=4 sw=4 et: