diff --git a/lib/tfw/components/ide_event_handler/file_manager.py b/lib/tfw/components/ide_event_handler/file_manager.py index 59431ea..967e06f 100644 --- a/lib/tfw/components/ide_event_handler/file_manager.py +++ b/lib/tfw/components/ide_event_handler/file_manager.py @@ -41,7 +41,7 @@ class FileManager: # pylint: disable=too-many-instance-attributes @allowed_directories.setter def allowed_directories(self, directories): - self._allowed_directories = directories + self._allowed_directories = [realpath(directory) for directory in directories] @property def filename(self): diff --git a/lib/tfw/components/ide_event_handler/test_filemanager.py b/lib/tfw/components/ide_event_handler/test_filemanager.py index d62f3e0..c6e0b8b 100644 --- a/lib/tfw/components/ide_event_handler/test_filemanager.py +++ b/lib/tfw/components/ide_event_handler/test_filemanager.py @@ -1,97 +1,103 @@ # pylint: disable=redefined-outer-name from secrets import token_urlsafe +from os.path import join +from os import chdir, mkdir, symlink from pathlib import Path -from shutil import rmtree -from os.path import join, realpath -from os import mkdir, rmdir, remove, symlink +from tempfile import TemporaryDirectory import pytest -from filemanager import FileManager +from file_manager import FileManager -WORKDIR = realpath('test_filemanager') +class ManagerContext: + def __init__(self, folder, manager): + self.folder = folder + self.manager = manager -def workdir_pref(path): - return join(WORKDIR, path) + def join(self, path): + return join(self.folder, path) -@pytest.fixture(scope='module') -def manager(): + +@pytest.fixture() +def context(): dirs = [] - mkdir(WORKDIR) - for i in range(3): - node = workdir_pref('dir_'+str(i).zfill(2)) - mkdir(node) - Path(join(node, 'empty.txt')).touch() - Path(join(node, 'empty.bin')).touch() - dirs.append(node) + with TemporaryDirectory() as workdir: + chdir(workdir) + for name in ["allowed", "excluded", "invis"]: + node = join(workdir, name) + mkdir(node) + Path(join(node, 'empty.txt')).touch() + Path(join(node, 'empty.bin')).touch() + dirs.append(node) - yield FileManager(dirs[0], dirs[:-1], exclude=['*/dir_01/*', '*.bin']) - rmtree(WORKDIR) + yield ManagerContext( + workdir, + FileManager(dirs[0], dirs[:-1], exclude=['*/excluded/*']) + ) -@pytest.mark.parametrize('subdir', ['dir_00', 'dir_01']) -def test_select_allowed_dirs(manager, subdir): - manager.workdir = workdir_pref(subdir) - assert manager.workdir == workdir_pref(subdir) - newdir = workdir_pref(join(subdir, 'deep')) +@pytest.mark.parametrize('subdir', ['allowed/', 'excluded/']) +def test_select_allowed_dirs(context, subdir): + context.manager.workdir = context.join(subdir) + assert context.manager.workdir == context.join(subdir) + newdir = context.join(subdir+'deep') mkdir(newdir) - manager.workdir = newdir - assert manager.workdir == newdir - rmdir(newdir) + context.manager.workdir = newdir + assert context.manager.workdir == newdir -@pytest.mark.parametrize('excdir', ['/', workdir_pref('dir_02')]) -def test_select_excluded_dirs(manager, excdir): - allowed = manager.allowed_directories +@pytest.mark.parametrize('invdir', ['', 'invis']) +def test_select_forbidden_dirs(context, invdir): + fullpath = context.join(invdir) with pytest.raises(OSError): - manager.workdir = excdir - assert manager.workdir != excdir - manager.allowed_directories = allowed+[excdir] - manager.workdir = excdir - assert manager.workdir == excdir - manager.allowed_directories = allowed + context.manager.workdir = fullpath + assert context.manager.workdir != fullpath + context.manager.allowed_directories += [fullpath] + context.manager.workdir = fullpath + assert context.manager.workdir == fullpath + @pytest.mark.parametrize('filename', ['another.txt', '*.txt']) -def test_select_allowed_files(manager, filename): - manager.workdir = workdir_pref('dir_00') - newfile = workdir_pref(join('dir_00', filename)) - Path(newfile).touch() - assert filename in manager.files - manager.filename = filename - assert manager.filename == filename - remove(newfile) +def test_select_allowed_files(context, filename): + Path(context.join('allowed/'+filename)).touch() + assert filename in context.manager.files + context.manager.filename = filename + assert context.manager.filename == filename @pytest.mark.parametrize('path', [ - ['dir_00', 'illegal.bin'], - ['dir_01', 'legal.txt'] + {'dir': 'allowed/', 'file': 'illegal.bin'}, + {'dir': 'excluded/', 'file': 'legal.txt'}, + {'dir': 'allowed/', 'file': token_urlsafe(16)+'.bin'}, + {'dir': 'excluded/', 'file': token_urlsafe(16)+'.txt'}, + {'dir': 'allowed/', 'file': token_urlsafe(32)+'.bin'}, + {'dir': 'excluded/', 'file': token_urlsafe(32)+'.txt'} ]) -def test_select_excluded_files(manager, path): - manager.workdir = workdir_pref(path[0]) - newfile = workdir_pref(join(path[0], path[1])) - Path(newfile).touch() - assert path[1] not in manager.files +def test_select_excluded_files(context, path): + context.manager.workdir = context.join(path['dir']) + context.manager.exclude = ['*/excluded/*', '*.bin'] + Path(context.join(path['dir']+path['file'])).touch() + assert path['file'] not in context.manager.files with pytest.raises(OSError): - manager.filename = path[1] - remove(newfile) + context.manager.filename = path['file'] @pytest.mark.parametrize('path', [ - ['dir_02/empty.txt', 'dir_00/link.txt'], - ['dir_01/empty.txt', 'dir_00/link.bin'] + {'src': 'excluded/empty.txt', 'dst': 'allowed/link.txt'}, + {'src': 'invis/empty.txt', 'dst': 'allowed/link.txt'}, + {'src': 'excluded/empty.txt', 'dst': 'allowed/'+token_urlsafe(16)+'.txt'}, + {'src': 'invis/empty.txt', 'dst': 'allowed/'+token_urlsafe(16)+'.txt'}, + {'src': 'excluded/empty.txt', 'dst': 'allowed/'+token_urlsafe(32)+'.txt'}, + {'src': 'invis/empty.txt', 'dst': 'allowed/'+token_urlsafe(32)+'.txt'} ]) -def test_select_excluded_symlinks(manager, path): - manager.workdir = workdir_pref('dir_00') - link = workdir_pref(path[1]) - symlink(workdir_pref(path[0]), link) - assert path[1] not in manager.files - remove(link) +def test_select_excluded_symlinks(context, path): + symlink(context.join(path['src']), context.join(path['dst'])) + assert path['dst'] not in context.manager.files -def test_read_write_file(manager): +def test_read_write_file(context): for _ in range(128): - manager.workdir = workdir_pref('dir_00') - manager.filename = 'empty.txt' + context.manager.filename = 'empty.txt' content = token_urlsafe(32) - manager.file_contents = content - assert manager.file_contents == content - with open(workdir_pref('dir_00/empty.txt'), "r") as ifile: + context.manager.file_contents = content + assert context.manager.file_contents == content + with open(context.join('allowed/empty.txt'), "r") as ifile: assert ifile.read() == content