test_template_paths.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """Offline path configuration checks; no external services."""
  2. import os
  3. import tempfile
  4. import unittest
  5. from pathlib import Path
  6. from unittest.mock import patch
  7. from step2_graph_building.config import get_metadata_template_dir, get_relation_path
  8. class TemplatePathTests(unittest.TestCase):
  9. def test_relative_paths_use_project_root_from_another_working_directory(self):
  10. project = Path(__file__).resolve().parents[1]
  11. previous = Path.cwd()
  12. with tempfile.TemporaryDirectory() as elsewhere, patch.dict(os.environ, {
  13. 'METADATA_TEMPLATE_DIR': 'data/templates/metadata', 'RELATION_DIR': 'data/templates',
  14. }):
  15. try:
  16. os.chdir(elsewhere)
  17. self.assertEqual(get_metadata_template_dir(), project / 'data/templates/metadata')
  18. self.assertEqual(get_relation_path(), project / 'data/templates/relation.xlsx')
  19. finally:
  20. os.chdir(previous)
  21. def test_custom_env_external_directories_and_process_override(self):
  22. with tempfile.TemporaryDirectory() as tmp, patch.dict(os.environ, {}, clear=True):
  23. root = Path(tmp)
  24. metadata = root / '外部 metadata'
  25. relations = root / '外部 relations'
  26. metadata.mkdir()
  27. relations.mkdir()
  28. (relations / 'relation.xlsx').touch()
  29. config = root / 'custom.env'
  30. config.write_text(f'METADATA_TEMPLATE_DIR="{metadata.as_posix()}"\nRELATION_DIR="{relations.as_posix()}"\n', encoding='utf-8')
  31. self.assertEqual(get_metadata_template_dir(config), metadata)
  32. self.assertEqual(get_relation_path(config), relations / 'relation.xlsx')
  33. override = root / 'override'
  34. override.mkdir()
  35. os.environ['METADATA_TEMPLATE_DIR'] = str(override)
  36. self.assertEqual(get_metadata_template_dir(config), override)
  37. def test_missing_blank_directory_and_missing_fixed_filename_fail(self):
  38. with tempfile.TemporaryDirectory() as tmp, patch('step2_graph_building.config._load'), patch.dict(os.environ, {}, clear=True):
  39. root = Path(tmp)
  40. for bad in (None, '', str(root / 'missing')):
  41. if bad is None:
  42. os.environ.pop('METADATA_TEMPLATE_DIR', None)
  43. else:
  44. os.environ['METADATA_TEMPLATE_DIR'] = bad
  45. with self.assertRaises((RuntimeError, ValueError)):
  46. get_metadata_template_dir()
  47. file = root / 'not-a-directory'
  48. file.touch()
  49. os.environ['METADATA_TEMPLATE_DIR'] = str(file)
  50. with self.assertRaises(ValueError):
  51. get_metadata_template_dir()
  52. os.environ['RELATION_DIR'] = str(root)
  53. (root / 'renamed.xlsx').touch()
  54. with self.assertRaisesRegex(ValueError, 'relation.xlsx'):
  55. get_relation_path()
  56. if __name__ == '__main__':
  57. unittest.main()