95 lines
3.3 KiB
Python
95 lines
3.3 KiB
Python
# pylint: disable=redefined-outer-name
|
|
from dataclasses import dataclass
|
|
from secrets import token_urlsafe
|
|
from os import mkdir, symlink
|
|
from os.path import join, realpath, basename
|
|
from pathlib import Path
|
|
from tempfile import TemporaryDirectory
|
|
|
|
import pytest
|
|
|
|
from .file_manager import FileManager
|
|
|
|
|
|
@dataclass
|
|
class ManagerContext:
|
|
workdir: str
|
|
subdir: str
|
|
subfile: str
|
|
manager: FileManager
|
|
|
|
def create_random_file(self, dirname, extension):
|
|
filename = self.join(f'{dirname}/{generate_name()}{extension}')
|
|
Path(filename).touch()
|
|
return filename
|
|
|
|
def create_random_folder(self, basepath):
|
|
dirname = self.join(f'{basepath}/{generate_name()}')
|
|
mkdir(dirname)
|
|
return dirname
|
|
|
|
def create_random_link(self, source, dirname, extension):
|
|
linkname = self.join(f'{dirname}/{generate_name()}{extension}')
|
|
symlink(source, linkname)
|
|
return linkname
|
|
|
|
def join(self, path):
|
|
return join(self.workdir, path)
|
|
|
|
def generate_name():
|
|
return token_urlsafe(16)
|
|
|
|
@pytest.fixture()
|
|
def context():
|
|
with TemporaryDirectory() as workdir:
|
|
workdir = realpath(workdir) # macOS uses a symlinked TMPDIR
|
|
subdir = join(workdir, generate_name())
|
|
subfile = join(subdir, generate_name() + '.txt')
|
|
mkdir(subdir)
|
|
Path(subfile).touch()
|
|
manager = FileManager([join(workdir, '**/*.txt')])
|
|
yield ManagerContext(workdir, subdir, subfile, manager)
|
|
|
|
def test_matching_files(context):
|
|
newdir = context.create_random_folder(context.subdir)
|
|
newfile = context.create_random_file(newdir, '.txt')
|
|
newlink = context.create_random_link(newfile, newdir, '.txt')
|
|
assert set(context.manager.files) == {context.subfile, newfile, newlink}
|
|
|
|
def test_unmatching_files(context):
|
|
newtxt = context.create_random_file(context.workdir, '.txt')
|
|
newbin = context.create_random_file(context.subdir, '.bin')
|
|
context.create_random_link(newtxt, context.subdir, '.txt')
|
|
context.create_random_link(newbin, context.subdir, '.txt')
|
|
assert context.manager.files == [context.subfile]
|
|
|
|
def test_parents(context):
|
|
newdir = context.create_random_folder(context.workdir)
|
|
context.manager.patterns += [f'{newdir}/[!/@]*/**/?.c']
|
|
assert set(context.manager.parents) == {context.workdir, newdir}
|
|
|
|
def test_read_write_file(context):
|
|
for _ in range(128):
|
|
content = token_urlsafe(32)
|
|
context.manager.write_file(context.subfile, content)
|
|
assert context.manager.read_file(context.subfile) == content
|
|
with open(context.subfile, 'r') as ifile:
|
|
assert ifile.read() == content
|
|
|
|
def test_regular_ide_actions(context):
|
|
newfile1 = context.create_random_file(context.subdir, '.txt')
|
|
newfile2 = context.create_random_file(context.subdir, '.txt')
|
|
for _ in range(4):
|
|
context.manager.filename = newfile1
|
|
content1, content2 = token_urlsafe(32), token_urlsafe(32)
|
|
context.manager.write_file(newfile1, content1)
|
|
context.manager.write_file(newfile2, content2)
|
|
assert context.manager.read_file(newfile1) == content1
|
|
assert context.manager.read_file(newfile2) == content2
|
|
|
|
def test_find_file(context):
|
|
for _ in range(5):
|
|
file_abs = context.create_random_file(context.subdir, '.txt')
|
|
file_base = basename(file_abs)
|
|
assert context.manager.find_file(file_base) == file_abs
|