update
This commit is contained in:
@@ -119,6 +119,31 @@ class TestDotfilesServiceLink:
|
||||
# Local file outside mount path should be linked
|
||||
assert (home / ".local" / "bin" / "nvim-wrapper").is_symlink()
|
||||
|
||||
def test_module_mount_rejects_local_files_inside_mount_path(self, tmp_path, monkeypatch):
|
||||
home = tmp_path / "home"
|
||||
home.mkdir()
|
||||
|
||||
dotfiles = tmp_path / "dotfiles"
|
||||
pkg_dir = dotfiles / "_shared" / "nvim"
|
||||
config_dir = pkg_dir / ".config" / "nvim"
|
||||
config_dir.mkdir(parents=True)
|
||||
(config_dir / "_module.yaml").write_text(yaml.dump({
|
||||
"source": "github:test/nvim-config",
|
||||
"ref": {"branch": "main"},
|
||||
}))
|
||||
(config_dir / "init.lua").write_text("-- local file conflicts with module mount")
|
||||
|
||||
monkeypatch.setattr(paths, "HOME", home)
|
||||
monkeypatch.setattr(paths, "DOTFILES_DIR", dotfiles)
|
||||
monkeypatch.setattr(paths, "MODULES_DIR", tmp_path / "modules")
|
||||
monkeypatch.setattr(paths, "LINKED_STATE", tmp_path / "state" / "linked.json")
|
||||
|
||||
ctx = _make_ctx(tmp_path)
|
||||
svc = DotfilesService(ctx)
|
||||
|
||||
with pytest.raises(PlanConflict, match=".config/nvim/init.lua"):
|
||||
svc._discover_packages(profile=None)
|
||||
|
||||
def test_unlink_removes_symlinks(self, tmp_path, monkeypatch):
|
||||
home = tmp_path / "home"
|
||||
home.mkdir()
|
||||
@@ -698,12 +723,12 @@ class TestDotfilesServiceRootPaths:
|
||||
"""`_root/` paths require sudo; verify the service routes them via the
|
||||
sudo branch of FileSystem.create_symlink (without actually invoking sudo)."""
|
||||
|
||||
def test_root_paths_route_via_sudo(self, tmp_path, monkeypatch):
|
||||
def test_layer_root_paths_route_via_sudo(self, tmp_path, monkeypatch):
|
||||
home = tmp_path / "home"
|
||||
home.mkdir()
|
||||
|
||||
dotfiles = tmp_path / "dotfiles"
|
||||
pkg_dir = dotfiles / "_shared" / "system" / "_root" / "etc"
|
||||
pkg_dir = dotfiles / "_shared" / "_root" / "etc"
|
||||
pkg_dir.mkdir(parents=True)
|
||||
(pkg_dir / "ourfile").write_text("managed by flow")
|
||||
|
||||
@@ -738,7 +763,7 @@ class TestDotfilesServiceRootPaths:
|
||||
svc.link(dry_run=True)
|
||||
assert not Path("/etc/ourfile").exists() # we did not actually touch /etc
|
||||
|
||||
def test_root_paths_can_be_skipped(self, tmp_path, monkeypatch):
|
||||
def test_nested_root_marker_rejected(self, tmp_path, monkeypatch):
|
||||
home = tmp_path / "home"
|
||||
home.mkdir()
|
||||
|
||||
@@ -746,7 +771,28 @@ class TestDotfilesServiceRootPaths:
|
||||
pkg_dir = dotfiles / "_shared" / "system" / "_root" / "etc"
|
||||
pkg_dir.mkdir(parents=True)
|
||||
(pkg_dir / "hostname").write_text("flow-host")
|
||||
|
||||
monkeypatch.setattr(paths, "HOME", home)
|
||||
monkeypatch.setattr(paths, "DOTFILES_DIR", dotfiles)
|
||||
monkeypatch.setattr(paths, "MODULES_DIR", tmp_path / "modules")
|
||||
monkeypatch.setattr(paths, "LINKED_STATE", tmp_path / "state" / "linked.json")
|
||||
|
||||
ctx = _make_ctx(tmp_path)
|
||||
svc = DotfilesService(ctx)
|
||||
|
||||
with pytest.raises(PlanConflict, match="_shared/system/_root"):
|
||||
svc._discover_packages(profile=None)
|
||||
|
||||
def test_root_paths_can_be_skipped(self, tmp_path, monkeypatch):
|
||||
home = tmp_path / "home"
|
||||
home.mkdir()
|
||||
|
||||
dotfiles = tmp_path / "dotfiles"
|
||||
pkg_dir = dotfiles / "_shared" / "_root" / "etc"
|
||||
pkg_dir.mkdir(parents=True)
|
||||
(pkg_dir / "hostname").write_text("flow-host")
|
||||
# Non-root file in the same package shouldn't be skipped
|
||||
(dotfiles / "_shared" / "system" / "README").parent.mkdir(parents=True)
|
||||
(dotfiles / "_shared" / "system" / "README").write_text("notes")
|
||||
|
||||
monkeypatch.setattr(paths, "HOME", home)
|
||||
|
||||
Reference in New Issue
Block a user