File: test_versionscanner.py

package info (click to toggle)
python-sphinx-chango 0.6.0-1
  • links: PTS
  • area: main
  • in suites: sid
  • size: 1,840 kB
  • sloc: python: 4,909; javascript: 74; makefile: 23
file content (91 lines) | stat: -rw-r--r-- 3,414 bytes parent folder | download | duplicates (2)
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
#  SPDX-FileCopyrightText: 2024-present Hinrich Mahler <chango@mahlerhome.de>
#
#  SPDX-License-Identifier: MIT
import datetime as dtm

import pytest

from chango import Version
from chango.abc import VersionScanner
from chango.concrete import DirectoryVersionScanner
from chango.error import ChanGoError
from tests.auxil.files import data_path


@pytest.fixture
def scanner(monkeypatch) -> DirectoryVersionScanner:
    # DVS overrides get_version, but we want to test the base implementation
    monkeypatch.setattr(DirectoryVersionScanner, "get_version", VersionScanner.get_version)
    return DirectoryVersionScanner(TestVersionScanner.DATA_ROOT, "unreleased")


@pytest.fixture
def scanner_no_unreleased(monkeypatch) -> DirectoryVersionScanner:
    # DVS overrides get_version, but we want to test the base implementation
    monkeypatch.setattr(DirectoryVersionScanner, "get_version", VersionScanner.get_version)
    return DirectoryVersionScanner(TestVersionScanner.DATA_ROOT, "no-unreleased")


class TestVersionScanner:
    """Since VersionScanner is an abstract base class, we are testing with DirectoryVersionScanner
    as a simple implementation.

    Note that we do *not* test abstract methods, as that is the responsibility of the concrete
    implementations.
    """

    DATA_ROOT = data_path("directoryversionscanner")

    @pytest.mark.parametrize(
        ("version", "expected"),
        [
            ("1.1", True),
            (Version("1.1", dtm.date(2024, 1, 1)), True),
            (Version("1.1", dtm.date(2024, 5, 1)), False),
            ("1.2", True),
            (Version("1.2", dtm.date(2024, 1, 2)), True),
            (Version("1.2", dtm.date(2024, 5, 1)), False),
            ("1.3", True),
            (Version("1.3", dtm.date(2024, 1, 3)), True),
            (Version("1.3", dtm.date(2024, 5, 1)), False),
            ("1.3.1", True),
            (Version("1.3.1", dtm.date(2024, 1, 3)), True),
            (Version("1.3.1", dtm.date(2024, 5, 1)), False),
            (None, True),
            ("1.4", False),
            ("1.0", False),
            (object(), False),
            (dtm.date(2024, 1, 1), False),
        ],
    )
    def test_contains(self, scanner, version, expected):
        assert (version in scanner) == expected

    def test_contains_no_unreleased_changes(self, scanner_no_unreleased):
        assert None not in scanner_no_unreleased

    def test_iter(self, scanner):
        assert set(scanner) == {
            Version("1.1", dtm.date(2024, 1, 1)),
            Version("1.2", dtm.date(2024, 1, 2)),
            Version("1.3", dtm.date(2024, 1, 3)),
            Version("1.3.1", dtm.date(2024, 1, 3)),
        }

    def test_len(self, scanner):
        assert len(scanner) == len(scanner.get_available_versions())

    @pytest.mark.parametrize("idx", [1, 2, 3])
    def test_get_version(self, scanner, idx):
        version = scanner.get_version(f"1.{idx}")
        assert version.uid == f"1.{idx}"
        assert version.date == dtm.date(2024, 1, idx)

    def test_get_version_not_found(self, scanner):
        with pytest.raises(ChanGoError, match="not available"):
            scanner.get_version("1.4")

    def test_invalidates_caches(self, scanner):
        # This does nothing, but we want to test that it doesn't raise an error
        scanner.invalidate_caches = VersionScanner.invalidate_caches
        scanner.invalidate_caches(scanner)