Add tests and correct stitch path

This commit is contained in:
Julian Stirling 2025-06-30 23:03:20 +01:00
parent ceefc83229
commit daf2cee481
2 changed files with 87 additions and 13 deletions

View file

@ -13,11 +13,12 @@ import zipfile
from pydantic import BaseModel from pydantic import BaseModel
STITCH_SUFFIX = "_stitched.jpg"
IMG_DIR_NAME = "images" IMG_DIR_NAME = "images"
IMAGE_REGEX = re.compile(r"-?[0-9]+_-?[0-9]+\.jpe?g$")
SCAN_ZERO_PAD_DIGITS = 4 SCAN_ZERO_PAD_DIGITS = 4
STITCH_REGEX = re.compile(r"stitched\.jpe?g$")
IMAGE_REGEX = re.compile(r"-?[0-9]+_-?[0-9]+\.jpe?g$")
class NotEnoughFreeSpaceError(IOError): class NotEnoughFreeSpaceError(IOError):
pass pass
@ -98,11 +99,14 @@ class ScanDirectoryManager:
return file_path return file_path
def get_final_stitch(self, scan_name: str) -> Optional[str]: def get_final_stitch(self, scan_name: str) -> Optional[str]:
"""Return the file path for the final stitch. """Return the file full path for the final stitch.
If no final stitch is found, return None If no final stitch is found, return None
""" """
return ScanDirectory(scan_name, self.base_dir).get_final_stitch() stitch_fname = ScanDirectory(scan_name, self.base_dir).get_final_stitch()
if stitch_fname is None:
return None
return self.get_file_from_img_dir(scan_name, stitch_fname)
@property @property
def all_scans(self) -> list[str]: def all_scans(self) -> list[str]:
@ -267,7 +271,7 @@ class ScanDirectory:
return scan_images return scan_images
if file_types in ["all", "stitches"]: if file_types in ["all", "stitches"]:
stitches = [i for i in folder_contents if i.endswith("_stitched.jpg")] stitches = [i for i in folder_contents if STITCH_REGEX.search(i)]
if file_types == "stitches": if file_types == "stitches":
return stitches return stitches
@ -279,7 +283,7 @@ class ScanDirectory:
return scan_images, stitches, dzi_files return scan_images, stitches, dzi_files
def get_final_stitch(self) -> Optional[str]: def get_final_stitch(self) -> Optional[str]:
"""Return the file path for the final stitch. """Return the filename for the final stitch (in the images dir)
If no final stitch is found, return None If no final stitch is found, return None
""" """

View file

@ -32,10 +32,13 @@ def _clear_scan_dir() -> None:
def _add_fake_image(scan_dir: ScanDirectory) -> None: def _add_fake_image(scan_dir: ScanDirectory) -> None:
"""Make a fake image on disk in the scan directory""" """Make a fake image on disk in the scan directory"""
x_pos = random.randint(-100, 100) unique = False
y_pos = random.randint(-100, 100) while not unique:
filename = f"image_{x_pos}_{y_pos}.jpg" x_pos = random.randint(-10000, 10000)
filepath = os.path.join(scan_dir.images_dir, filename) y_pos = random.randint(-10000, 10000)
filename = f"image_{x_pos}_{y_pos}.jpg"
filepath = os.path.join(scan_dir.images_dir, filename)
unique = not os.path.exists(filepath)
with open(filepath, "w") as f_obj: with open(filepath, "w") as f_obj:
f_obj.write("fake") f_obj.write("fake")
@ -211,13 +214,42 @@ def test_scan_info():
assert not info.stitch_available assert not info.stitch_available
assert info.dzi is None assert info.dzi is None
# Add a fake scan and check this is recognised as a stitch not a scan image # Add a fake stitched images and check this is recognised as a stitch not
# a scan image
_add_fake_file(scan_dir, "fake_scan_0001_stitched.jpg", in_im_dir=True) _add_fake_file(scan_dir, "fake_scan_0001_stitched.jpg", in_im_dir=True)
info = scan_dir.scan_info() info = scan_dir.scan_info()
assert info.number_of_images == 17 assert info.number_of_images == 17
assert info.stitch_available assert info.stitch_available
def test_get_final_stitch():
"""Check that the final stitch can be retrieved"""
_clear_scan_dir()
scan_dir_manager = ScanDirectoryManager(BASE_SCAN_DIR)
scan_dir = scan_dir_manager.new_scan_dir("fake_scan")
# Create some scan images files
for i in range(17):
_add_fake_image(scan_dir)
# No scans, so None should be returned, from both manager and scan dir
assert scan_dir_manager.get_final_stitch(scan_dir.name) is None
assert scan_dir.get_final_stitch() is None
fake_scan_name = "fake_scan_0001_stitched.jpg"
fake_scan_path = scan_dir_manager.get_file_from_img_dir(
scan_name=scan_dir.name,
filename="fake_scan_0001_stitched.jpg",
check_exists=False,
)
# Add a fake scan
_add_fake_file(scan_dir, fake_scan_name, in_im_dir=True)
# Manager returns full path
assert scan_dir_manager.get_final_stitch(scan_dir.name) == fake_scan_path
# ScanDirectory object returns just the filename
assert scan_dir.get_final_stitch() == fake_scan_name
def test_empty_scan_info(): def test_empty_scan_info():
"""Test the scan info is correct even if the scan is empty""" """Test the scan info is correct even if the scan is empty"""
_clear_scan_dir() _clear_scan_dir()
@ -277,7 +309,7 @@ def test_creating_scan_dir_for_missing_scan():
"""Check creating ScanDirectory object for a dir that doesn't exist fails.""" """Check creating ScanDirectory object for a dir that doesn't exist fails."""
_clear_scan_dir() _clear_scan_dir()
with pytest.raises(FileNotFoundError): with pytest.raises(FileNotFoundError):
ScanDirectory(BASE_SCAN_DIR, "not_real_0001") ScanDirectory("not_real_0001", BASE_SCAN_DIR)
def test_none_returned_for_missing_images_dir(): def test_none_returned_for_missing_images_dir():
@ -290,12 +322,50 @@ def test_none_returned_for_missing_images_dir():
""" """
_clear_scan_dir() _clear_scan_dir()
os.makedirs(os.path.join(BASE_SCAN_DIR, "fake_scan_0001")) os.makedirs(os.path.join(BASE_SCAN_DIR, "fake_scan_0001"))
scan_dir = ScanDirectory(BASE_SCAN_DIR, "fake_scan_0001") scan_dir = ScanDirectory("fake_scan_0001", BASE_SCAN_DIR)
assert scan_dir.images_dir is None assert scan_dir.images_dir is None
# Also check that get scan files returns and empty list # Also check that get scan files returns and empty list
assert scan_dir.get_scan_files() == [] assert scan_dir.get_scan_files() == []
def test_find_files():
"""Test the private _find_files method of ScanDirectories
Add files to directory and check expected returns.
"""
_clear_scan_dir()
os.makedirs(os.path.join(BASE_SCAN_DIR, "fake_scan_0001", "images"))
scan_dir = ScanDirectory("fake_scan_0001", BASE_SCAN_DIR)
# For an empty directory, "all" is 3 empty lists
assert scan_dir._find_files("all") == ([], [], [])
# Other options are 1 empty list.
for file_type in ["scan_images", "stitches", "dzi"]:
assert scan_dir._find_files(file_type) == []
# Add a number of images
for i in range(2321):
_add_fake_image(scan_dir)
assert len(set(scan_dir._find_files("scan_images"))) == 2321
assert len(set(scan_dir._find_files("stitches"))) == 0
assert len(set(scan_dir._find_files("dzi"))) == 0
# Add and a stitched image
_add_fake_file(scan_dir, "fake_scan_0001_stitched.jpg", in_im_dir=True)
assert len(set(scan_dir._find_files("scan_images"))) == 2321
assert len(set(scan_dir._find_files("stitches"))) == 1
assert len(set(scan_dir._find_files("dzi"))) == 0
# Add and a dzi image
_add_fake_file(scan_dir, "fake_scan_0001.dzi", in_im_dir=True)
assert len(set(scan_dir._find_files("scan_images"))) == 2321
assert len(set(scan_dir._find_files("stitches"))) == 1
assert len(set(scan_dir._find_files("dzi"))) == 1
DiskUsage = namedtuple("DiskUsage", ["total", "used", "free"]) DiskUsage = namedtuple("DiskUsage", ["total", "used", "free"])