Source code for faker_file.tests.test_cli

import logging
import re
import subprocess
import unittest
from importlib import import_module, reload
from typing import Union

from parametrize import parametrize

from ..cli.command import main
from ..registry import FILE_REGISTRY
from ..storages.filesystem import FileSystemStorage

__author__ = "Artur Barseghyan <artur.barseghyan@gmail.com>"
__copyright__ = "2022-2023 Artur Barseghyan"
__license__ = "MIT"
__all__ = ("TestCLI",)

LOGGER = logging.getLogger(__name__)


VERSION_PATTERN = re.compile(r"^\d+(\.\d+){0,2}$")
FS_STORAGE = FileSystemStorage()
FILE_PATH_PATTERN = re.compile(r"/.+")


def convert_value_to_cli_arg(value) -> str:
    if isinstance(value, bool):
        return str(value).lower()
    elif isinstance(value, (int, float, str)):
        return str(value)
    else:
        raise ValueError(f"Unsupported value type: {type(value)}")


def extract_filename(val) -> Union[str, None]:
    match = FILE_PATH_PATTERN.search(val)
    if match:
        extracted_path = match.group(0)
        return extracted_path


[docs]class TestCLI(unittest.TestCase): """CLI tests."""
[docs] def tearDown(self) -> None: super().tearDown() FILE_REGISTRY.clean_up()
@parametrize( "method_name, kwargs", [ # BIN ( "bin_file", {}, ), ( "bin_file", {"length": 1_024}, ), # CSV ( "csv_file", {}, ), ( "csv_file", {"num_rows": 20}, ), # DOCX ( "docx_file", {}, ), ( "docx_file", {"wrap_chars_after": 40}, ), # EML ( "eml_file", {}, ), ( "eml_file", {"wrap_chars_after": 40}, ), # EPUB ( "epub_file", {}, ), ( "epub_file", {"wrap_chars_after": 40}, ), # Generic ( "generic_file", { "content": "<html><body><p>{{text}}</p></body></html>", "extension": "html", }, ), # ICO ( "ico_file", {}, ), ( "ico_file", {"wrap_chars_after": 40}, ), # JPEG ( "jpeg_file", {}, ), ( "jpeg_file", {"wrap_chars_after": 40}, ), # MP3 ( "mp3_file", {}, ), ( "mp3_file", {"max_nb_chars": 256}, ), # ODP ( "odp_file", {}, ), ( "odp_file", {"wrap_chars_after": 40}, ), # ODS ( "ods_file", {}, ), ( "ods_file", {"num_rows": 20}, ), # ODT ( "odt_file", {}, ), ( "odt_file", {"wrap_chars_after": 40}, ), # PDF ( "pdf_file", {}, ), ( "pdf_file", {"wrap_chars_after": 40}, ), # PNG ( "png_file", {}, ), ( "png_file", {"wrap_chars_after": 40}, ), # PPTX ( "pptx_file", {}, ), ( "pptx_file", {"wrap_chars_after": 40}, ), # RTF ( "rtf_file", {}, ), ( "rtf_file", {"wrap_chars_after": 40}, ), # SVG ( "svg_file", {}, ), ( "svg_file", {"wrap_chars_after": 40}, ), # TAR ( "tar_file", {}, ), ( "tar_file", {"prefix": "ttt_"}, ), # TXT ( "txt_file", {}, ), ( "txt_file", {"wrap_chars_after": 40}, ), # # WEBP # ( # "webp_file", # {}, # ), # ( # "webp_file", # {}, # ), # XLSX ( "xlsx_file", {}, ), ( "xlsx_file", {"num_rows": 20}, ), # ZIP ( "zip_file", {}, ), ( "zip_file", {"prefix": "ttt_"}, ), ], ) def test_cli(self: "TestCLI", method_name: str, kwargs: dict) -> None: """Test CLI.""" # Convert kwargs to command-line arguments args = [ f"--{key}={convert_value_to_cli_arg(value)}" for key, value in kwargs.items() ] # Merge the base command with the generated arguments cmd = ["faker-file", method_name] + args # LOGGER.debug(f"cmd: {cmd}") # Execute the command with the provided arguments res = subprocess.check_output(cmd).strip() # Extract the filename to verify existence and clean-up filename = extract_filename(res.decode()) # LOGGER.debug(f"filename: {filename}") self.assertTrue(filename) self.assertTrue(FS_STORAGE.exists(filename)) FS_STORAGE.unlink(filename)
[docs] def test_cli_error_no_provider(self: "TestCLI") -> None: """Test CLI, no provider given.""" with self.assertRaises(subprocess.CalledProcessError): res = subprocess.check_output(["faker-file"]).strip() self.assertFalse(res)
[docs] def test_cli_generate_completion(self: "TestCLI") -> None: """Test CLI, generate-completion.""" cmd = ["faker-file", "generate-completion"] res = subprocess.check_output(cmd).strip() self.assertTrue(res)
[docs] def test_cli_version(self: "TestCLI") -> None: """Test CLI, version.""" cmd = ["faker-file", "version"] res = subprocess.check_output(cmd).strip() self.assertTrue(VERSION_PATTERN.match(res.decode()))
[docs] def test_broken_imports(self: "TestCLI") -> None: """Test broken imports.""" _module = import_module("faker_file.cli.helpers") del _module.__dict__["PROVIDERS"] with self.assertRaises(SystemExit): main() reload(_module)