#43 — Имя файла и пути по умолчанию: - resolve_output_path() в yaml_config.py: резолвит --output с учётом output.dir, filename_template, default_format из YAML-конфига - Bare format (xlsx/odt/...) → путь по шаблону - Без расширения → автодописывается default_format (.xlsx) - Config.get_output_dir/filename/default_format() #47 — datetime precision и дедупликация: - period.last_used.from/to в YAML-конфиге и AppConfig - period.precision: date|datetime - _compute_dedup_cutoff() в cli.py: при precision=datetime вычисляет cutoff из period.last_used.to - _parse_datetime() + AND-логика дедупликации в client.py: запись исключается если created_on И updated_on < cutoff - Пропуск issues без часов после дедупликации Closes #43 Closes #47
This commit is contained in:
@@ -122,3 +122,87 @@ class TestExpandFilenameTemplate:
|
||||
ext="xlsx",
|
||||
)
|
||||
assert result == "Кокос_А.А._{unknown}.xlsx"
|
||||
|
||||
|
||||
class TestResolveOutputPath:
|
||||
"""Tests for resolve_output_path()."""
|
||||
|
||||
def test_none_returns_none(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
assert resolve_output_path(None) is None
|
||||
|
||||
def test_explicit_path_with_known_extension_is_unchanged(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
result = resolve_output_path("/tmp/report.xlsx")
|
||||
assert result == "/tmp/report.xlsx"
|
||||
|
||||
def test_explicit_path_with_unknown_extension_is_unchanged(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
result = resolve_output_path("report.odt")
|
||||
assert result == "report.odt"
|
||||
|
||||
def test_no_extension_appends_default_format(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
result = resolve_output_path("report", default_format="xlsx")
|
||||
assert result == "report.xlsx"
|
||||
|
||||
def test_no_extension_appends_custom_default_format(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
result = resolve_output_path("file", default_format="csv")
|
||||
assert result == "file.csv"
|
||||
|
||||
def test_bare_format_name_resolves_to_template_path(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
result = resolve_output_path(
|
||||
"xlsx",
|
||||
output_dir="/tmp/reports",
|
||||
filename_template="{date}.{ext}",
|
||||
author="Кокос А.А.",
|
||||
from_date="2026-06-01",
|
||||
to_date="2026-06-30",
|
||||
default_format="xlsx",
|
||||
)
|
||||
assert result == "/tmp/reports/30_06_2026.xlsx"
|
||||
|
||||
def test_bare_format_name_odt_resolves_to_template_path(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
result = resolve_output_path(
|
||||
"odt",
|
||||
output_dir="~/reports",
|
||||
filename_template="{author}_{from}_{to}.{ext}",
|
||||
author="Кокос А.А.",
|
||||
from_date="2026-06-01",
|
||||
to_date="2026-06-30",
|
||||
default_format="xlsx",
|
||||
)
|
||||
assert result.startswith("/") and result.endswith(
|
||||
"/reports/Кокос_А.А._2026-06-01_2026-06-30.odt"
|
||||
)
|
||||
assert "~" not in result
|
||||
|
||||
def test_bare_format_name_with_empty_output_dir_uses_cwd(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
result = resolve_output_path(
|
||||
"csv",
|
||||
output_dir="",
|
||||
filename_template="report.{ext}",
|
||||
author="A",
|
||||
from_date="2026-01-01",
|
||||
to_date="2026-01-31",
|
||||
)
|
||||
assert not result.startswith("/")
|
||||
assert "report.csv" in result
|
||||
|
||||
def test_unknown_bare_format_is_treated_as_path(self):
|
||||
from redmine_reporter.yaml_config import resolve_output_path
|
||||
|
||||
result = resolve_output_path("unknown_format")
|
||||
assert result == "unknown_format.xlsx"
|
||||
|
||||
Reference in New Issue
Block a user