test_paths.py 4.31 KB
"""U-003 tests: platform runtime directory is physically separate from any
target project directory, and stays out of this repo's own git history.

Run: python3 -m unittest src.test_paths -v
"""

import os
import tempfile
import unittest

from src import paths

_REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


class PlatformHomeTest(unittest.TestCase):
    def test_default_is_under_user_home(self):
        home = paths.platform_home()
        self.assertEqual(home, os.path.join(os.path.expanduser("~"), ".graphlemon"))

    def test_default_is_not_inside_this_repo_checkout(self):
        home = paths.platform_home()
        self.assertFalse(
            os.path.realpath(home).startswith(os.path.realpath(_REPO_ROOT) + os.sep)
        )

    def test_env_var_overrides_default(self):
        with tempfile.TemporaryDirectory() as tmp:
            custom = os.path.join(tmp, "custom-home")
            old = os.environ.get("GRAPHLEMON_HOME")
            os.environ["GRAPHLEMON_HOME"] = custom
            try:
                self.assertEqual(paths.platform_home(), os.path.abspath(custom))
            finally:
                if old is None:
                    os.environ.pop("GRAPHLEMON_HOME", None)
                else:
                    os.environ["GRAPHLEMON_HOME"] = old


class LogFilePathTest(unittest.TestCase):
    def test_matches_01_m_convention(self):
        path = paths.log_file_path("proj-1", "task-1", "run-1", "node-1")
        expected_suffix = os.path.join("logs", "proj-1", "task-1", "run-1", "node-1.jsonl")
        self.assertTrue(path.endswith(expected_suffix), path)
        self.assertTrue(path.startswith(paths.platform_home()))


class IsSeparateFromTest(unittest.TestCase):
    def setUp(self):
        self.tmp = tempfile.TemporaryDirectory()
        self.addCleanup(self.tmp.cleanup)
        self.old_home = os.environ.get("GRAPHLEMON_HOME")
        self.platform_home = os.path.join(self.tmp.name, "platform-home")
        os.makedirs(self.platform_home)
        os.environ["GRAPHLEMON_HOME"] = self.platform_home

    def tearDown(self):
        if self.old_home is None:
            os.environ.pop("GRAPHLEMON_HOME", None)
        else:
            os.environ["GRAPHLEMON_HOME"] = self.old_home

    def test_unrelated_paths_are_separate(self):
        target = os.path.join(self.tmp.name, "some-target-project")
        os.makedirs(target)
        self.assertTrue(paths.is_separate_from(target))

    def test_target_equal_to_platform_home_is_not_separate(self):
        self.assertFalse(paths.is_separate_from(self.platform_home))

    def test_target_nested_inside_platform_home_is_not_separate(self):
        nested = os.path.join(self.platform_home, "oops-a-target")
        os.makedirs(nested)
        self.assertFalse(paths.is_separate_from(nested))

    def test_platform_home_nested_inside_target_is_not_separate(self):
        # e.g. a misconfigured GRAPHLEMON_HOME pointed inside a chosen target folder
        target = os.path.join(self.tmp.name, "some-target-project")
        nested_home = os.path.join(target, ".graphlemon-home")
        os.makedirs(nested_home)
        os.environ["GRAPHLEMON_HOME"] = nested_home
        self.assertFalse(paths.is_separate_from(target))


class RepoRootTest(unittest.TestCase):
    def test_matches_computed_repo_root(self):
        self.assertEqual(paths.repo_root(), _REPO_ROOT)

    def test_contains_src_and_git(self):
        root = paths.repo_root()
        self.assertTrue(os.path.isdir(os.path.join(root, "src")))
        self.assertTrue(os.path.isdir(os.path.join(root, ".git")))


class IsSelfTargetTest(unittest.TestCase):
    def test_this_repos_own_checkout_is_self_target(self):
        self.assertTrue(paths.is_self_target(_REPO_ROOT))

    def test_other_directory_is_not_self_target(self):
        with tempfile.TemporaryDirectory() as tmp:
            self.assertFalse(paths.is_self_target(tmp))

    def test_relative_path_to_repo_root_still_matches(self):
        rel = os.path.relpath(_REPO_ROOT, os.getcwd())
        self.assertTrue(paths.is_self_target(rel))

    def test_explicit_repo_root_override(self):
        with tempfile.TemporaryDirectory() as tmp:
            self.assertTrue(paths.is_self_target(tmp, repo_root_path=tmp))
            self.assertFalse(paths.is_self_target(_REPO_ROOT, repo_root_path=tmp))


if __name__ == "__main__":
    unittest.main()