from link_fixer import Link import logging import os from pathlib import Path from shutil import rmtree import sys import tarfile import unittest import warnings logger = logging.getLogger('linkfixer') logging.basicConfig( format = '%(asctime)s %(module)s %(levelname)s: %(message)s', level=logging.DEBUG, stream = sys.stdout ) class TestLinkFixer(unittest.TestCase): tgt_dir = "test/data/tgt_dir" lnk_dir = "test/data/lnk_dir" tgt_file = "test/data/tgt_dir/tgt_file.txt" ln_non_exists = "test/data/link.txt" ln_valid = "test/data/lnk_dir/ln_valid" ln_valid_path = "../tgt_dir/tgt_file.txt" ln_broken = "test/data/lnk_dir/tgt_file.txt" ln_broken_path = "../tgt/tgt_.txt" ln_no_target = "test/data/lnk_dir/ln_no_target" tgt_invalid = "test/data/tgt" inexistent = "test/data/tgt_dir/inexistent.txt" ln_ne_error = "Error: could not access link test/data/link.txt" ln_gd_error = "Error: link test/data/lnk_dr/ln_valid is not broken. Abort." ln_ns_error = "Error: link test/data/tgt_dir/tgt_file.txt is not a link at all. Abort." tgt_invalid_error = "Error: target dir test/data/tgt does not seem to exist or be a directory. Abort." ln_no_target_warning = "link_fix aborted." def setup_test(self): try: rmtree("test/data") except Exception: sys.exit("Error: couldn't reset test data directory! Cancelling test!") with tarfile.open("test/test_data.tar", "r:*") as tar: tar.extraction_filter = getattr(tarfile, 'data_filter') tar.extractall("test") def test_non_existing_link(self): self.setup_test() #print("Test for inexistent link") with self.assertRaises(SystemExit) as err: Link.fix(self.ln_non_exists, self.tgt_dir) self.assertEqual(err.exception_code, self.ln_ne_error) def test_non_broken_link(self): self.setup_test() #print("Test for non-broken link") with self.assertRaises(SystemExit) as err: Link.fix(self.ln_valid, self.tgt_dir) self.assertEqual(err.exception.code, self.ln_gd_error) def test_not_a_link(self): self.setup_test() #print("Test for non-link link") with self.assertRaises(SystemExit) as err: Link.fix(self.tgt_file, self.tgt_dir) self.assertEqual(err.exception.code, self.ln_ns_error) def test_invalid_target(self): self.setup_test() #print("Test for invalid target") with self.assertRaises(SystemExit) as err: Link.fix(self.ln_valid, self.tgt_invalid) self.assertEqual(err.exception.code, self.tgt_invalid_error) def test_unfound_target(self): self.setup_test() #print("Test for unfound target") with warnings.catch_warnings(record=True) as w: Link.fix(self.ln_no_target, self.tgt_dir) assert len(w) == 1 self.assertEqual(str(w[-1].message), self.ln_no_target_warning) def test_fix_link(self): self.setup_test() Link.fix(self.ln_broken, self.tgt_dir) self.assertEqual(Path(self.ln_broken).resolve(), Path(self.tgt_file).resolve()) def test_fix_linkdir(self): self.setup_test() Link.fix(self.lnk_dir, self.tgt_dir) self.assertEqual(Path(self.ln_broken).resolve(), Path(self.tgt_file).resolve()) if __name__ == "__main__": #runner = unittest.TestLinkFixer(verbosity=2) unittest.main(verbosity=0)