Files
rendercv/tests/cli/render_command/test_render_command.py
2025-12-12 22:27:12 +03:00

209 lines
6.8 KiB
Python

import os
from unittest.mock import MagicMock, patch
import pytest
from rendercv.cli.new_command.new_command import cli_command_new
from rendercv.cli.render_command.render_command import cli_command_render
class TestCliCommandRender:
@pytest.fixture
def default_arguments(self):
context = MagicMock()
context.args = []
return {
"design": None,
"locale": None,
"settings": None,
"typst_path": None,
"pdf_path": None,
"markdown_path": None,
"html_path": None,
"png_path": None,
"dont_generate_markdown": False,
"dont_generate_html": False,
"dont_generate_typst": False,
"dont_generate_pdf": False,
"dont_generate_png": False,
"watch": False,
"quiet": False,
"_": None,
"extra_data_model_override_arguments": context,
}
@pytest.fixture
def input_file(self, tmp_path):
os.chdir(tmp_path)
cli_command_new(
full_name="John Doe",
create_typst_templates=False,
create_markdown_templates=False,
)
return tmp_path / "John_Doe_CV.yaml"
@pytest.mark.parametrize(
("quiet", "flags", "expected_files", "missing_files"),
[
# Default: generates all files
(
False,
{},
[
"John_Doe_CV.typ",
"John_Doe_CV.pdf",
"John_Doe_CV_1.png",
"John_Doe_CV.md",
"John_Doe_CV.html",
],
[],
),
(
True,
{},
[
"John_Doe_CV.typ",
"John_Doe_CV.pdf",
"John_Doe_CV_1.png",
"John_Doe_CV.md",
"John_Doe_CV.html",
],
[],
),
# dont_generate_markdown: skips markdown and HTML
(
False,
{"dont_generate_markdown": True},
["John_Doe_CV.typ", "John_Doe_CV.pdf", "John_Doe_CV_1.png"],
["John_Doe_CV.md", "John_Doe_CV.html"],
),
# dont_generate_html: skips only HTML
(
False,
{"dont_generate_html": True},
[
"John_Doe_CV.typ",
"John_Doe_CV.pdf",
"John_Doe_CV_1.png",
"John_Doe_CV.md",
],
["John_Doe_CV.html"],
),
# dont_generate_typst: skips Typst, PDF, and PNG
(
False,
{"dont_generate_typst": True},
["John_Doe_CV.md", "John_Doe_CV.html"],
["John_Doe_CV.typ", "John_Doe_CV.pdf", "John_Doe_CV_1.png"],
),
# dont_generate_pdf: skips only PDF
(
False,
{"dont_generate_pdf": True},
[
"John_Doe_CV.typ",
"John_Doe_CV_1.png",
"John_Doe_CV.md",
"John_Doe_CV.html",
],
["John_Doe_CV.pdf"],
),
# dont_generate_png: skips only PNG
(
False,
{"dont_generate_png": True},
[
"John_Doe_CV.typ",
"John_Doe_CV.pdf",
"John_Doe_CV.md",
"John_Doe_CV.html",
],
["John_Doe_CV_1.png"],
),
],
)
def test_output_file_generation(
self, input_file, default_arguments, quiet, flags, expected_files, missing_files
):
cli_command_render(
input_file_name=input_file,
**{**default_arguments, "quiet": quiet, **flags},
)
rendercv_output = input_file.parent / "rendercv_output"
for file in expected_files:
assert (rendercv_output / file).exists()
for file in missing_files:
assert not (rendercv_output / file).exists()
def test_uses_custom_output_paths(self, input_file, default_arguments):
custom_paths = {
"typst_path": input_file.parent / "custom.typ",
"pdf_path": input_file.parent / "custom.pdf",
"markdown_path": input_file.parent / "custom.md",
"html_path": input_file.parent / "custom.html",
"png_path": input_file.parent / "custom.png",
}
cli_command_render(
input_file_name=input_file,
**{**default_arguments, **custom_paths},
)
assert (input_file.parent / "custom.typ").exists()
assert (input_file.parent / "custom.pdf").exists()
assert (input_file.parent / "custom.md").exists()
assert (input_file.parent / "custom.html").exists()
assert (input_file.parent / "custom_1.png").exists()
def test_accepts_relative_input_file_path(self, input_file, default_arguments):
cli_command_render(
input_file_name=input_file.name,
**default_arguments,
)
rendercv_output = input_file.parent / "rendercv_output"
assert (rendercv_output / "John_Doe_CV.pdf").exists()
@patch("rendercv.cli.render_command.render_command.run_function_if_file_changes")
def test_calls_watcher_when_watch_flag_is_true(
self, mock_watcher, input_file, default_arguments
):
cli_command_render(
input_file_name=input_file,
**{**default_arguments, "watch": True},
)
mock_watcher.assert_called_once()
call_args = mock_watcher.call_args
assert call_args[0][0] == input_file.absolute()
@pytest.mark.parametrize(
("config_type", "config_content", "expected_in_output"),
[
("design", "design:\n theme: moderncv\n", "Fontin"),
(
"locale",
"locale:\n language: turkish\n",
'locale-catalog-language: "tr"',
),
("settings", "settings:\n current_date: 1999-01-15\n", "Jan 1999"),
],
)
def test_uses_custom_config_files(
self,
input_file,
default_arguments,
config_type,
config_content,
expected_in_output,
):
config_file = input_file.parent / f"custom_{config_type}.yaml"
config_file.write_text(config_content, encoding="utf-8")
arguments = {**default_arguments, config_type: config_file}
cli_command_render(input_file_name=input_file, **arguments)
typst_file = input_file.parent / "rendercv_output" / "John_Doe_CV.typ"
assert expected_in_output in typst_file.read_text()