# pylint: disable=redefined-outer-name from secrets import token_urlsafe from pathlib import Path from shutil import rmtree from os.path import join, realpath from os import mkdir, rmdir, remove, symlink import pytest from filemanager import FileManager WORKDIR = realpath('test_filemanager') def workdir_pref(path): return join(WORKDIR, path) @pytest.fixture(scope='module') def manager(): 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) yield FileManager(dirs[0], dirs[:-1], exclude=['*/dir_01/*', '*.bin']) rmtree(WORKDIR) @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')) mkdir(newdir) manager.workdir = newdir assert manager.workdir == newdir rmdir(newdir) @pytest.mark.parametrize('excdir', ['/', workdir_pref('dir_02')]) def test_select_excluded_dirs(manager, excdir): allowed = manager.allowed_directories 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 @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) @pytest.mark.parametrize('path', [ ['dir_00', 'illegal.bin'], ['dir_01', 'legal.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 with pytest.raises(OSError): manager.filename = path[1] remove(newfile) @pytest.mark.parametrize('path', [ ['dir_02/empty.txt', 'dir_00/link.txt'], ['dir_01/empty.txt', 'dir_00/link.bin'] ]) 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_read_write_file(manager): for _ in range(128): manager.workdir = workdir_pref('dir_00') 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: assert ifile.read() == content