| 
2 | 2 | from unittest.mock import patch  | 
3 | 3 | from datetime import datetime  | 
4 | 4 | 
 
  | 
 | 5 | +import pytest  | 
5 | 6 | 
 
  | 
6 | 7 | from django.core.management import call_command  | 
7 | 8 | from django.core.management.base import CommandError  | 
8 |  | -from django.test import TransactionTestCase  | 
9 | 9 | from django.utils import timezone  | 
10 | 10 | 
 
  | 
11 | 11 | 
 
  | 
12 | 12 | from main.models import Arch, Package, Repo  | 
13 | 13 | from packages.models import FlagRequest  | 
14 | 14 | 
 
  | 
15 | 15 | 
 
  | 
16 |  | -# Django's TestCase is wrapped in transaction, therefore use TransactionTestCase  | 
17 |  | -class RepoReadTest(TransactionTestCase):  | 
18 |  | -    fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json']  | 
 | 16 | +@pytest.fixture  | 
 | 17 | +def create_pkg(arches, repos):  | 
 | 18 | +    packages = []  | 
19 | 19 | 
 
  | 
20 |  | -    def create_pkg(self, repo=None, pkgver='4.10.1', pkgrel='1'):  | 
 | 20 | +    def _create_pkg(repo=None, pkgver='4.10.1', pkgrel='1'):  | 
21 | 21 |         if not repo:  | 
22 | 22 |             repo = Repo.objects.get(name__iexact='core')  | 
23 | 23 | 
 
  | 
24 | 24 |         arch = Arch.objects.get(name__iexact='any')  | 
25 | 25 |         now = datetime.now(tz=timezone.utc)  | 
26 |  | -        return Package.objects.create(arch=arch, repo=repo, pkgname='systemd',  | 
27 |  | -                                     pkgbase='systemd', pkgver=pkgver,  | 
28 |  | -                                     pkgrel=pkgrel, pkgdesc='Linux kernel',  | 
29 |  | -                                     compressed_size=10, installed_size=20,  | 
30 |  | -                                     last_update=now, created=now)  | 
31 |  | - | 
32 |  | -    def test_invalid_args(self):  | 
33 |  | -        with self.assertRaises(CommandError) as e:  | 
34 |  | -            call_command('reporead')  | 
35 |  | -        self.assertIn('missing arch and file.', str(e.exception))  | 
36 |  | - | 
37 |  | -        with self.assertRaises(CommandError) as e:  | 
38 |  | -            call_command('reporead', 'x86_64')  | 
39 |  | -        self.assertIn('Package database file is required.', str(e.exception))  | 
40 |  | - | 
41 |  | -        with self.assertRaises(CommandError) as e:  | 
42 |  | -            call_command('reporead', 'x86_64', 'nothing.db.tar.gz')  | 
43 |  | -        self.assertIn('Specified package database file does not exist.', str(e.exception))  | 
44 |  | -      | 
45 |  | -    def test_invalid_arch(self):  | 
46 |  | -        with self.assertRaises(CommandError) as e:  | 
47 |  | -            call_command('reporead', 'armv64', 'devel/fixtures/core.db.tar.gz')  | 
48 |  | -        self.assertEqual('Specified architecture armv64 is not currently known.', str(e.exception))  | 
49 |  | -      | 
50 |  | -    def test_read_packages(self):  | 
51 |  | -        with patch('devel.management.commands.reporead.logger') as logger:  | 
52 |  | -            call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')  | 
53 |  | -        logger.info.assert_called()  | 
54 |  | - | 
55 |  | -        # Verify contents  | 
56 |  | -        with tarfile.open('devel/fixtures/core.db.tar.gz') as tar:  | 
57 |  | -            files = [name.replace('core.db/', '') for name in tar.getnames() if name != 'core.db' and not 'desc' in name]  | 
58 |  | - | 
59 |  | -        packages = Package.objects.all()  | 
60 |  | -        import_packages = ["{}-{}-{}".format(pkg.pkgname, pkg.pkgver, pkg.pkgrel) for pkg in packages]  | 
61 |  | -        self.assertCountEqual(files, import_packages)  | 
62 |  | - | 
63 |  | -    def test_flagoutofdate(self):  | 
64 |  | -        pkg = self.create_pkg()  | 
65 |  | -        FlagRequest.objects.create(pkgbase=pkg.pkgbase, repo=pkg.repo,  | 
66 |  | -                                   pkgver=pkg.pkgver, epoch=pkg.epoch,  | 
67 |  | -                                   ip_address='1.1.1.1')  | 
68 |  | - | 
69 |  | -        with patch('devel.management.commands.reporead.logger') as logger:  | 
70 |  | -            call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')  | 
71 |  | -        logger.info.assert_called()  | 
72 |  | - | 
73 |  | -        self.assertEqual(len(FlagRequest.objects.all()), 0)  | 
74 |  | - | 
75 |  | -    def test_flagoutofdate_staging(self):  | 
76 |  | -        staging = Repo.objects.get(name__iexact='staging')  | 
77 |  | - | 
78 |  | -        pkg = self.create_pkg()  | 
79 |  | -        staging_pkg = self.create_pkg(repo=staging, pkgrel='2')  | 
80 |  | - | 
81 |  | -        FlagRequest.objects.create(pkgbase=pkg.pkgbase, repo=pkg.repo,  | 
82 |  | -                                   pkgver=pkg.pkgver, epoch=pkg.epoch,  | 
83 |  | -                                   ip_address='1.1.1.1')  | 
84 |  | -        FlagRequest.objects.create(pkgbase=staging_pkg.pkgbase, repo=staging_pkg.repo,  | 
85 |  | -                                   pkgver=staging_pkg.pkgver, epoch=staging_pkg.epoch,  | 
86 |  | -                                   ip_address='1.1.1.1')  | 
87 |  | - | 
88 |  | -        with patch('devel.management.commands.reporead.logger') as logger:  | 
89 |  | -            call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')  | 
90 |  | -        logger.info.assert_called()  | 
91 |  | - | 
92 |  | -        objects =  FlagRequest.objects.all()  | 
93 |  | -        self.assertEqual(len(objects), 1)  | 
94 |  | -        self.assertEqual(objects[0].pkgver, staging_pkg.pkgver)  | 
 | 26 | +        package = Package.objects.create(arch=arch, repo=repo, pkgname='systemd',  | 
 | 27 | +                                         pkgbase='systemd', pkgver=pkgver,  | 
 | 28 | +                                         pkgrel=pkgrel, pkgdesc='Linux kernel',  | 
 | 29 | +                                         compressed_size=10, installed_size=20,  | 
 | 30 | +                                         last_update=now, created=now)  | 
 | 31 | +        packages.append(package)  | 
 | 32 | +        return package  | 
 | 33 | + | 
 | 34 | +    yield _create_pkg  | 
 | 35 | + | 
 | 36 | +    for package in packages:  | 
 | 37 | +        package.delete()  | 
 | 38 | + | 
 | 39 | + | 
 | 40 | +def test_invalid_args():  | 
 | 41 | +    with pytest.raises(CommandError) as excinfo:  | 
 | 42 | +        call_command('reporead')  | 
 | 43 | +    assert 'missing arch and file.' in str(excinfo)  | 
 | 44 | + | 
 | 45 | +    with pytest.raises(CommandError) as excinfo:  | 
 | 46 | +        call_command('reporead', 'x86_64')  | 
 | 47 | +    assert 'Package database file is required.' in str(excinfo)  | 
 | 48 | + | 
 | 49 | +    with pytest.raises(CommandError) as excinfo:  | 
 | 50 | +        call_command('reporead', 'x86_64', 'nothing.db.tar.gz')  | 
 | 51 | +    assert 'Specified package database file does not exist.' in str(excinfo)  | 
 | 52 | + | 
 | 53 | + | 
 | 54 | +def test_invalid_arch(transactional_db, arches, repos):  | 
 | 55 | +    with pytest.raises(CommandError) as excinfo:  | 
 | 56 | +        call_command('reporead', 'armv64', 'devel/fixtures/core.db.tar.gz')  | 
 | 57 | +    assert 'Specified architecture armv64 is not currently known.' in str(excinfo)  | 
 | 58 | + | 
 | 59 | + | 
 | 60 | +# TODO: create pacman repo db with a pytest fixture  | 
 | 61 | +def test_read_packages(transactional_db, arches, repos):  | 
 | 62 | +    with patch('devel.management.commands.reporead.logger') as logger:  | 
 | 63 | +        call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')  | 
 | 64 | +    logger.info.assert_called()  | 
 | 65 | + | 
 | 66 | +    # Verify contents  | 
 | 67 | +    with tarfile.open('devel/fixtures/core.db.tar.gz') as tar:  | 
 | 68 | +        files = [name.replace('core.db/', '') for name in tar.getnames() if name != 'core.db' and not 'desc' in name]  | 
 | 69 | + | 
 | 70 | +    packages = Package.objects.all()  | 
 | 71 | +    import_packages = ["{}-{}-{}".format(pkg.pkgname, pkg.pkgver, pkg.pkgrel) for pkg in packages]  | 
 | 72 | +    assert len(files) == len(import_packages)  | 
 | 73 | + | 
 | 74 | + | 
 | 75 | +def test_flagoutofdate(transactional_db, create_pkg):  | 
 | 76 | +    pkg = create_pkg()  | 
 | 77 | +    FlagRequest.objects.create(pkgbase=pkg.pkgbase, repo=pkg.repo,  | 
 | 78 | +                               pkgver=pkg.pkgver, epoch=pkg.epoch,  | 
 | 79 | +                               ip_address='1.1.1.1')  | 
 | 80 | + | 
 | 81 | +    with patch('devel.management.commands.reporead.logger') as logger:  | 
 | 82 | +        call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')  | 
 | 83 | +    logger.info.assert_called()  | 
 | 84 | + | 
 | 85 | +    assert not len(FlagRequest.objects.all())  | 
 | 86 | + | 
 | 87 | + | 
 | 88 | +def test_flagoutofdate_staging(transactional_db, create_pkg):  | 
 | 89 | +    staging = Repo.objects.get(name__iexact='staging')  | 
 | 90 | + | 
 | 91 | +    pkg = create_pkg()  | 
 | 92 | +    staging_pkg = create_pkg(repo=staging, pkgrel='2')  | 
 | 93 | + | 
 | 94 | +    FlagRequest.objects.create(pkgbase=pkg.pkgbase, repo=pkg.repo,  | 
 | 95 | +                               pkgver=pkg.pkgver, epoch=pkg.epoch,  | 
 | 96 | +                               ip_address='1.1.1.1')  | 
 | 97 | +    FlagRequest.objects.create(pkgbase=staging_pkg.pkgbase, repo=staging_pkg.repo,  | 
 | 98 | +                               pkgver=staging_pkg.pkgver, epoch=staging_pkg.epoch,  | 
 | 99 | +                               ip_address='1.1.1.1')  | 
 | 100 | + | 
 | 101 | +    with patch('devel.management.commands.reporead.logger') as logger:  | 
 | 102 | +        call_command('reporead', 'x86_64', 'devel/fixtures/core.db.tar.gz')  | 
 | 103 | +    logger.info.assert_called()  | 
 | 104 | + | 
 | 105 | +    objects = FlagRequest.objects.all()  | 
 | 106 | +    assert len(objects) == 1  | 
 | 107 | +    assert objects[0].pkgver == staging_pkg.pkgver  | 
0 commit comments