Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_zipfile_converter.py 3.65 KiB
#!/usr/bin/env python3
# encoding: utf-8
#
# This file is a part of the LinkAhead Project.
#
# Copyright (C) 2024 Indiscale GmbH <info@indiscale.com>
# Copyright (C) 2024 Alexander Schlemmer <a.schlemmer@indiscale.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#

"""
test the zip-file converter
"""
import importlib
import os
from pathlib import Path

import pytest
import yaml
from caoscrawler.converters import DirectoryConverter, ZipFileConverter
from caoscrawler.stores import GeneralStore
from caoscrawler.structure_elements import Directory, File

UNITTESTDIR = Path(__file__).parent


@pytest.fixture
def converter_registry():
    converter_registry: dict[str, dict[str, str]] = {
        "ZipFile": {
            "converter": "ZipFileConverter",
            "package": "caoscrawler.converters"},
    }

    for key, value in converter_registry.items():
        module = importlib.import_module(value["package"])
        value["class"] = getattr(module, value["converter"])
    return converter_registry


@pytest.mark.xfail(
    reason="The example files for PASTA have not yet been updated in:"
    "https://github.com/TheELNConsortium/TheELNFileFormat/tree/master/examples/PASTA"
    "However, there was the announcement that these files are going to follow the"
    "flattened structure soon: https://github.com/TheELNConsortium/TheELNFileFormat/issues/98"
)
def test_zipfile_converter(converter_registry):
    zipfile = File("PASTA.eln", os.path.join(UNITTESTDIR, "eln_files", "PASTA.eln"))
    zip_conv = ZipFileConverter(yaml.safe_load("""
type: ZipFile
match: .*$
"""), "TestZipFileConverter", converter_registry)

    match = zip_conv.match(zipfile)
    assert match is not None

    children = zip_conv.create_children(GeneralStore(), zipfile)
    assert len(children) == 1
    assert children[0].name == "PASTA"

    dir_conv = DirectoryConverter(yaml.safe_load("""
type: Directory
match: ^PASTA$
"""), "TestDirectory", converter_registry)
    match = dir_conv.match(children[0])
    assert match is not None
    children = dir_conv.create_children(GeneralStore(), children[0])
    assert len(children) == 5
    print(children)
    for i in range(2):
        assert isinstance(children[i], Directory)
    for i in range(2, 5):
        assert isinstance(children[i], File)


def test_zipfile_minimal(converter_registry):
    zipfile = File("empty.zip", os.path.join(UNITTESTDIR, "zip_minimal", "empty.zip"))
    zip_conv = ZipFileConverter(yaml.safe_load("""
type: ZipFile
match: .*$
"""), "TestZipFileConverter", converter_registry)

    match = zip_conv.match(zipfile)
    assert match is not None

    children = zip_conv.create_children(GeneralStore(), zipfile)
    assert len(children) == 2
    assert children[1].name == "empty.txt"

    dir_conv = DirectoryConverter(yaml.safe_load("""
type: Directory
match: ^folder$
"""), "TestDirectory", converter_registry)
    match = dir_conv.match(children[0])
    assert match is not None
    children = dir_conv.create_children(GeneralStore(), children[0])
    assert len(children) == 3
    for i in range(3):
        assert isinstance(children[i], File)