14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Tests for distutils.command.check."""
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import run_unittest
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.command.check import check, HAS_DOCUTILS
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.tests import support
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.errors import DistutilsSetupError
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass CheckTestCase(support.LoggingSilencer,
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    support.TempdirManager,
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    unittest.TestCase):
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _run(self, metadata=None, **options):
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if metadata is None:
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            metadata = {}
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pkg_info, dist = self.create_dist(**metadata)
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd = check(dist)
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd.initialize_options()
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for name, value in options.items():
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            setattr(cmd, name, value)
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd.ensure_finalized()
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd.run()
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return cmd
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_check_metadata(self):
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # let's run the command with no metadata at all
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # by default, check is checking the metadata
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # should have some warnings
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd = self._run()
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(cmd._warnings, 2)
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # now let's add the required fields
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # and run it again, to make sure we don't get
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # any warning anymore
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        metadata = {'url': 'xxx', 'author': 'xxx',
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'author_email': 'xxx',
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'name': 'xxx', 'version': 'xxx'}
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd = self._run(metadata)
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(cmd._warnings, 0)
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # now with the strict mode, we should
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # get an error if there are missing metadata
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(DistutilsSetupError, self._run, {}, **{'strict': 1})
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # and of course, no error when all metadata are present
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd = self._run(metadata, strict=1)
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(cmd._warnings, 0)
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_check_document(self):
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not HAS_DOCUTILS: # won't test without docutils
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pkg_info, dist = self.create_dist()
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd = check(dist)
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # let's see if it detects broken rest
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        broken_rest = 'title\n===\n\ntest'
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msgs = cmd._check_rst_data(broken_rest)
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(msgs), 1)
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # and non-broken rest
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        rest = 'title\n=====\n\ntest'
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msgs = cmd._check_rst_data(rest)
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(msgs), 0)
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_check_restructuredtext(self):
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not HAS_DOCUTILS: # won't test without docutils
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # let's see if it detects broken rest in long_description
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        broken_rest = 'title\n===\n\ntest'
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pkg_info, dist = self.create_dist(long_description=broken_rest)
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd = check(dist)
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd.check_restructuredtext()
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(cmd._warnings, 1)
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # let's see if we have an error with strict=1
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        metadata = {'url': 'xxx', 'author': 'xxx',
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'author_email': 'xxx',
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'name': 'xxx', 'version': 'xxx',
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    'long_description': broken_rest}
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(DistutilsSetupError, self._run, metadata,
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          **{'strict': 1, 'restructuredtext': 1})
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # and non-broken rest
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        metadata['long_description'] = 'title\n=====\n\ntest'
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cmd = self._run(metadata, strict=1, restructuredtext=1)
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(cmd._warnings, 0)
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_check_all(self):
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        metadata = {'url': 'xxx', 'author': 'xxx'}
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(DistutilsSetupError, self._run,
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          {}, **{'strict': 1,
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 'restructuredtext': 1})
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_suite():
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return unittest.makeSuite(CheckTestCase)
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__":
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    run_unittest(test_suite())
100