mirror of
				https://github.com/avatao-content/baseimage-tutorial-framework
				synced 2025-11-04 06:32:55 +00:00 
			
		
		
		
	Make fixtures function scoped and add new tests
This commit is contained in:
		@@ -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):
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user