Skip to content

Commit

Permalink
Port remainder to pytest
Browse files Browse the repository at this point in the history
  • Loading branch information
jelly committed May 23, 2020
1 parent 8b21e12 commit 3d4827c
Show file tree
Hide file tree
Showing 10 changed files with 391 additions and 377 deletions.
30 changes: 14 additions & 16 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,9 @@ def repos(db):


@pytest.fixture
def package(db):
# TODO(jelle): create own parameter based version
from main.models import Package
print(list(Package.objects.all()))
def package(db, arches, repos):
# TODO: convert to create_package with standard parameters
call_command('loaddata', 'main/fixtures/package.json')
print(list(Package.objects.all()))


@pytest.fixture
Expand All @@ -41,22 +38,23 @@ def staff_groups(db):
call_command('loaddata', 'devel/fixtures/staff_groups.json')


# TODO: test with non-admin user fixture
@pytest.fixture
def admin_user_profile(admin_user, arches, repos):
profile = UserProfile.objects.create(user=admin_user,
public_email="public@archlinux.org")
def user(django_user_model):
user = django_user_model.objects.create_user(username=USERNAME, password=USERNAME)
yield user
user.delete()


@pytest.fixture
def userprofile(user):
profile = UserProfile.objects.create(user=user,
public_email=f'{user.username}@archlinux.org')
yield profile
profile.delete()


@pytest.fixture
def user_client(client, django_user_model, groups):
user = django_user_model.objects.create_user(username=USERNAME, password=USERNAME)
profile = UserProfile.objects.create(user=user,
public_email="{}@archlinux.org".format(user.username))
def user_client(client, user, userprofile, groups):
user.groups.add(Group.objects.get(name='Developers'))
client.login(username=USERNAME, password=USERNAME)
yield client
profile.delete()
user.delete()
return client
48 changes: 10 additions & 38 deletions devel/tests/test_devel.py
Original file line number Diff line number Diff line change
@@ -1,42 +1,14 @@
from django.test import TransactionTestCase
from django.contrib.auth.models import User, Group
from devel.models import UserProfile
def test_clock(user_client):
response = user_client.get('/devel/clock/')
assert response.status_code == 200


class DevelView(TransactionTestCase):
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
'main/fixtures/package.json']
def test_profile(user_client):
response = user_client.get('/devel/profile/')
assert response.status_code == 200
# Test changing

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="{}@awesome.com".format(self.user.username))
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)
def test_stats(user_client):
response = user_client.get('/devel/stats/')
assert response.status_code == 200
161 changes: 87 additions & 74 deletions devel/tests/test_reporead.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,93 +2,106 @@
from unittest.mock import patch
from datetime import datetime

import pytest

from django.core.management import call_command
from django.core.management.base import CommandError
from django.test import TransactionTestCase
from django.utils import timezone


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')

arch = Arch.objects.get(name__iexact='any')
now = datetime.now(tz=timezone.utc)
return Package.objects.create(arch=arch, repo=repo, pkgname='systemd',
pkgbase='systemd', pkgver=pkgver,
pkgrel=pkgrel, pkgdesc='Linux kernel',
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 not 'desc' in name]

packages = Package.objects.all()
import_packages = ["{}-{}-{}".format(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)
package = Package.objects.create(arch=arch, repo=repo, pkgname='systemd',
pkgbase='systemd', pkgver=pkgver,
pkgrel=pkgrel, pkgdesc='Linux kernel',
compressed_size=10, installed_size=20,
last_update=now, created=now)
packages.append(package)
return package

yield _create_pkg

for package in packages:
package.delete()


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

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

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


def test_invalid_arch(transactional_db, arches, repos):
with pytest.raises(CommandError) as excinfo:
call_command('reporead', 'armv64', 'devel/fixtures/core.db.tar.gz')
assert 'Specified architecture armv64 is not currently known.' in str(excinfo)


# TODO: create pacman repo db with a pytest fixture
def test_read_packages(transactional_db, arches, repos):
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 not 'desc' in name]

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


def test_flagoutofdate(transactional_db, 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 not len(FlagRequest.objects.all())


def test_flagoutofdate_staging(transactional_db, 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

0 comments on commit 3d4827c

Please sign in to comment.