diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_import_myst.py | 101 | ||||
| -rw-r--r-- | tests/test_swap_sources.py | 238 |
2 files changed, 0 insertions, 339 deletions
diff --git a/tests/test_import_myst.py b/tests/test_import_myst.py deleted file mode 100644 index 1d975b45..00000000 --- a/tests/test_import_myst.py +++ /dev/null @@ -1,101 +0,0 @@ -"""Tests for import_myst.py — run with: - cd tests && PYTHONPATH=../scripts python3 -m pytest test_import_myst.py -v -""" -import warnings -from pathlib import Path - -import pytest - - -# --------------------------------------------------------------------------- -# import_page tests (no git dependency) -# --------------------------------------------------------------------------- - -def test_import_single_page(tmp_path): - """Creates md-{name}.md with the given content.""" - from import_myst import import_page - - docs = tmp_path / "docs" - docs.mkdir() - content = b"# quick-start\nHello MyST\n" - - result = import_page("quick-start", content, docs, force=False) - - assert result is True - dest = docs / "md-quick-start.md" - assert dest.exists() - assert dest.read_bytes() == content - - -def test_import_skip_identical(tmp_path): - """Returns False and does not modify the file when content is identical.""" - from import_myst import import_page - - docs = tmp_path / "docs" - docs.mkdir() - content = b"# quick-start\nIdentical content\n" - dest = docs / "md-quick-start.md" - dest.write_bytes(content) - mtime_before = dest.stat().st_mtime_ns - - result = import_page("quick-start", content, docs, force=False) - - assert result is False - assert dest.read_bytes() == content - assert dest.stat().st_mtime_ns == mtime_before - - -def test_import_warn_different_without_force(tmp_path): - """Returns False and keeps old content when content differs and force=False.""" - from import_myst import import_page - - docs = tmp_path / "docs" - docs.mkdir() - old_content = b"# old content\n" - new_content = b"# new content\n" - dest = docs / "md-quick-start.md" - dest.write_bytes(old_content) - - with warnings.catch_warnings(record=True) as caught: - warnings.simplefilter("always") - result = import_page("quick-start", new_content, docs, force=False) - - assert result is False - assert dest.read_bytes() == old_content - assert len(caught) == 1 - assert "force" in str(caught[0].message).lower() - - -def test_import_overwrite_with_force(tmp_path): - """Returns True and writes new content when force=True.""" - from import_myst import import_page - - docs = tmp_path / "docs" - docs.mkdir() - old_content = b"# old content\n" - new_content = b"# new content\n" - dest = docs / "md-quick-start.md" - dest.write_bytes(old_content) - - result = import_page("quick-start", new_content, docs, force=True) - - assert result is True - assert dest.read_bytes() == new_content - - -def test_import_nested_path(tmp_path): - """Creates parent dirs and writes md-{name}.md in the correct nested location.""" - from import_myst import import_page - - docs = tmp_path / "docs" - docs.mkdir() - content = b"# zone\nFirewall zone docs\n" - - result = import_page("configuration/firewall/zone", content, docs, force=False) - - assert result is True - dest = docs / "configuration" / "firewall" / "md-zone.md" - assert dest.exists() - assert dest.read_bytes() == content - # Parent dirs were created - assert (docs / "configuration" / "firewall").is_dir() diff --git a/tests/test_swap_sources.py b/tests/test_swap_sources.py deleted file mode 100644 index 8576e056..00000000 --- a/tests/test_swap_sources.py +++ /dev/null @@ -1,238 +0,0 @@ -"""Tests for swap_sources.py — run with: - cd tests && PYTHONPATH=../scripts python -m pytest test_swap_sources.py -v -""" -import json -import os -import sys -from pathlib import Path - -import pytest - -# --------------------------------------------------------------------------- -# Helper -# --------------------------------------------------------------------------- - -def _setup_docs(tmp_path: Path, stems: list[str]) -> Path: - """Create a minimal docs/ tree with RST + md-prefixed MD files for each stem.""" - docs = tmp_path / "docs" - for stem in stems: - p = Path(stem) - name = p.name - parent = p.parent # may be "." for flat stems - target_dir = docs / parent if str(parent) != "." else docs - target_dir.mkdir(parents=True, exist_ok=True) - # RST file that would normally be the Sphinx source - (target_dir / f"{name}.rst").write_text(f".. _{name}:\n\nDummy RST for {stem}\n") - # md- prefixed MyST file waiting to be swapped in - (target_dir / f"md-{name}.md").write_text(f"# {name}\nDummy MyST for {stem}\n") - return docs - - -# --------------------------------------------------------------------------- -# parse_swap_list -# --------------------------------------------------------------------------- - -def test_parse_swap_list_basic(tmp_path): - from swap_sources import parse_swap_list - - swap_txt = tmp_path / "_swap.txt" - swap_txt.write_text( - "# comment\n" - "\n" - "configuration/firewall/zone\n" - " quick-start \n" # leading/trailing whitespace - "# another comment\n" - "installation/virtual/vmware\n" - ) - stems = parse_swap_list(swap_txt) - assert stems == [ - "configuration/firewall/zone", - "quick-start", - "installation/virtual/vmware", - ] - - -def test_parse_swap_list_empty(tmp_path): - from swap_sources import parse_swap_list - - missing = tmp_path / "_swap.txt" - assert parse_swap_list(missing) == [] - - -# --------------------------------------------------------------------------- -# do_swap -# --------------------------------------------------------------------------- - -def test_swap_renames_files(tmp_path): - from swap_sources import do_swap - - stems = ["quick-start"] - docs = _setup_docs(tmp_path, stems) - (tmp_path / "docs" / "_swap.txt").write_text("quick-start\n") - - do_swap(docs) - - assert (docs / "quick-start.md").exists(), "md- file should be renamed to plain .md" - assert not (docs / "md-quick-start.md").exists(), "md- prefix file should be gone" - assert (docs / "quick-start.rst").exists(), "RST file should still exist" - - -def test_swap_creates_state_file(tmp_path): - from swap_sources import do_swap - - stems = ["quick-start"] - docs = _setup_docs(tmp_path, stems) - (docs / "_swap.txt").write_text("quick-start\n") - - do_swap(docs) - - state_file = docs / "_build" / "_swap_state.json" - assert state_file.exists(), "state file should be created in _build/" - - state = json.loads(state_file.read_text()) - assert state["version"] == 1 - assert len(state["swaps"]) == 1 - - entry = state["swaps"][0] - assert entry["stem"] == "quick-start" - assert "md_from" in entry - assert "md_to" in entry - assert "rst_excluded" in entry - - -def test_swap_creates_exclude_file(tmp_path): - from swap_sources import do_swap - - stems = ["quick-start"] - docs = _setup_docs(tmp_path, stems) - (docs / "_swap.txt").write_text("quick-start\n") - - do_swap(docs) - - exclude_file = docs / "_build" / "_swap_exclude.txt" - assert exclude_file.exists(), "exclude file should be created in _build/" - - lines = [l.strip() for l in exclude_file.read_text().splitlines() if l.strip()] - assert "quick-start.rst" in lines - - -# --------------------------------------------------------------------------- -# do_restore -# --------------------------------------------------------------------------- - -def test_restore_undoes_renames(tmp_path): - from swap_sources import do_restore, do_swap - - stems = ["quick-start"] - docs = _setup_docs(tmp_path, stems) - (docs / "_swap.txt").write_text("quick-start\n") - - do_swap(docs) - assert (docs / "quick-start.md").exists() - - do_restore(docs) - - assert (docs / "md-quick-start.md").exists(), "md- prefix file should be restored" - assert not (docs / "quick-start.md").exists(), "plain .md should be gone after restore" - - state_file = docs / "_build" / "_swap_state.json" - exclude_file = docs / "_build" / "_swap_exclude.txt" - assert not state_file.exists(), "state file should be deleted after restore" - assert not exclude_file.exists(), "exclude file should be deleted after restore" - - -def test_restore_noop_without_state(tmp_path): - from swap_sources import do_restore - - docs = tmp_path / "docs" - docs.mkdir() - # Should not raise even with no state file - do_restore(docs) # no error = pass - - -# --------------------------------------------------------------------------- -# Collision / validation -# --------------------------------------------------------------------------- - -def test_swap_fails_on_collision(tmp_path): - from swap_sources import do_swap - - stems = ["quick-start", "cli"] - docs = _setup_docs(tmp_path, stems) - (docs / "_swap.txt").write_text("quick-start\ncli\n") - - # Simulate a collision: unprefixed .md already exists for "cli" - (docs / "cli.md").write_text("# collision\n") - - with pytest.raises(RuntimeError, match="collision"): - do_swap(docs) - - # Rollback: first stem's rename should be undone - assert (docs / "md-quick-start.md").exists(), "rollback should undo completed renames" - assert not (docs / "quick-start.md").exists(), "renamed file should not exist after rollback" - - # State file should NOT be written on failure - state_file = docs / "_build" / "_swap_state.json" - assert not state_file.exists(), "no state file should be written on failure" - - -# --------------------------------------------------------------------------- -# Rollback on rename failure (monkeypatched os.rename) -# --------------------------------------------------------------------------- - -def test_swap_rollback_on_rename_failure(tmp_path, monkeypatch): - """If os.rename raises on the second call, the first rename must be undone.""" - from swap_sources import do_swap - - stems = ["quick-start", "cli"] - docs = _setup_docs(tmp_path, stems) - (docs / "_swap.txt").write_text("quick-start\ncli\n") - - call_count = {"n": 0} - real_rename = os.rename - - def failing_rename(src, dst): - call_count["n"] += 1 - if call_count["n"] == 2: - raise OSError("simulated rename failure") - real_rename(src, dst) - - monkeypatch.setattr(os, "rename", failing_rename) - - with pytest.raises(RuntimeError): - do_swap(docs) - - # First rename (quick-start) should have been rolled back - assert (docs / "md-quick-start.md").exists(), "rollback should undo the first rename" - assert not (docs / "quick-start.md").exists(), "renamed file should not exist after rollback" - - # No state file should exist - assert not (docs / "_build" / "_swap_state.json").exists() - - -# --------------------------------------------------------------------------- -# Nested paths -# --------------------------------------------------------------------------- - -def test_swap_nested_paths(tmp_path): - from swap_sources import do_swap, do_restore - - stems = ["configuration/firewall/zone"] - docs = _setup_docs(tmp_path, stems) - (docs / "_swap.txt").write_text("configuration/firewall/zone\n") - - do_swap(docs) - - swapped = docs / "configuration" / "firewall" / "zone.md" - md_source = docs / "configuration" / "firewall" / "md-zone.md" - assert swapped.exists(), "nested md file should be renamed" - assert not md_source.exists() - - exclude_file = docs / "_build" / "_swap_exclude.txt" - lines = [l.strip() for l in exclude_file.read_text().splitlines() if l.strip()] - assert "configuration/firewall/zone.rst" in lines - - do_restore(docs) - - assert md_source.exists(), "nested md- file should be restored" - assert not swapped.exists() |
