diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_basic.py | 395 | ||||
-rw-r--r-- | tests/test_cli.py | 10 | ||||
-rw-r--r-- | tests/test_cli_orig.py | 16 | ||||
-rw-r--r-- | tests/test_dotfile.py | 137 | ||||
-rw-r--r-- | tests/test_package.py | 21 | ||||
-rw-r--r-- | tests/test_prefix.py | 41 | ||||
-rw-r--r-- | tests/test_repository.py | 72 | ||||
-rw-r--r-- | tests/test_sync.py | 19 |
8 files changed, 0 insertions, 711 deletions
diff --git a/tests/test_basic.py b/tests/test_basic.py deleted file mode 100644 index 97c643c..0000000 --- a/tests/test_basic.py +++ /dev/null @@ -1,395 +0,0 @@ -from __future__ import with_statement - -import os -import pytest -import shutil -import tempfile -import unittest - -from dotfiles.core import Dotfiles -from dotfiles.utils import is_link_to - - -def touch(fname, times=None): - with open(fname, 'a'): - os.utime(fname, times) - - -class DotfilesTestCase(unittest.TestCase): - - def setUp(self): - """Create a temporary home directory.""" - - self.homedir = tempfile.mkdtemp() - - # Create a repository for the tests to use. - self.repository = os.path.join(self.homedir, 'Dotfiles') - os.mkdir(self.repository) - - def tearDown(self): - """Delete the temporary home directory and its contents.""" - - shutil.rmtree(self.homedir) - - def assertPathEqual(self, path1, path2): - self.assertEqual( - os.path.realpath(path1), - os.path.realpath(path2)) - - def test_force_sync_directory(self): - """Test forced sync when the dotfile is a directory. - - I installed the lastpass chrome extension which stores a socket in - ~/.lastpass. So I added that directory as an external to /tmp and - attempted a forced sync. An error occurred because sync() calls - os.remove() as it mistakenly assumes the dotfile is a file and not - a directory. - """ - - os.mkdir(os.path.join(self.homedir, '.lastpass')) - externals = {'.lastpass': '/tmp'} - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals=externals, packages=[], - dry_run=False) - - dotfiles.sync(force=True) - - self.assertPathEqual( - os.path.join(self.homedir, '.lastpass'), - '/tmp') - - def test_move_repository(self): - """Test the move() method for a Dotfiles repository.""" - - touch(os.path.join(self.repository, 'bashrc')) - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], force=True, externals={}, packages=[], - dry_run=False) - - dotfiles.sync() - - # Make sure sync() did the right thing. - self.assertPathEqual( - os.path.join(self.homedir, '.bashrc'), - os.path.join(self.repository, 'bashrc')) - - target = os.path.join(self.homedir, 'MyDotfiles') - - dotfiles.move(target) - - self.assertTrue(os.path.exists(os.path.join(target, 'bashrc'))) - self.assertPathEqual( - os.path.join(self.homedir, '.bashrc'), - os.path.join(target, 'bashrc')) - - def test_force_sync_directory_symlink(self): - """Test a forced sync on a directory symlink. - - A bug was reported where a user wanted to replace a dotfile repository - with an other one. They had a .vim directory in their home directory - which was obviously also a symbolic link. This caused: - - OSError: Cannot call rmtree on a symbolic link - """ - - # Create a dotfile symlink to some directory - os.mkdir(os.path.join(self.homedir, 'vim')) - os.symlink(os.path.join(self.homedir, 'vim'), - os.path.join(self.homedir, '.vim')) - - # Create a vim directory in the repository. This will cause the above - # symlink to be overwritten on sync. - os.mkdir(os.path.join(self.repository, 'vim')) - - # Make sure the symlink points to the correct location. - self.assertPathEqual( - os.path.join(self.homedir, '.vim'), - os.path.join(self.homedir, 'vim')) - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals={}, packages=[], dry_run=False) - - dotfiles.sync(force=True) - - # The symlink should now point to the directory in the repository. - self.assertPathEqual( - os.path.join(self.homedir, '.vim'), - os.path.join(self.repository, 'vim')) - - def test_glob_ignore_pattern(self): - """ Test that the use of glob pattern matching works in the ignores - list. - - The following repo dir exists: - - myscript.py - myscript.pyc - myscript.pyo - bashrc - bashrc.swp - vimrc - vimrc.swp - install.sh - - Using the glob pattern dotfiles should have the following sync result - in home: - - .myscript.py -> Dotfiles/myscript.py - .bashrc -> Dotfiles/bashrc - .vimrc -> Dotfiles/vimrc - - """ - ignore = ['*.swp', '*.py?', 'install.sh'] - - all_repo_files = ( - ('myscript.py', '.myscript.py'), - ('myscript.pyc', None), - ('myscript.pyo', None), - ('bashrc', '.bashrc'), - ('bashrc.swp', None), - ('vimrc', '.vimrc'), - ('vimrc.swp', None), - ('install.sh', None) - ) - - all_dotfiles = [f for f in all_repo_files if f[1] is not None] - - for original, symlink in all_repo_files: - touch(os.path.join(self.repository, original)) - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=ignore, externals={}, packages=[], - dry_run=False) - - dotfiles.sync() - - # Now check that the files that should have a symlink - # point to the correct file and are the only files that - # exist in the home dir. - self.assertEqual( - sorted(os.listdir(self.homedir)), - sorted([f[1] for f in all_dotfiles] + ['Dotfiles'])) - - for original, symlink in all_dotfiles: - self.assertPathEqual( - os.path.join(self.repository, original), - os.path.join(self.homedir, symlink)) - - def test_packages(self): - """ - Test packages. - """ - files = ['foo', 'package/bar'] - symlinks = ['.foo', '.package/bar'] - join = os.path.join - - # Create files - for filename in files: - path = join(self.repository, filename) - dirname = os.path.dirname(path) - if not os.path.exists(dirname): - os.makedirs(dirname) - touch(path) - - # Create Dotfiles object - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals={}, packages=['package'], - dry_run=False) - - # Create symlinks in homedir - dotfiles.sync() - - # Verify it created what we expect - def check_all(files, symlinks): - self.assertTrue(os.path.isdir(join(self.homedir, '.package'))) - for src, dst in zip(files, symlinks): - self.assertTrue(is_link_to(join(self.homedir, dst), - join(self.repository, src))) - check_all(files, symlinks) - - # Add files to the repository - new_files = [join(self.homedir, f) for f in ['.bar', '.package/foo']] - for filename in new_files: - path = join(self.homedir, filename) - touch(path) - new_repo_files = ['bar', 'package/foo'] - dotfiles.add(new_files) - check_all(files + new_repo_files, symlinks + new_files) - - # Remove them from the repository - dotfiles.remove(new_files) - check_all(files, symlinks) - - # Move the repository - self.repository = join(self.homedir, 'Dotfiles2') - dotfiles.move(self.repository) - check_all(files, symlinks) - - def test_missing_package(self): - """ - Test a non-existent package. - """ - - package_file = '.package/bar' - - # Create Dotfiles object - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals={}, packages=['package'], - dry_run=False) - - path = os.path.join(self.homedir, package_file) - dirname = os.path.dirname(path) - if not os.path.exists(dirname): - os.makedirs(dirname) - touch(path) - - dotfiles.add([os.path.join(self.homedir, package_file)]) - - def test_single_sync(self): - """ - Test syncing a single file in the repo - - The following repo dir exists: - - bashrc - netrc - vimrc - - Syncing only vimrc should have the folowing sync result in home: - - .vimrc -> Dotfiles/vimrc - - """ - - # define the repository contents - repo_files = ( - ('bashrc', False), - ('netrc', False), - ('vimrc', True)) - - # populate the repository - for dotfile, _ in repo_files: - touch(os.path.join(self.repository, dotfile)) - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals={}, packages=[], - dry_run=False) - - # sync only certain dotfiles - for dotfile, should_sync in repo_files: - if should_sync: - dotfiles.sync(files=['.%s' % dotfile]) - - # verify home directory contents - for dotfile, should_sync in repo_files: - if should_sync: - self.assertPathEqual( - os.path.join(self.repository, dotfile), - os.path.join(self.homedir, '.%s' % dotfile)) - else: - self.assertFalse(os.path.exists( - os.path.join(self.homedir, dotfile))) - - def test_missing_remove(self): - """Test removing a dotfile that's been removed from the repository.""" - - repo_file = os.path.join(self.repository, 'testdotfile') - - touch(repo_file) - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals={}, packages=[], - dry_run=False) - - dotfiles.sync() - - # remove the dotfile from the repository, homedir symlink is now broken - os.remove(repo_file) - - # remove the broken symlink - dotfiles.remove(['.testdotfile']) - - # verify symlink was removed - self.assertFalse(os.path.exists( - os.path.join(self.homedir, '.testdotfile'))) - - def test_add_package(self): - """ - Test adding a package that isn't already in the repository - - """ - - package_dir = os.path.join(self.homedir, - '.%s/%s' % ('config', 'gtk-3.0')) - - os.makedirs(package_dir) - touch('%s/testfile' % package_dir) - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals={}, packages=['config'], - dry_run=False, quiet=True) - - # This should fail, you should not be able to add dotfiles that are - # defined to be packages. - dotfiles.add(['.config']) - self.assertFalse(os.path.islink(os.path.join(self.homedir, '.config'))) - - def test_no_dot_prefix(self): - # define the repository contents - repo_files = ('bashrc', 'netrc', 'vimrc') - - # populate the repository - for dotfile in repo_files: - touch(os.path.join(self.repository, dotfile)) - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals={}, packages=[], - dry_run=False, no_dot_prefix=True) - - dotfiles.sync() - - # verify home directory contents - for dotfile in repo_files: - self.assertPathEqual( - os.path.join(self.repository, dotfile), - os.path.join(self.homedir, dotfile)) - - @pytest.mark.xfail() - def test_add_package_file(self): - """ - Test adding a package that isn't already in the repository - - """ - - package_dir = os.path.join(self.homedir, - '.%s/%s' % ('config', 'gtk-3.0')) - - os.makedirs(package_dir) - touch('%s/testfile' % package_dir) - - dotfiles = Dotfiles( - homedir=self.homedir, path=self.repository, - prefix='', ignore=[], externals={}, packages=['config'], - dry_run=False) - - # This should succeed and the directory structure in the repository - # should be created since it didn't already exist. - dotfiles.add(['.config/gtk-3.0']) - self.assertTrue(os.path.islink( - os.path.join(self.homedir, '.config/gtk-3.0'))) - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_cli.py b/tests/test_cli.py deleted file mode 100644 index 7f08010..0000000 --- a/tests/test_cli.py +++ /dev/null @@ -1,10 +0,0 @@ -from click.testing import CliRunner - -from dotfiles import __version__ -from dotfiles.cli import version - - -def test_version(): - runner = CliRunner() - result = runner.invoke(version) - assert ('dotfiles v%s\n' % __version__) == result.output diff --git a/tests/test_cli_orig.py b/tests/test_cli_orig.py deleted file mode 100644 index 58872e3..0000000 --- a/tests/test_cli_orig.py +++ /dev/null @@ -1,16 +0,0 @@ -from dotfiles.cli_orig import dispatch - - -def test_dispatch(): - """Test that the force option is handed on to the sync method.""" - - class MockDotfiles: - def sync(self, files=None, force=False): - assert force - - class MockNamespace: - def __init__(self): - self.action = 'sync' - self.force = True - - dispatch(MockDotfiles(), MockNamespace(), []) diff --git a/tests/test_dotfile.py b/tests/test_dotfile.py deleted file mode 100644 index 1af1d8e..0000000 --- a/tests/test_dotfile.py +++ /dev/null @@ -1,137 +0,0 @@ -import pytest -import py.error - -from dotfiles.dotfile import Dotfile, unique_suffix - - -def test_unique_suffix_overlap(): - (name, target) = unique_suffix(py.path.local('/foo/baz'), - py.path.local('/foo/bar/bat')) - assert 'baz' == name - assert 'bar/bat' == target - - -@pytest.mark.xfail(reason='this is a bug') -def test_unique_suffix_no_overlap(): - (name, target) = unique_suffix(py.path.local('/a/b/c'), - py.path.local('/d/e/f')) - assert '/a/b/c' == name - assert '/d/e/f' == target - - -def test_state_error(tmpdir): - - repo = tmpdir.ensure("Dotfiles", dir=1) - name = tmpdir.join(".vimrc") - target = repo.join("vimrc") - - dotfile = Dotfile(name, target) - - assert 'error' == dotfile.state - - -def test_state_missing(tmpdir): - - repo = tmpdir.ensure("Dotfiles", dir=1) - name = tmpdir.join(".vimrc") - target = repo.ensure("vimrc") - - dotfile = Dotfile(name, target) - - assert 'missing' == dotfile.state - - -def test_state_conflict(tmpdir): - - repo = tmpdir.ensure("Dotfiles", dir=1) - name = tmpdir.ensure(".vimrc") - target = repo.ensure("vimrc") - - dotfile = Dotfile(name, target) - - assert 'conflict' == dotfile.state - - -def test_state_ok(tmpdir): - - repo = tmpdir.join("Dotfiles", dir=1) - name = tmpdir.join(".vimrc") - target = repo.ensure("vimrc") - dotfile = Dotfile(name, target) - - name.mksymlinkto(target) - assert 'ok' == dotfile.state - - name.remove() - assert 'missing' == dotfile.state - - -@pytest.mark.parametrize("times", range(1, 4)) -def test_add(tmpdir, times): - - repo = tmpdir.ensure("Dotfiles", dir=1) - name = tmpdir.ensure(".vimrc") - target = repo.join("vimrc") - - dotfile = Dotfile(name, target) - dotfile.add() - - assert target.check(file=1, link=0) - assert name.check(file=1, link=1) - assert name.samefile(target) - - for x in range(2, times): - with pytest.raises(OSError): - dotfile.add() - assert target.check(file=1, link=0) - assert name.check(file=1, link=1) - assert name.samefile(target) - - -@pytest.mark.parametrize("times", range(1, 4)) -def test_remove(tmpdir, times): - - repo = tmpdir.ensure("Dotfiles", dir=1) - name = tmpdir.join(".vimrc") - target = repo.ensure("vimrc") - - name.mksymlinkto(target) - - dotfile = Dotfile(name, target) - dotfile.remove() - - assert False == target.check() - assert name.check(file=1, link=0) - - for x in range(2, times): - with pytest.raises(OSError): - dotfile.remove() - assert False == target.check() - assert name.check(file=1, link=0) - - -@pytest.mark.parametrize("times", range(1, 4)) -def test_sync(tmpdir, times): - - repo = tmpdir.ensure("Dotfiles", dir=1) - name = tmpdir.join(".vimrc") - target = repo.ensure("vimrc") - - dotfile = Dotfile(name, target) - dotfile.sync() - - assert target.check(file=1, link=0) - assert name.check(file=1, link=1) - assert name.samefile(target) - - for x in range(2, times): - with pytest.raises(py.error.EEXIST): - dotfile.sync() - assert target.check(file=1, link=0) - assert name.check(file=1, link=1) - assert name.samefile(target) - - -@pytest.mark.xfail(reason='not implemented yet') -def test_unsync(): - raise NotImplementedError diff --git a/tests/test_package.py b/tests/test_package.py deleted file mode 100644 index ddc5787..0000000 --- a/tests/test_package.py +++ /dev/null @@ -1,21 +0,0 @@ -from dotfiles.core import Dotfiles - - -def test_package_sync(tmpdir): - """Test syncing a package.""" - - repository = tmpdir.ensure('Dotfiles', dir=1) - dotfile = repository.ensure('config/awesome/testfile') - - Dotfiles(homedir=str(tmpdir), - path=str(repository), - prefix='', - ignore=[], - externals={}, - packages=['config'], - dry_run=False, - quiet=True).sync() - - assert tmpdir.join('.config').check(dir=1) - assert tmpdir.join('.config/awesome').check(link=1) - assert tmpdir.join('.config/awesome').samefile(dotfile.dirname) diff --git a/tests/test_prefix.py b/tests/test_prefix.py deleted file mode 100644 index 636a7d1..0000000 --- a/tests/test_prefix.py +++ /dev/null @@ -1,41 +0,0 @@ -import pytest -from dotfiles.core import Dotfiles - - -@pytest.mark.xfail() -def test_prefix(tmpdir): - """Test basic sync when using a non-default prefix.""" - - dotfile = tmpdir.ensure('Dotfiles/_vimrc') - symlink = tmpdir.join('.vimrc') - - Dotfiles(homedir=str(tmpdir), - path=str(dotfile.dirname), - prefix='_', - ignore=[], - externals={}, - packages=[], - dry_run=False).sync() - - assert symlink.check(link=1) - assert symlink.samefile(dotfile) - - -def test_prefix_with_package(tmpdir): - """Test syncing a package when using a non-default prefix.""" - - repository = tmpdir.ensure('Dotfiles', dir=1) - dotfile = repository.ensure('.config/awesome/testfile') - - Dotfiles(homedir=str(tmpdir), - path=str(repository), - prefix='.', - ignore=[], - externals={}, - packages=['.config'], - dry_run=False, - quiet=True).sync() - - assert tmpdir.join('.config').check(dir=1) - assert tmpdir.join('.config/awesome').check(link=1) - assert tmpdir.join('.config/awesome').samefile(dotfile.dirname) diff --git a/tests/test_repository.py b/tests/test_repository.py deleted file mode 100644 index 2825b66..0000000 --- a/tests/test_repository.py +++ /dev/null @@ -1,72 +0,0 @@ -import os -import py -import pytest - -from dotfiles.repository import Repository - - -def test_getters(): - - repo = Repository('/a', '/b') - - assert isinstance(repo.homedir, str) - assert isinstance(repo.repodir, str) - - assert '/a' == repo.repodir - assert '/b' == repo.homedir - - -def test_setters(): - - repodir = py.path.local('/foo/bar') - homedir = py.path.local('/fizz/buzz') - - repo = Repository('/a', '/b') - - repo.repodir = repodir - repo.homedir = homedir - - assert repodir == repo.repodir - assert homedir == repo.homedir - - -def test_path_expansion(): - - repo = Repository('~/foo', '~/bar') - - assert os.path.expanduser('~/foo') == repo.repodir - assert os.path.expanduser('~/bar') == repo.homedir - - -def test_repodir_create(tmpdir): - - repodir = tmpdir.join('test_create_repo') - repo = Repository(repodir) - - assert True == repodir.check(exists=0) - contents = repo.contents() - assert [] == contents - assert True == repodir.check(exists=1, dir=1) - - -def test_contents_empty(tmpdir): - assert [] == Repository(tmpdir.join('Dotfiles')).contents() - - -def test_contents_nonempty(tmpdir): - - repodir = tmpdir.ensure('test_create_repo', dir=1) - target_a = repodir.ensure('a') - target_b = repodir.ensure('b') - target_c = repodir.ensure('c') - - contents = Repository(repodir).contents() - - assert target_a == contents[0].target - assert target_b == contents[1].target - assert target_c == contents[2].target - - -@pytest.mark.xfail(reason='not implemented yet') -def test_rename(): - raise NotImplementedError diff --git a/tests/test_sync.py b/tests/test_sync.py deleted file mode 100644 index e8a51cc..0000000 --- a/tests/test_sync.py +++ /dev/null @@ -1,19 +0,0 @@ -from dotfiles.core import Dotfiles - - -def test_sync(tmpdir): - """Basic sync operation.""" - - dotfile = tmpdir.ensure('Dotfiles/foo') - symlink = tmpdir.join('.foo') - - Dotfiles(homedir=str(tmpdir), - path=str(dotfile.dirname), - prefix='', - ignore=[], - externals={}, - packages=[], - dry_run=False).sync() - - assert symlink.check(link=1) - assert symlink.samefile(dotfile) |