openflexure-microscope-server/tests/unit_tests/test_utilities.py
2026-03-06 09:53:41 +00:00

86 lines
3.1 KiB
Python

"""Unit tests for utility functions."""
import sys
import pytest
from openflexure_microscope_server.utilities import (
_WINDOWS_RESERVED_NAMES,
make_name_safe,
make_path_safe,
)
def test_make_name_safe_basic():
"""Test basic functionality of make_name_safe."""
assert make_name_safe("normal_name") == "normal_name"
assert make_name_safe("name with spaces") == "name_with_spaces"
assert make_name_safe("name/with/slashes") == "name_with_slashes"
assert make_name_safe("name\\with\\backslashes") == "name_with_backslashes"
def test_make_name_safe_trailing_chars():
"""Test that trailing dots and spaces are removed."""
assert make_name_safe("name.") == "name"
assert make_name_safe("name ") == "name"
assert make_name_safe("name. ") == "name"
assert make_name_safe("name .") == "name"
assert make_name_safe(".") == "_"
assert make_name_safe(" ") == "_"
assert make_name_safe(". ") == "_"
@pytest.mark.parametrize("name", _WINDOWS_RESERVED_NAMES)
def test_make_name_safe_reserved_names(name):
"""Test Windows reserved names."""
# Base name should be sanitized
assert make_name_safe(name) == f"{name}_"
# Case-insensitive
assert make_name_safe(name.lower()) == f"{name.lower()}_"
# With extension
assert make_name_safe(f"{name}.txt") == f"{name}.txt_"
# Multiple extensions
assert make_name_safe(f"{name}.tar.gz") == f"{name}.tar.gz_"
def test_make_name_safe_reserved_names_false_positives():
"""Test that names containing but not equal to reserved names are safe."""
assert make_name_safe("CONSTANT") == "CONSTANT"
assert make_name_safe("CON2") == "CON2"
assert make_name_safe("ICON") == "ICON"
assert make_name_safe("CHILLI CON CARNE") == "CHILLI_CON_CARNE"
def test_make_path_safe_basic():
"""Test basic functionality of make_path_safe."""
# Note: behavior depends on platform for separators
if sys.platform.startswith("win"):
assert make_path_safe("C:\\path\\to/file") == "C:\\path\\to/file"
else:
# On POSIX, \ is not a separator and might be replaced by _ if not in allowed pattern
# The regex for POSIX is [^a-zA-Z0-9_.\-/]
# And : is also not allowed
assert make_path_safe("path/to/file") == "path/to/file"
def test_make_path_safe_reserved_in_components():
"""Test reserved names within path components."""
assert make_path_safe("path/CON/file") == "path/CON_/file"
assert make_path_safe("path/NUL.txt/file") == "path/NUL.txt_/file"
if sys.platform.startswith("win"):
assert make_path_safe("C:/AUX/test") == "C:/AUX_/test"
else:
assert make_path_safe("C:/AUX/test") == "C_/AUX_/test"
def test_make_path_safe_trailing_in_components():
"""Test trailing chars in path components."""
assert make_path_safe("path /to. /file ") == "path/to/file"
assert make_path_safe("path./to /file.") == "path/to/file"
def test_make_path_safe_separators():
"""Test that separators are preserved and components sanitised."""
assert make_path_safe("a/b\\c") == "a/b\\c"
assert make_path_safe("a./b /c.") == "a/b/c"