ordigi/tests/test_filesystem.py

190 lines
6.9 KiB
Python
Raw Normal View History

2021-08-08 15:33:47 +02:00
# TODO to be removed later
from datetime import datetime
import os
import pytest
from pathlib import Path
import re
from sys import platform
from time import sleep
2021-08-08 21:43:37 +02:00
from .conftest import copy_sample_files
2021-08-08 15:33:47 +02:00
from dozo import constants
from dozo.database import Db
from dozo.filesystem import FileSystem
from dozo.media.media import Media
from dozo.exiftool import ExifToolCaching, exiftool_is_running, terminate_exiftool
@pytest.mark.skip()
class TestDb:
pass
class TestFilesystem:
def setup_class(cls):
2021-08-08 21:43:37 +02:00
cls.src_paths, cls.file_paths = copy_sample_files()
2021-08-08 15:33:47 +02:00
cls.path_format = constants.default_path + '/' + constants.default_name
def teardown_class(self):
terminate_exiftool()
assert not exiftool_is_running()
2021-08-08 21:43:37 +02:00
def test_get_part(self, tmp_path):
2021-08-08 15:33:47 +02:00
"""
Test all parts
"""
# Item to search for:
filesystem = FileSystem()
items = filesystem.get_items()
masks = [
'{album}',
'{basename}',
'{camera_make}',
'{camera_model}',
'{city}',
'{"custom"}',
'{country}',
'{ext}',
'{folder}',
'{folders[1:3]}',
'{location}',
'{name}',
'{original_name}',
'{state}',
'{title}',
'{%Y-%m-%d}',
'{%Y-%m-%d_%H-%M-%S}',
'{%Y-%m-%b}'
]
media = Media()
exif_tags = {
'album': media.album_keys,
'camera_make': media.camera_make_keys,
'camera_model': media.camera_model_keys,
# 'date_original': media.date_original,
# 'date_created': media.date_created,
# 'date_modified': media.date_modified,
'latitude': media.latitude_keys,
'longitude': media.longitude_keys,
'original_name': [media.original_name_key],
'title': media.title_keys
}
subdirs = Path('a', 'b', 'c', 'd')
2021-08-08 21:43:37 +02:00
for file_path in self.file_paths:
2021-08-08 15:33:47 +02:00
media = Media(str(file_path))
exif_data = ExifToolCaching(str(file_path)).asdict()
metadata = media.get_metadata()
for item, regex in items.items():
for mask in masks:
matched = re.search(regex, mask)
if matched:
2021-08-08 21:43:37 +02:00
part = filesystem.get_part(item, mask[1:-1],
metadata, Db(tmp_path), subdirs)
2021-08-08 15:33:47 +02:00
# check if part is correct
2021-08-08 21:43:37 +02:00
assert isinstance(part, str), file_path
2021-08-08 15:33:47 +02:00
if item == 'basename':
2021-08-08 21:43:37 +02:00
assert part == file_path.stem, file_path
2021-08-08 15:33:47 +02:00
elif item == 'date':
assert datetime.strptime(part, mask[1:-1])
elif item == 'folder':
2021-08-08 21:43:37 +02:00
assert part == subdirs.name, file_path
2021-08-08 15:33:47 +02:00
elif item == 'folders':
if platform == "win32":
2021-08-08 21:43:37 +02:00
assert '\\' in part, file_path
2021-08-08 15:33:47 +02:00
else:
2021-08-08 21:43:37 +02:00
assert '/' in part, file_path
2021-08-08 15:33:47 +02:00
elif item == 'ext':
2021-08-08 21:43:37 +02:00
assert part == file_path.suffix[1:], file_path
elif item == 'name':
2021-08-08 15:33:47 +02:00
expected_part = file_path.stem
for i, rx in filesystem.match_date_from_string(expected_part):
2021-08-08 21:43:37 +02:00
part = re.sub(rx, '', expected_part)
assert part == expected_part, file_path
2021-08-08 15:33:47 +02:00
elif item == 'custom':
2021-08-08 21:43:37 +02:00
assert part == mask[2:-2], file_path
2021-08-08 15:33:47 +02:00
elif item in ('city', 'country', 'location', 'state'):
2021-08-08 21:43:37 +02:00
pass
2021-08-08 15:33:47 +02:00
elif item in exif_tags.keys():
f = False
for key in exif_tags[item]:
if key in exif_data:
f = True
2021-08-08 21:43:37 +02:00
assert part == exif_data[key], file_path
2021-08-08 15:33:47 +02:00
break
if f == False:
2021-08-08 21:43:37 +02:00
assert part == '', file_path
else:
assert part == '', file_path
2021-08-08 15:33:47 +02:00
def test_get_date_taken(self):
filesystem = FileSystem()
2021-08-08 21:43:37 +02:00
for file_path in self.file_paths:
2021-08-08 15:33:47 +02:00
exif_data = ExifToolCaching(str(file_path)).asdict()
media = Media(str(file_path))
metadata = media.get_metadata()
date_taken = filesystem.get_date_taken(metadata)
dates = {}
for key, date in ('original', media.date_original), ('created',
media.date_created), ('modified', media.date_modified):
dates[key] = media.get_date_attribute(date)
if media.original_name_key in exif_data:
date_filename = filesystem.get_date_from_string(
exif_data[media.original_name_key])
else:
date_filename = filesystem.get_date_from_string(file_path.name)
if dates['original']:
assert date_taken == dates['original']
elif date_filename:
assert date_taken == date_filename
elif dates['created']:
assert date_taken == dates['created']
elif dates['modified']:
assert date_taken == dates['modified']
def test_sort_files(self, tmp_path):
db = Db(tmp_path)
filesystem = FileSystem(path_format=self.path_format)
2021-08-08 21:43:37 +02:00
summary, has_errors = filesystem.sort_files([self.src_paths], tmp_path, db)
2021-08-08 15:33:47 +02:00
# Summary is created and there is no errors
assert summary, summary
assert not has_errors, has_errors
# TODO check if path follow path_format
# TODO make another class?
def test_sort_file(self, tmp_path):
for mode in 'copy', 'move':
filesystem = FileSystem(path_format=self.path_format, mode=mode)
# copy mode
2021-08-08 21:43:37 +02:00
src_path = Path(self.src_paths, 'photo.png')
2021-08-08 15:33:47 +02:00
dest_path = Path(tmp_path,'photo_copy.png')
src_checksum = filesystem.checksum(src_path)
result_copy = filesystem.sort_file(src_path, dest_path)
assert result_copy
# Ensure files remain the same
assert filesystem.checkcomp(dest_path, src_checksum)
if mode == 'copy':
assert src_path.exists()
else:
assert not src_path.exists()
# TODO check for conflicts
# TODO check date
# filesystem.sort_files
#- Sort similar images into a directory
# filesystem.sort_similar