# Copyright (c) 2025-2026 Zensical and contributors
# SPDX-License-Identifier: MIT
# All contributions are certified under the DCO
"""Integration tests for MkDocs-compatible HTML minification."""
from __future__ import annotations
import hashlib
import re
import subprocess
import sys
import time
from typing import TYPE_CHECKING
import pytest
import zensical
if TYPE_CHECKING:
from collections.abc import Callable
from pathlib import Path
def _project(root: Path, *, minify_html: bool = True) -> Path:
"""Create a project exercising HTML and inline language minification."""
docs = root / "docs"
docs.mkdir()
(docs / "index.md").write_text(
"""\
# Minify
preserved text
""",
encoding="utf-8",
)
config = root / "mkdocs.yml"
config.write_text(
f"""\
site_name: Minify
plugins:
- minify:
minify_html: {str(minify_html).lower()}
minify_inline_js: true
minify_inline_css: true
htmlmin_opts:
remove_comments: true
""",
encoding="utf-8",
)
return config
def test_minifies_final_html_and_inline_languages(tmp_path: Path) -> None:
"""HTML runs last while script/style use parser-backed minifiers."""
zensical.build(
str(_project(tmp_path)), {"clean": False, "strict": False}
)
output = (tmp_path / "site" / "index.html").read_text()
assert "remove this comment" not in output
assert " preserved text
" in output
assert "const value={nested:{answer:42}};" in output
assert "value?.nested?.answer??0" in output
assert "screen and (min-width:45em)" in output
assert "screen and(" not in output
assert '{ "preserved": true }' in output
def test_inline_minification_does_not_require_html_minification(
tmp_path: Path,
) -> None:
"""Inline-only mode retains the surrounding rendered HTML byte shape."""
zensical.build(
str(_project(tmp_path, minify_html=False)),
{"clean": False, "strict": False},
)
output = (tmp_path / "site" / "index.html").read_text()
assert "" in output
assert '