File: test_plugin.py

package info (click to toggle)
doit 0.36.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,704 kB
  • sloc: python: 11,863; makefile: 33; ansic: 14; javascript: 3; sh: 1
file content (85 lines) | stat: -rw-r--r-- 2,889 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
import sys
from unittest.mock import Mock

import pytest

from doit.plugin import PluginEntry, PluginDict


if sys.version_info < (3, 10):
    from importlib_metadata import EntryPoint
else:
    from importlib.metadata import EntryPoint


class TestPluginEntry(object):
    def test_repr(self):
        plugin = PluginEntry('category1', 'name1', 'mock:Mock')
        assert "PluginEntry('category1', 'name1', 'mock:Mock')" == repr(plugin)

    def test_get(self):
        plugin = PluginEntry('category1', 'name1', 'unittest.mock:Mock')
        got = plugin.get()
        assert got is Mock

    def test_load_error_module_not_found(self):
        plugin = PluginEntry('category1', 'name1', 'i_dont:exist')
        with pytest.raises(Exception) as exc_info:
            plugin.load()
        assert 'Plugin category1 module `i_dont`' in str(exc_info.value)

    def test_load_error_obj_not_found(self):
        plugin = PluginEntry('category1', 'name1',
                             'unittest.mock:i_dont_exist')
        with pytest.raises(Exception) as exc_info:
            plugin.load()
        assert ('Plugin category1:name1 module `unittest.mock`' in
                str(exc_info.value))
        assert 'i_dont_exist' in str(exc_info.value)


class TestPluginDict(object):

    @pytest.fixture
    def plugins(self):
        plugins = PluginDict()
        config_dict = {'name1': 'pytest:raises',
                       'name2': 'unittest.mock:Mock'}
        plugins.add_plugins({'category1': config_dict}, 'category1')
        return plugins

    def test_add_plugins_from_dict(self, plugins):
        assert len(plugins) == 2
        name1 = plugins['name1']
        assert isinstance(name1, PluginEntry)
        assert name1.category == 'category1'
        assert name1.name == 'name1'
        assert name1.location == 'pytest:raises'

    def test_add_plugins_from_pkg_resources(self, monkeypatch):
        # mock entry points
        from doit import plugin
        def fake_entries(group):
            yield EntryPoint(name='name1', value='pytest:raises', group=group)
        monkeypatch.setattr(plugin, 'entry_points_impl', lambda: fake_entries)

        plugins = PluginDict()
        plugins.add_plugins({}, 'category2')
        name1 = plugins['name1']
        assert isinstance(name1, PluginEntry)
        assert name1.category == 'category2'
        assert name1.name == 'name1'
        assert name1.location == 'pytest:raises'

    def test_get_plugin_actual_plugin(self, plugins):
        assert plugins.get_plugin('name2') is Mock

    def test_get_plugin_not_a_plugin(self, plugins):
        my_val = 4
        plugins['builtin-item'] = my_val
        assert plugins.get_plugin('builtin-item') is my_val

    def test_to_dict(self, plugins):
        expected = {'name1': pytest.raises,
                    'name2': Mock}
        assert plugins.to_dict() == expected