Skip to content

Commit 3bae7f3

Browse files
LostSunsetclaude
andcommitted
fix: add smoke tests for CI (23 tests for core modules)
- Import smoke tests for all 11 core modules - Unit tests for utils (ensure_unique_path, validate_pdf, human_readable_size) - Unit tests for split (parse_page_ranges, SplitMode) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3c8c811 commit 3bae7f3

3 files changed

Lines changed: 101 additions & 0 deletions

File tree

tests/test_core/test_imports.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""Smoke tests: verify all modules can be imported."""
2+
3+
import importlib
4+
5+
import pytest
6+
7+
CORE_MODULES = [
8+
"pdf_toolbox",
9+
"pdf_toolbox.core.utils",
10+
"pdf_toolbox.core.unlock",
11+
"pdf_toolbox.core.convert",
12+
"pdf_toolbox.core.protect",
13+
"pdf_toolbox.core.merge",
14+
"pdf_toolbox.core.split",
15+
"pdf_toolbox.core.rotate",
16+
"pdf_toolbox.core.watermark",
17+
"pdf_toolbox.core.compress",
18+
"pdf_toolbox.core.reorder",
19+
]
20+
21+
22+
@pytest.mark.parametrize("module_name", CORE_MODULES)
23+
def test_import_core_module(module_name: str) -> None:
24+
mod = importlib.import_module(module_name)
25+
assert mod is not None

tests/test_core/test_split.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""Tests for core split module."""
2+
3+
from pdf_toolbox.core.split import SplitMode, parse_page_ranges
4+
5+
6+
class TestParsePageRanges:
7+
def test_single_page(self) -> None:
8+
result = parse_page_ranges("3", total_pages=10)
9+
assert result == [(2, 2)]
10+
11+
def test_range(self) -> None:
12+
result = parse_page_ranges("1-3", total_pages=10)
13+
assert result == [(0, 2)]
14+
15+
def test_multiple_ranges(self) -> None:
16+
result = parse_page_ranges("1-3, 5, 7-9", total_pages=10)
17+
assert len(result) == 3
18+
assert result[0] == (0, 2)
19+
assert result[1] == (4, 4)
20+
assert result[2] == (6, 8)
21+
22+
23+
class TestSplitMode:
24+
def test_modes_exist(self) -> None:
25+
assert SplitMode.BY_RANGE is not None
26+
assert SplitMode.EVERY_N_PAGES is not None
27+
assert SplitMode.EXTRACT_PAGES is not None

tests/test_core/test_utils.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""Tests for core utility functions."""
2+
3+
from pathlib import Path
4+
5+
from pdf_toolbox.core.utils import ensure_unique_path, human_readable_size, validate_pdf
6+
7+
8+
class TestEnsureUniquePath:
9+
def test_unique_path_no_conflict(self, tmp_path: Path) -> None:
10+
target = tmp_path / "output.pdf"
11+
result = ensure_unique_path(target)
12+
assert result == target
13+
14+
def test_unique_path_with_conflict(self, tmp_path: Path) -> None:
15+
target = tmp_path / "output.pdf"
16+
target.touch()
17+
result = ensure_unique_path(target)
18+
assert result != target
19+
assert result.stem.startswith("output")
20+
assert result.suffix == ".pdf"
21+
22+
23+
class TestValidatePdf:
24+
def test_valid_pdf(self, tmp_path: Path) -> None:
25+
pdf = tmp_path / "test.pdf"
26+
pdf.write_bytes(b"%PDF-1.4 fake content")
27+
assert validate_pdf(pdf) is True
28+
29+
def test_invalid_extension(self, tmp_path: Path) -> None:
30+
txt = tmp_path / "test.txt"
31+
txt.write_text("not a pdf")
32+
assert validate_pdf(txt) is False
33+
34+
def test_nonexistent_file(self, tmp_path: Path) -> None:
35+
assert validate_pdf(tmp_path / "missing.pdf") is False
36+
37+
38+
class TestHumanReadableSize:
39+
def test_bytes(self) -> None:
40+
result = human_readable_size(500)
41+
assert "500" in result and "B" in result
42+
43+
def test_kilobytes(self) -> None:
44+
result = human_readable_size(1536)
45+
assert "KB" in result
46+
47+
def test_megabytes(self) -> None:
48+
result = human_readable_size(2 * 1024 * 1024)
49+
assert "MB" in result

0 commit comments

Comments
 (0)