1# -*- encoding: utf8 -*-
2"""Tests for distutils.command.check."""
3import unittest
4from test.test_support import run_unittest
5
6from distutils.command.check import check, HAS_DOCUTILS
7from distutils.tests import support
8from distutils.errors import DistutilsSetupError
9
10class CheckTestCase(support.LoggingSilencer,
11                    support.TempdirManager,
12                    unittest.TestCase):
13
14    def _run(self, metadata=None, **options):
15        if metadata is None:
16            metadata = {}
17        pkg_info, dist = self.create_dist(**metadata)
18        cmd = check(dist)
19        cmd.initialize_options()
20        for name, value in options.items():
21            setattr(cmd, name, value)
22        cmd.ensure_finalized()
23        cmd.run()
24        return cmd
25
26    def test_check_metadata(self):
27        # let's run the command with no metadata at all
28        # by default, check is checking the metadata
29        # should have some warnings
30        cmd = self._run()
31        self.assertEqual(cmd._warnings, 2)
32
33        # now let's add the required fields
34        # and run it again, to make sure we don't get
35        # any warning anymore
36        metadata = {'url': 'xxx', 'author': 'xxx',
37                    'author_email': 'xxx',
38                    'name': 'xxx', 'version': 'xxx'}
39        cmd = self._run(metadata)
40        self.assertEqual(cmd._warnings, 0)
41
42        # now with the strict mode, we should
43        # get an error if there are missing metadata
44        self.assertRaises(DistutilsSetupError, self._run, {}, **{'strict': 1})
45
46        # and of course, no error when all metadata are present
47        cmd = self._run(metadata, strict=1)
48        self.assertEqual(cmd._warnings, 0)
49
50        # now a test with Unicode entries
51        metadata = {'url': u'xxx', 'author': u'\u00c9ric',
52                    'author_email': u'xxx', u'name': 'xxx',
53                    'version': u'xxx',
54                    'description': u'Something about esszet \u00df',
55                    'long_description': u'More things about esszet \u00df'}
56        cmd = self._run(metadata)
57        self.assertEqual(cmd._warnings, 0)
58
59    def test_check_document(self):
60        if not HAS_DOCUTILS: # won't test without docutils
61            return
62        pkg_info, dist = self.create_dist()
63        cmd = check(dist)
64
65        # let's see if it detects broken rest
66        broken_rest = 'title\n===\n\ntest'
67        msgs = cmd._check_rst_data(broken_rest)
68        self.assertEqual(len(msgs), 1)
69
70        # and non-broken rest
71        rest = 'title\n=====\n\ntest'
72        msgs = cmd._check_rst_data(rest)
73        self.assertEqual(len(msgs), 0)
74
75    def test_check_restructuredtext(self):
76        if not HAS_DOCUTILS: # won't test without docutils
77            return
78        # let's see if it detects broken rest in long_description
79        broken_rest = 'title\n===\n\ntest'
80        pkg_info, dist = self.create_dist(long_description=broken_rest)
81        cmd = check(dist)
82        cmd.check_restructuredtext()
83        self.assertEqual(cmd._warnings, 1)
84
85        # let's see if we have an error with strict=1
86        metadata = {'url': 'xxx', 'author': 'xxx',
87                    'author_email': 'xxx',
88                    'name': 'xxx', 'version': 'xxx',
89                    'long_description': broken_rest}
90        self.assertRaises(DistutilsSetupError, self._run, metadata,
91                          **{'strict': 1, 'restructuredtext': 1})
92
93        # and non-broken rest, including a non-ASCII character to test #12114
94        metadata['long_description'] = u'title\n=====\n\ntest \u00df'
95        cmd = self._run(metadata, strict=1, restructuredtext=1)
96        self.assertEqual(cmd._warnings, 0)
97
98    def test_check_all(self):
99
100        metadata = {'url': 'xxx', 'author': 'xxx'}
101        self.assertRaises(DistutilsSetupError, self._run,
102                          {}, **{'strict': 1,
103                                 'restructuredtext': 1})
104
105def test_suite():
106    return unittest.makeSuite(CheckTestCase)
107
108if __name__ == "__main__":
109    run_unittest(test_suite())
110