summaryrefslogtreecommitdiffstats
path: root/devel/tests/test_reporead.py
blob: 5e92dd5638b670effc5cd8e84cfb361c359358e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import tarfile
from unittest.mock import patch
from datetime import datetime


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

    def create_pkg(self, 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 'desc' not 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)