"""
Test format classes.

(Some of their code is unreachable through api.py)
"""

import os
from pathlib import Path

import pytest

from conda_package_handling.conda_fmt import CondaFormat_v2
from conda_package_handling.tarball import CondaTarBZ2

from .test_api import data_dir, test_package_name

TEST_CONDA = Path(data_dir, test_package_name + ".conda")
TEST_TARBZ = Path(data_dir, test_package_name + ".tar.bz2")


def test_extract_create(tmpdir):
    for format, infile, outfile in (
        (CondaFormat_v2, TEST_CONDA, "newmock.conda"),
        (CondaTarBZ2, TEST_TARBZ, "newmock.tar.bz2"),
    ):

        both_path = Path(tmpdir, f"mkdirs-{outfile.split('.', 1)[-1]}")

        # these old APIs don't guarantee Path-like's
        format.extract(infile, str(both_path))
        assert sorted(os.listdir(both_path)) == sorted(["lib", "info"])

        if format == CondaFormat_v2:
            info_path = Path(tmpdir, "info-only")
            format.extract_info(TEST_CONDA, str(info_path))  # type: ignore
            assert os.listdir(info_path) == ["info"]

        filelist = [str(p.relative_to(both_path)) for p in both_path.rglob("*")]
        format.create(
            both_path,
            filelist,
            tmpdir / outfile,
            # compression_tuple is for libarchive compatibility. Instead, pass
            # compressor=(compressor factory function)
            compression_tuple=(".tar.zst", "zstd", "zstd:compression-level=1"),
        )

        assert (tmpdir / outfile).exists()

        with pytest.raises(ValueError):
            CondaFormat_v2.create(
                "", [], "", compressor=True, compression_tuple=("1", "2", "3")  # type: ignore
            )
