File: test_seen_db.py

package info (click to toggle)
apt-listchanges 4.8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,336 kB
  • sloc: python: 3,477; xml: 693; makefile: 167; sh: 71; perl: 61
file content (144 lines) | stat: -rw-r--r-- 5,133 bytes parent folder | download
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# pylint: disable=protected-access

import os
import re
import tempfile
import time

import pytest

from apt_listchanges.ALCSeenDb import DbError, SeenDb
from apt_listchanges.DebianFiles import ChangelogEntry


def test_corrupt_db():
    with pytest.raises(DbError):
        SeenDb('/dev/null')


def test_read_write_db():
    with tempfile.NamedTemporaryFile(prefix='test_read_write_db') as file_obj:
        os.unlink(file_obj.name)
        seen_db = SeenDb(file_obj.name)
        entry = ChangelogEntry('foo (1.0-1) unstable; urgency=low',
                               '/usr/share/doc/foo/changelog.Debian.gz',
                               'foo', 'foo', '1.0-1', 'low')
        entry.add_content('  Here is some content.\n')
        entry.set_trailer(' -- Nice Guy <example@example.com> '
                          'Thu, 01 Jan 1970 00:00:00 -0000\n')
        seen_db.add(entry)
        seen_db.apply_changes()
        seen_db = SeenDb(file_obj.name)
        assert seen_db.seen_here(entry)
        os.unlink(f'{file_obj.name}-old')


def test_no_source():
    seen_db = SeenDb()
    entry = ChangelogEntry('foo (1.0-1) unstable; urgency=low',
                           '/usr/share/doc/foo/changelog.Debian.gz',
                           'foo', 'foo', '1.0-1', 'low')
    entry.add_content('  Here is some content.\n')
    entry.set_trailer(' -- Nice Guy <example@example.com> '
                      'Thu, 01 Jan 1970 00:00:00 -0000\n')
    assert not seen_db.seen_anywhere(entry, exact=False)


def test_dump(capsys):
    seen_db = SeenDb()
    entry = ChangelogEntry('foo (1.0-1) unstable; urgency=low',
                           '/usr/share/doc/foo/changelog.Debian.gz',
                           'foo', 'foo', '1.0-1', 'low')
    entry.add_content('  Here is some content.\n')
    entry.set_trailer(' -- Nice Guy <example@example.com> '
                      'Thu, 01 Jan 1970 00:00:00 -0000\n')
    seen_db.add(entry)
    seen_db.dump()
    captured = capsys.readouterr()
    print("DUMP OUTPUT:")
    print(captured.out)
    assert re.search(r'packages:\n  foo \d+ \(\d+-\d+-\d+\)\n', captured.out)
    assert re.search(r'exact checksums:\n'
                     r'  /usr/share/doc/foo/changelog\.Debian\.gz:\n'
                     r'    \S+ \d+ \(\d+-\d+-\d+\)\n', captured.out)
    assert re.search(r'similar checksums:\n'
                     r'  /usr/share/doc/foo/changelog.Debian.gz:\n'
                     r'    \S+ \d+ \(\d+-\d+-\d+\)\n', captured.out)


def replace_timestamp(d, timestamp):
    for key, value in d.items():
        if isinstance(value, dict):
            replace_timestamp(value, timestamp)
        else:
            d[key] = timestamp


def test_expire_old():
    seen_db = SeenDb()
    seen_db.add_package('foo')
    entry = ChangelogEntry('foo (1.0-1) unstable; urgency=low',
                           '/usr/share/doc/foo/changelog.Debian.gz',
                           'foo', 'foo', '1.0-1', 'low')
    entry.add_content('  Here is some content.\n')
    entry.set_trailer(' -- Nice Guy <example@example.com> '
                      'Thu, 01 Jan 1970 00:00:00 -0000\n')
    seen_db.add(entry)
    # Gotta muck around inside the seen DB for this test, alas.
    old = time.time() - 365 * 4
    replace_timestamp(seen_db._d.similar, old)
    replace_timestamp(seen_db._d.exact, old)
    replace_timestamp(seen_db._d.packages, old)
    assert (seen_db.has_package('foo') and
            seen_db.seen_anywhere(entry) and
            seen_db.seen_anywhere(entry, exact=False))
    seen_db._expire_old()
    assert not (seen_db.has_package('foo') or
                seen_db.seen_anywhere(entry) or
                seen_db.seen_anywhere(entry, exact=False))


def test_initial_save():
    with tempfile.NamedTemporaryFile(prefix='test_initial_save') as f:
        os.unlink(f.name)
        seen_db = SeenDb(f.name)
        seen_db.add_package('foo')
        seen_db.apply_changes()
        os.unlink(f'{f.name}-old')


def test_update_preserves_changes():
    with tempfile.NamedTemporaryFile(prefix='test_update_preserves_changes') \
         as f:
        os.unlink(f.name)
        seen_db = SeenDb(f.name)
        seen_db.add_package('foo')
        seen_db.apply_changes()
        seen_db = SeenDb(f.name)
        seen_db.add_package('bar')
        seen_db.apply_changes()
        os.unlink(f'{f.name}-old')
        seen_db = SeenDb(f.name)
        assert seen_db.has_package('foo')
        assert seen_db.has_package('bar')


def test_save_as():
    with tempfile.NamedTemporaryFile(prefix='test_save_as1') as f1, \
         tempfile.NamedTemporaryFile(prefix='test_save_as2') as f2:
        os.unlink(f1.name)
        os.unlink(f2.name)
        seen_db = SeenDb(f1.name)
        seen_db.add_package('foo')
        seen_db.apply_changes()
        os.unlink(f'{f1.name}-old')
        seen_db.add_package('bar')
        seen_db.save_as(f2.name)

        seen_db = SeenDb(f1.name)
        assert seen_db.has_package('foo')
        assert not seen_db.has_package('bar')

        seen_db = SeenDb(f2.name)
        assert seen_db.has_package('foo')
        assert seen_db.has_package('bar')