test_format_converter.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import os
  2. import tempfile
  3. import unittest
  4. from contextlib import contextmanager
  5. from odml.tools.format_converter import FormatConverter
  6. FC = FormatConverter
  7. # TODO The used NamedTemporaryFile does not play nice with Windows;
  8. # deactivating all affected tests for Windows until this has been fixed.
  9. class TestFormatConverter(unittest.TestCase):
  10. def setUp(self):
  11. self.doc = """<odML version="1.1">
  12. <section>
  13. <type>some</type>
  14. <name>S</name>
  15. </section>
  16. </odML>
  17. """
  18. @contextmanager
  19. def assertNotRaises(self, exc_type):
  20. try:
  21. yield None
  22. except exc_type:
  23. raise self.failureException('{} raised'.format(exc_type.__name__))
  24. def test_convert(self):
  25. if os.name == 'nt':
  26. raise unittest.SkipTest("Skipping test on Windows")
  27. self.test_convert_dir_no_output_dir(False, FC.convert)
  28. self.test_convert_dir_no_output_dir(True, FC.convert)
  29. self.test_convert_dir_with_output_dir_specified(FC.convert)
  30. def test_convert_dir(self):
  31. if os.name == 'nt':
  32. raise unittest.SkipTest("Skipping test on Windows")
  33. with self.assertRaises(ValueError):
  34. FC.convert_dir(None, None, False, "not valid format")
  35. # Testing recursive part of the converter for not nested input dir
  36. self.test_convert_dir_no_output_dir(True)
  37. def test_convert_dir_no_output_dir(self, recursive=False, func=None):
  38. if os.name == 'nt':
  39. raise unittest.SkipTest("Skipping test on Windows")
  40. work_dir = tempfile.mkdtemp()
  41. in_dir = tempfile.mkdtemp(dir=work_dir)
  42. in_file = self.create_open_file(in_dir)
  43. in_file2 = self.create_open_file(in_dir)
  44. if not func:
  45. FC.convert_dir(in_dir, None, recursive, "odml")
  46. else:
  47. if recursive:
  48. func([in_dir, "odml", "-r"])
  49. else:
  50. func([in_dir, "odml"])
  51. files = []
  52. for dir_path, dir_names, file_names in os.walk(work_dir):
  53. for file_name in file_names:
  54. files.append(os.path.join(dir_path, file_name))
  55. # check if the input file in the correct repo
  56. self.assertIn(os.path.join(in_dir, in_file.name), files)
  57. self.assertIn(os.path.join(in_dir, in_file2.name), files)
  58. # check if the output file in correct repo and has intended name
  59. in_files = [in_file.name, in_file2.name]
  60. for file in in_files:
  61. odml_file_name = os.path.basename(file)
  62. odml_file_name = odml_file_name.replace(".xml", ".odml")
  63. root, odml_dir_name = os.path.split(in_dir)
  64. odml_dir_name = odml_dir_name + "_odml"
  65. self.assertIn(os.path.join(root, odml_dir_name, odml_file_name), files)
  66. in_file.close()
  67. in_file2.close()
  68. def test_convert_dir_with_output_dir_specified(self, func=None):
  69. if os.name == 'nt':
  70. raise unittest.SkipTest("Skipping test on Windows")
  71. # Testing FC.convert_dir(in_dir, out_dir, False, "odml")
  72. in_dir = tempfile.mkdtemp()
  73. out_dir = tempfile.mkdtemp()
  74. in_file = self.create_open_file(in_dir)
  75. in_file2 = self.create_open_file(in_dir)
  76. if not func:
  77. FC.convert_dir(in_dir, out_dir, False, "odml")
  78. else:
  79. func([in_dir, "odml", "-out", out_dir])
  80. in_files = []
  81. out_files = []
  82. for dir_path, dir_names, file_names in os.walk(in_dir):
  83. for file_name in file_names:
  84. in_files.append(os.path.join(dir_path, file_name))
  85. for dir_path, dir_names, file_names in os.walk(out_dir):
  86. for file_name in file_names:
  87. out_files.append(os.path.join(dir_path, file_name))
  88. # check if the input file in the correct repo
  89. self.assertIn(os.path.join(in_dir, in_file.name), in_files)
  90. self.assertIn(os.path.join(in_dir, in_file2.name), in_files)
  91. # check if the output file in correct repo and has intended name
  92. check_in_files = [in_file.name, in_file2.name]
  93. for file in check_in_files:
  94. _, out_file_name = os.path.split(file)
  95. pre, ext = os.path.splitext(out_file_name)
  96. out_file_name = out_file_name.replace(out_file_name, pre + ".odml")
  97. self.assertIn(os.path.join(out_dir, out_file_name), out_files)
  98. in_file.close()
  99. in_file2.close()
  100. def create_open_file(self, in_dir):
  101. in_file = tempfile.NamedTemporaryFile(mode='a+', suffix=".xml", dir=in_dir)
  102. in_file.write(self.doc)
  103. in_file.seek(0)
  104. return in_file
  105. def test_check_io_directory(self):
  106. out_dir = tempfile.mkdtemp()
  107. in_dir = tempfile.mkdtemp()
  108. with self.assertRaises(ValueError):
  109. FC._check_input_output_directory(None, None)
  110. with self.assertRaises(ValueError):
  111. FC._check_input_output_directory("/not_valid_path", None)
  112. with self.assertRaises(ValueError):
  113. FC._check_input_output_directory(in_dir, "/not_valid_path")
  114. self.assertNotRaises(FC._check_input_output_directory(in_dir, None))
  115. self.assertNotRaises(FC._check_input_output_directory(in_dir, out_dir))