File: test_signals.py

package info (click to toggle)
pdm 2.20.1%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 2,988 kB
  • sloc: python: 24,413; javascript: 34; makefile: 11
file content (111 lines) | stat: -rw-r--r-- 5,313 bytes parent folder | download | duplicates (3)
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
from itertools import chain
from unittest import mock

import pytest

from pdm import signals
from pdm.models.candidates import Candidate
from pdm.models.repositories import Package
from pdm.models.requirements import Requirement


def test_post_init_signal(project_no_init, pdm):
    mock_handler = mock.Mock()
    with signals.post_init.connected_to(mock_handler):
        result = pdm(["init"], input="\n\n\n\n\n\n\n\n", obj=project_no_init)
        assert result.exit_code == 0
    mock_handler.assert_called_once_with(project_no_init, hooks=mock.ANY)


@pytest.mark.usefixtures("working_set")
def test_post_lock_and_install_signals(project, pdm):
    pre_lock = signals.pre_lock.connect(mock.Mock(), weak=False)
    post_lock = signals.post_lock.connect(mock.Mock(), weak=False)
    pre_install = signals.pre_install.connect(mock.Mock(), weak=False)
    post_install = signals.post_install.connect(mock.Mock(), weak=False)
    pdm(["add", "requests"], obj=project, strict=True)
    signals.pre_lock.disconnect(pre_lock)
    signals.post_lock.disconnect(post_lock)
    signals.pre_install.disconnect(pre_install)
    signals.post_install.disconnect(post_install)
    for mocker in (pre_lock, post_lock, pre_install, post_install):
        mocker.assert_called_once()


@pytest.mark.usefixtures("working_set")
def test_lock_and_install_signals_injection_with_add(project, pdm):
    pre_lock = signals.pre_lock.connect(mock.Mock(), weak=False)
    post_lock = signals.post_lock.connect(mock.Mock(), weak=False)
    pre_install = signals.pre_install.connect(mock.Mock(), weak=False)
    post_install = signals.post_install.connect(mock.Mock(), weak=False)
    pdm(["add", "requests"], obj=project, strict=True)
    signals.pre_lock.disconnect(pre_lock)
    signals.post_lock.disconnect(post_lock)
    signals.pre_install.disconnect(pre_install)
    signals.post_install.disconnect(post_install)

    assert isinstance(pre_lock.call_args.kwargs["requirements"], list)
    assert all(isinstance(e, Requirement) for e in pre_lock.call_args.kwargs["requirements"])
    assert len(pre_lock.call_args.kwargs["requirements"]) == 1

    assert isinstance(post_lock.call_args.kwargs["resolution"], dict)
    assert all(isinstance(e, Candidate) for e in chain.from_iterable(post_lock.call_args.kwargs["resolution"].values()))
    assert len(post_lock.call_args.kwargs["resolution"]) == 5

    assert isinstance(pre_install.call_args.kwargs["packages"], list)
    assert all(isinstance(e, Package) for e in pre_install.call_args.kwargs["packages"])
    assert len(pre_install.call_args.kwargs["packages"]) == 5

    assert isinstance(post_install.call_args.kwargs["packages"], list)
    assert all(isinstance(e, Package) for e in post_install.call_args.kwargs["packages"])
    assert len(post_install.call_args.kwargs["packages"]) == 5


@pytest.mark.usefixtures("working_set")
def test_lock_and_install_signals_injection_with_install(project, pdm):
    project.add_dependencies(["requests"])

    pre_lock = signals.pre_lock.connect(mock.Mock(), weak=False)
    post_lock = signals.post_lock.connect(mock.Mock(), weak=False)
    pre_install = signals.pre_install.connect(mock.Mock(), weak=False)
    post_install = signals.post_install.connect(mock.Mock(), weak=False)
    pdm(["install"], obj=project, strict=True)
    signals.pre_lock.disconnect(pre_lock)
    signals.post_lock.disconnect(post_lock)
    signals.pre_install.disconnect(pre_install)
    signals.post_install.disconnect(post_install)

    assert isinstance(pre_lock.call_args.kwargs["requirements"], list)
    assert all(isinstance(e, Requirement) for e in pre_lock.call_args.kwargs["requirements"])
    assert len(pre_lock.call_args.kwargs["requirements"]) == 1

    assert isinstance(post_lock.call_args.kwargs["resolution"], dict)
    assert all(isinstance(e, Candidate) for e in chain.from_iterable(post_lock.call_args.kwargs["resolution"].values()))
    assert len(post_lock.call_args.kwargs["resolution"]) == 5

    assert isinstance(pre_install.call_args.kwargs["packages"], list)
    assert all(isinstance(e, Package) for e in pre_install.call_args.kwargs["packages"])
    assert len(pre_install.call_args.kwargs["packages"]) == 5

    assert isinstance(post_install.call_args.kwargs["packages"], list)
    assert all(isinstance(e, Package) for e in post_install.call_args.kwargs["packages"])
    assert len(post_install.call_args.kwargs["packages"]) == 5


@pytest.mark.usefixtures("working_set")
def test_lock_signals_injection_with_update(project, pdm):
    project.add_dependencies(["requests"])

    pre_lock = signals.pre_lock.connect(mock.Mock(), weak=False)
    post_lock = signals.post_lock.connect(mock.Mock(), weak=False)
    pdm(["update"], obj=project, strict=True)
    signals.pre_lock.disconnect(pre_lock)
    signals.post_lock.disconnect(post_lock)

    assert isinstance(pre_lock.call_args.kwargs["requirements"], list)
    assert all(isinstance(e, Requirement) for e in pre_lock.call_args.kwargs["requirements"])
    assert len(pre_lock.call_args.kwargs["requirements"]) == 1

    assert isinstance(post_lock.call_args.kwargs["resolution"], dict)
    assert all(isinstance(e, Candidate) for e in chain.from_iterable(post_lock.call_args.kwargs["resolution"].values()))
    assert len(post_lock.call_args.kwargs["resolution"]) == 5