Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion devel/management/commands/generate_keyring.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def add_arguments(self, parser):
parser.add_argument('args', nargs='*', help='<arch> <filename>')

def handle(self, *args, **options):
v = int(options.get('verbosity', None))
v = int(options.get('verbosity'))
if v == 0:
logger.level = logging.ERROR
elif v == 1:
Expand Down
2 changes: 1 addition & 1 deletion devel/management/commands/pgp_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def add_arguments(self, parser):
parser.add_argument('args', nargs='*', help='<arch> <filename>')

def handle(self, *args, **options):
v = int(options.get('verbosity', None))
v = int(options.get('verbosity'))
if v == 0:
logger.level = logging.ERROR
elif v == 1:
Expand Down
2 changes: 1 addition & 1 deletion devel/management/commands/read_rebuilderd_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class Command(BaseCommand):
help = "Import reproducible status from rebuilderd."

def handle(self, *args, **options):
v = int(options.get('verbosity', None))
v = int(options.get('verbosity'))
if v == 0:
logger.level = logging.ERROR
elif v == 1:
Expand Down
2 changes: 1 addition & 1 deletion devel/management/commands/readlinks.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def handle(self, filename=None, **options):
if not os.path.exists(filename) or not os.path.isfile(filename):
raise CommandError('Specified links database file does not exist.')

v = int(options.get('verbosity', None))
v = int(options.get('verbosity'))
if v == 0:
logger.level = logging.ERROR
elif v == 1:
Expand Down
2 changes: 1 addition & 1 deletion devel/management/commands/rematch_developers.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Command(BaseCommand):
help = "Match and map objects in database to developer emails"

def handle(self, **options):
v = int(options.get('verbosity', None))
v = int(options.get('verbosity'))
if v == 0:
logger.level = logging.ERROR
elif v == 1:
Expand Down
5 changes: 2 additions & 3 deletions devel/management/commands/reporead.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,8 @@ def create_multivalued(dbpkg, repopkg, db_attr, repo_attr):
collection = getattr(dbpkg, db_attr)
collection.all().delete()
model = collection.model
new_items = []
for name in getattr(repopkg, repo_attr):
new_items.append(model(pkg=dbpkg, name=name))
new_items = [model(pkg=dbpkg, name=name) for name in getattr(repopkg, repo_attr)]

if new_items:
model.objects.bulk_create(new_items)

Expand Down
2 changes: 1 addition & 1 deletion devel/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ def mismatched_signature(packages):
for package in packages:
bad = False
sig = package.signature
dev_key = known_keys.get(sig.key_id, None)
dev_key = known_keys.get(sig.key_id)
if dev_key:
package.sig_by = dev_key.owner
if dev_key.owner_id != package.packager_id:
Expand Down
76 changes: 38 additions & 38 deletions devel/tests/test_devel.py
Original file line number Diff line number Diff line change
@@ -1,43 +1,43 @@
import pytest
from django.contrib.auth.models import Group, User
from django.test import TransactionTestCase

from devel.models import UserProfile


class DevelView(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)
for name in ['Developers', 'Retired Developers']:
Group.objects.create(name=name)
self.user.groups.add(Group.objects.get(name='Developers'))
self.user.save()
self.profile = UserProfile.objects.create(user=self.user,
public_email=f"{self.user.username}@awesome.com")
self.client.post('/login/', {
'username': self.user.username,
'password': password
})

def tearDown(self):
self.profile.delete()
self.user.delete()
Group.objects.all().delete()

def test_clock(self):
response = self.client.get('/devel/clock/')
self.assertEqual(response.status_code, 200)

def test_profile(self):
response = self.client.get('/devel/profile/')
self.assertEqual(response.status_code, 200)
# Test changing

def test_stats(self):
response = self.client.get('/devel/stats/')
self.assertEqual(response.status_code, 200)
@pytest.fixture
def devel_client(client, arches, repos, package):
password = 'test'
user = User.objects.create_superuser('admin',
'admin@archlinux.org',
password)
for name in ['Developers', 'Retired Developers']:
Group.objects.create(name=name)
user.groups.add(Group.objects.get(name='Developers'))
user.save()
profile = UserProfile.objects.create(user=user,
public_email=f"{user.username}@awesome.com")
client.post('/login/', {
'username': user.username,
'password': password
})

yield client

profile.delete()
user.delete()
Group.objects.all().delete()


def test_clock(devel_client):
response = devel_client.get('/devel/clock/')
assert response.status_code == 200


def test_profile(devel_client):
response = devel_client.get('/devel/profile/')
assert response.status_code == 200


def test_stats(devel_client):
response = devel_client.get('/devel/stats/')
assert response.status_code == 200
51 changes: 25 additions & 26 deletions devel/tests/test_pgp_import.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from unittest.mock import patch

import pytest
from django.core.management import call_command
from django.core.management.base import CommandError
from django.test import TransactionTestCase

CREATED = 1541685162
USER = 'John Doe <jdoe@archlinux.org>'
Expand All @@ -18,28 +18,27 @@
]


class PGPImportTest(TransactionTestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json']

def test_pgp_import_error(self):
with self.assertRaises(CommandError) as e:
call_command('pgp_import')
self.assertIn('keyring_path', str(e.exception))

@patch('devel.management.commands.pgp_import.call_gpg')
def test_pgp_import_garbage_data(self, mock_call_gpg):
mock_call_gpg.return_value = 'barf'
with patch('devel.management.commands.pgp_import.logger') as logger:
call_command('pgp_import', '/tmp')
logger.info.assert_called()
logger.info.assert_any_call('created %d, updated %d signatures', 0, 0)
logger.info.assert_any_call('created %d, updated %d keys', 0, 0)

@patch('devel.management.commands.pgp_import.call_gpg')
def test_pgp_import(self, mock_call_gpg):
mock_call_gpg.return_value = '\n'.join(SIG_DATA)
with patch('devel.management.commands.pgp_import.logger') as logger:
call_command('pgp_import', '/tmp')
logger.info.assert_called()
logger.info.assert_any_call('created %d, updated %d signatures', 0, 0)
logger.info.assert_any_call('created %d, updated %d keys', 1, 0)
def test_pgp_import_error():
with pytest.raises(CommandError) as e:
call_command('pgp_import')
assert 'keyring_path' in str(e)


@patch('devel.management.commands.pgp_import.call_gpg')
def test_pgp_import_garbage_data(mock_call_gpg, arches, repos):
mock_call_gpg.return_value = 'barf'
with patch('devel.management.commands.pgp_import.logger') as logger:
call_command('pgp_import', '/tmp')
logger.info.assert_called()
logger.info.assert_any_call('created %d, updated %d signatures', 0, 0)
logger.info.assert_any_call('created %d, updated %d keys', 0, 0)


@patch('devel.management.commands.pgp_import.call_gpg')
def test_pgp_import(mock_call_gpg, arches, repos):
mock_call_gpg.return_value = '\n'.join(SIG_DATA)
with patch('devel.management.commands.pgp_import.logger') as logger:
call_command('pgp_import', '/tmp')
logger.info.assert_called()
logger.info.assert_any_call('created %d, updated %d signatures', 0, 0)
logger.info.assert_any_call('created %d, updated %d keys', 1, 0)
12 changes: 4 additions & 8 deletions devel/tests/test_rematch_developers.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
from unittest.mock import patch

from django.core.management import call_command
from django.test import TransactionTestCase


class RematchDeveloperTest(TransactionTestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json']

def test_rematch_developers(self):
with patch('devel.management.commands.rematch_developers.logger') as logger:
call_command('rematch_developers')
logger.info.assert_called()
def test_rematch_developers(arches, repos):
with patch('devel.management.commands.rematch_developers.logger') as logger:
call_command('rematch_developers')
logger.info.assert_called()
149 changes: 80 additions & 69 deletions devel/tests/test_reporead.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@
from datetime import datetime, timezone
from unittest.mock import patch

import pytest
from django.core.management import call_command
from django.core.management.base import CommandError
from django.test import TransactionTestCase

from main.models import Arch, Package, Repo
from packages.models import FlagRequest


# Django's TestCase is wrapped in transaction, therefore use TransactionTestCase
class RepoReadTest(TransactionTestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json']
@pytest.fixture
def create_pkg(arches, repos):
packages = []

def create_pkg(self, repo=None, pkgver='4.10.1', pkgrel='1'):
def _create_pkg(repo=None, pkgver='4.10.1', pkgrel='1'):
if not repo:
repo = Repo.objects.get(name__iexact='core')

Expand All @@ -26,67 +26,78 @@ def create_pkg(self, repo=None, pkgver='4.10.1', pkgrel='1'):
compressed_size=10, installed_size=20,
last_update=now, created=now)

def test_invalid_args(self):
with self.assertRaises(CommandError) as e:
call_command('reporead')
self.assertIn('missing arch and file.', str(e.exception))

with self.assertRaises(CommandError) as e:
call_command('reporead', 'x86_64')
self.assertIn('Package database file is required.', str(e.exception))

with self.assertRaises(CommandError) as e:
call_command('reporead', 'x86_64', 'nothing.db.tar.gz')
self.assertIn('Specified package database file does not exist.', str(e.exception))

def test_invalid_arch(self):
with self.assertRaises(CommandError) as e:
call_command('reporead', 'armv64', 'devel/fixtures/core.db.tar.gz')
self.assertEqual('Specified architecture armv64 is not currently known.', str(e.exception))

def test_read_packages(self):
with patch('devel.management.commands.reporead.logger') as logger:
call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')
logger.info.assert_called()

# Verify contents
with tarfile.open('devel/fixtures/core.db.tar.gz') as tar:
files = [name.replace('core.db/', '') for name in tar.getnames()
if name != 'core.db' and 'desc' not in name]

packages = Package.objects.all()
import_packages = [f"{pkg.pkgname}-{pkg.pkgver}-{pkg.pkgrel}" for pkg in packages]
self.assertCountEqual(files, import_packages)

def test_flagoutofdate(self):
pkg = self.create_pkg()
FlagRequest.objects.create(pkgbase=pkg.pkgbase, repo=pkg.repo,
pkgver=pkg.pkgver, epoch=pkg.epoch,
ip_address='1.1.1.1')

with patch('devel.management.commands.reporead.logger') as logger:
call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')
logger.info.assert_called()

self.assertEqual(len(FlagRequest.objects.all()), 0)

def test_flagoutofdate_staging(self):
staging = Repo.objects.get(name__iexact='staging')

pkg = self.create_pkg()
staging_pkg = self.create_pkg(repo=staging, pkgrel='2')

FlagRequest.objects.create(pkgbase=pkg.pkgbase, repo=pkg.repo,
pkgver=pkg.pkgver, epoch=pkg.epoch,
ip_address='1.1.1.1')
FlagRequest.objects.create(pkgbase=staging_pkg.pkgbase, repo=staging_pkg.repo,
pkgver=staging_pkg.pkgver, epoch=staging_pkg.epoch,
ip_address='1.1.1.1')

with patch('devel.management.commands.reporead.logger') as logger:
call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')
logger.info.assert_called()

objects = FlagRequest.objects.all()
self.assertEqual(len(objects), 1)
self.assertEqual(objects[0].pkgver, staging_pkg.pkgver)
yield _create_pkg

for pkg in packages:
pkg.delete()


def test_invalid_arch(arches):
with pytest.raises(CommandError) as exc_info:
call_command('reporead', 'armv64', 'devel/fixtures/core.db.tar.gz')
assert exc_info.value.args[0] == 'Specified architecture armv64 is not currently known.'


def test_invalid_args(arches):
with pytest.raises(CommandError) as exc_info:
call_command('reporead')
assert 'missing arch and file' in str(exc_info)

with pytest.raises(CommandError) as exc_info:
call_command('reporead', 'x86_64')
assert 'Package database file is required' in str(exc_info)

with pytest.raises(CommandError) as exc_info:
call_command('reporead', 'x86_64', 'nothing.db.tar.gz')
assert 'Specified package database file does not exist.' in str(exc_info)


def test_read_packages(transactional_db, arches, repos):
# TODO: use pytest-pacman for generating the database
with patch('devel.management.commands.reporead.logger') as logger:
call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')
logger.info.assert_called()

# Verify contents
with tarfile.open('devel/fixtures/core.db.tar.gz') as tar:
files = [name.replace('core.db/', '') for name in tar.getnames()
if name != 'core.db' and 'desc' not in name]

packages = Package.objects.all()
import_packages = [f"{pkg.pkgname}-{pkg.pkgver}-{pkg.pkgrel}" for pkg in packages]
assert len(files) == len(import_packages)


def test_flagoutofdate(transactional_db, arches, repos, create_pkg):
pkg = create_pkg()
FlagRequest.objects.create(pkgbase=pkg.pkgbase, repo=pkg.repo,
pkgver=pkg.pkgver, epoch=pkg.epoch,
ip_address='1.1.1.1')

with patch('devel.management.commands.reporead.logger') as logger:
call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')
logger.info.assert_called()

assert len(FlagRequest.objects.all()) == 0


def test_flagoutofdate_staging(transactional_db, arches, repos, create_pkg):
staging = Repo.objects.get(name__iexact='staging')

pkg = create_pkg()
staging_pkg = create_pkg(repo=staging, pkgrel='2')

FlagRequest.objects.create(pkgbase=pkg.pkgbase, repo=pkg.repo,
pkgver=pkg.pkgver, epoch=pkg.epoch,
ip_address='1.1.1.1')
FlagRequest.objects.create(pkgbase=staging_pkg.pkgbase, repo=staging_pkg.repo,
pkgver=staging_pkg.pkgver, epoch=staging_pkg.epoch,
ip_address='1.1.1.1')

with patch('devel.management.commands.reporead.logger') as logger:
call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')
logger.info.assert_called()

objects = FlagRequest.objects.all()
assert len(objects) == 1
assert objects[0].pkgver == staging_pkg.pkgver
Loading
Loading