def test_read_bootstrap(self, tmpdir, cask, debug, verbose, data): with patch("cider.core.read_json") as mock: cider = Cider(cask, debug, verbose, cider_dir=str(tmpdir)) mock.return_value = data assert cider.read_bootstrap() == data mock.assert_called_with(cider.bootstrap_file) mock.side_effect = IOError(errno.ENOENT, "") with pytest.raises(BootstrapMissingError): cider.read_bootstrap() mock.assert_called_with(cider.bootstrap_file)
def test_rm(self, tmpdir, cask, debug, verbose, formulas): cider = Cider(cask, debug, verbose, cider_dir=str(tmpdir)) cider.brew = MagicMock() cider.rm(*formulas) cider.brew.rm.assert_called_once_with(*formulas) key = "casks" if cask else "formulas" for formula in formulas: assert formula not in cider.read_bootstrap().get(key, [])
def test_installed(self, tmpdir, cask, debug, verbose, random_prefix, bootstrap): cider = Cider(cask, debug, verbose, cider_dir=str(tmpdir)) cider.read_bootstrap = MagicMock(return_value=bootstrap) key = "casks" if cask else "formulas" installed = bootstrap.get(key, []) random_choice = random.choice(installed) if installed else None for prefix in [None, random_choice, random_prefix]: assert cider.installed(prefix) == [ x for x in installed if not prefix or x.startswith(prefix) ]
def test_run_scripts(self, tmpdir, debug, verbose, before, after, bootstrap): cider = Cider(False, debug, verbose, cider_dir=str(tmpdir)) cider.read_bootstrap = MagicMock(return_value=bootstrap) scripts = [] scripts += bootstrap.get("before-scripts", []) if before else [] scripts += bootstrap.get("after-scripts", []) if after else [] # TODO: Assert ordering with patch("cider.core.spawn", autospec=True, return_value=0) as spawn: cider.run_scripts(before, after) for script in scripts: spawn.assert_any_call( [script], shell=True, debug=debug, cwd=cider.cider_dir )
def test_run_scripts(self, tmpdir, debug, verbose, before, after, bootstrap): cider = Cider(False, debug, verbose, cider_dir=str(tmpdir)) cider.read_bootstrap = MagicMock(return_value=bootstrap) scripts = [] scripts += bootstrap.get("before-scripts", []) if before else [] scripts += bootstrap.get("after-scripts", []) if after else [] # TODO: Assert ordering with patch("cider.core.spawn", autospec=True, return_value=0) as spawn: cider.run_scripts(before, after) for script in scripts: spawn.assert_any_call([script], shell=True, debug=debug, cwd=cider.cider_dir, env=cider.env)
def test_relink(self, tmpdir, debug, verbose, force): """ Tests that: 1. Target directories are created. 2. For each source in glob(key), mklink(src, expandtarget(src, target)) is called. 3. Previously-cached targets are removed. 4. Cache is updated with new targets. """ def generate_symlinks(): srcdir = tmpdir.join(random_str(min_length=1)) def symkey(directory, key): return str(directory.join(key).relto(srcdir)) def symvalue(directory, value): return str(directory.join(value)) + ( "/" if value.endswith("/") else "" ) outerdir = srcdir.join(random_str(min_length=1)) innerdir = outerdir.join(random_str(min_length=1)) targetdir = tmpdir.join(random_str(min_length=1)) ext = random_str(min_length=1, max_length=8) os.makedirs(str(innerdir)) for _ in range(random.randint(0, 10)): touch(str(innerdir.join("{0}.{1}".format(random_str(), ext)))) path = str(outerdir.join(random_str(min_length=1))) touch(path) return { symkey(outerdir, "*/*." + ext): symvalue(targetdir, "a/b/c/"), symkey(outerdir, "*/*." + ext): symvalue(targetdir, "a/b/c"), symkey(outerdir, path): symvalue(targetdir, "a/b/d"), } cider = Cider(False, debug, verbose, cider_dir=str(tmpdir)) cider.mklink = MagicMock(return_value=True) for srcglob, target in generate_symlinks().items(): invalid = not isdirname(target) and ("*" in srcglob or "?" in srcglob) old_targets = cider._cached_targets() # pylint:disable=W0212 cider.read_bootstrap = MagicMock(return_value={ "symlinks": {srcglob: target} }) with pytest.raises(SymlinkError) if invalid else empty(): new_targets = set(cider.relink(force)) for src in iglob(srcglob): cider.mklink.assert_called_with(src, cider.expandtarget( src, target )) assert os.path.isdir(os.path.dirname(target)) for dead_target in set(old_targets) - new_targets: assert not os.path.exists(dead_target) new_cache = cider._cached_targets() # pylint:disable=W0212 assert new_targets == set(new_cache).intersection(new_targets)
def test_untap(self, tmpdir, debug, verbose, tap): cider = Cider(False, debug, verbose, cider_dir=str(tmpdir)) cider.brew = MagicMock() cider.untap(tap) cider.brew.untap.assert_called_with(tap) assert tap not in cider.read_bootstrap().get("taps", [])
def test_read_bootstrap(self, tmpdir, cask, debug, verbose, data): with patch("cider.core.read_config") as mock: cider = Cider(cask, debug, verbose, cider_dir=str(tmpdir)) mock.return_value = data assert cider.read_bootstrap() == data mock.assert_called_with(cider.bootstrap_file, {})
def test_relink(self, tmpdir, debug, verbose, force): """ Tests that: 1. Target directories are created. 2. For each source in glob(key), mklink(src, expandtarget(src, target)) is called. 3. Previously-cached targets are removed. 4. Cache is updated with new targets. """ def generate_symlinks(): srcdir = tmpdir.join(random_str(min_length=1)) def symkey(directory, key): return str(directory.join(key).relto(srcdir)) def symvalue(directory, value): return str(directory.join(value)) + ("/" if value.endswith("/") else "") outerdir = srcdir.join(random_str(min_length=1)) innerdir = outerdir.join(random_str(min_length=1)) targetdir = tmpdir.join(random_str(min_length=1)) ext = random_str(min_length=1, max_length=8) os.makedirs(str(innerdir)) for _ in range(random.randint(0, 10)): touch(str(innerdir.join("{0}.{1}".format(random_str(), ext)))) path = str(outerdir.join(random_str(min_length=1))) touch(path) return { symkey(outerdir, "*/*." + ext): symvalue(targetdir, "a/b/c/"), symkey(outerdir, "*/*." + ext): symvalue(targetdir, "a/b/c"), symkey(outerdir, path): symvalue(targetdir, "a/b/d"), } cider = Cider(False, debug, verbose, cider_dir=str(tmpdir), support_dir=str(tmpdir.join(".cache"))) cider.mklink = MagicMock(return_value=True) for srcglob, target in generate_symlinks().items(): invalid = not isdirname(target) and ("*" in srcglob or "?" in srcglob) old_targets = cider._cached_targets() # pylint:disable=W0212 cider.read_bootstrap = MagicMock( return_value={"symlinks": { srcglob: target }}) with pytest.raises(SymlinkError) if invalid else empty(): new_targets = set(cider.relink(force)) for src in iglob(srcglob): cider.mklink.assert_called_with( src, cider.expandtarget(src, target)) assert os.path.isdir(os.path.dirname(target)) for dead_target in set(old_targets) - new_targets: assert not os.path.exists(dead_target) new_cache = cider._cached_targets() # pylint:disable=W0212 assert new_targets == set(new_cache) & new_targets