* Use original filename to export photos by default, #176 * Fixed edited filename to also use original_filename if none provided. * Rolled back previous change due to test failures * Use original filename for edited file exports as well Co-authored-by: Rhet Turnbull <rturnbull@gmail.com>
792 lines
21 KiB
Python
792 lines
21 KiB
Python
import pytest
|
|
|
|
from osxphotos._constants import _UNKNOWN_PERSON
|
|
|
|
# TODO: put some of this code into a pre-function
|
|
|
|
PHOTOS_DB = "./tests/Test-10.15.4.photoslibrary/database/photos.db"
|
|
PHOTOS_DB_PATH = "/Test-10.15.4.photoslibrary/database/photos.db"
|
|
PHOTOS_LIBRARY_PATH = "/Test-10.15.4.photoslibrary"
|
|
|
|
KEYWORDS = [
|
|
"Kids",
|
|
"wedding",
|
|
"flowers",
|
|
"England",
|
|
"London",
|
|
"London 2018",
|
|
"St. James's Park",
|
|
"UK",
|
|
"United Kingdom",
|
|
]
|
|
# Photos 5 includes blank person for detected face
|
|
PERSONS = ["Katie", "Suzy", "Maria", _UNKNOWN_PERSON]
|
|
ALBUMS = [
|
|
"Pumpkin Farm",
|
|
"Test Album",
|
|
"AlbumInFolder",
|
|
"Raw",
|
|
] # Note: there are 2 albums named "Test Album" for testing duplicate album names
|
|
KEYWORDS_DICT = {
|
|
"Kids": 4,
|
|
"wedding": 2,
|
|
"flowers": 1,
|
|
"England": 1,
|
|
"London": 1,
|
|
"London 2018": 1,
|
|
"St. James's Park": 1,
|
|
"UK": 1,
|
|
"United Kingdom": 1,
|
|
}
|
|
PERSONS_DICT = {"Katie": 3, "Suzy": 2, "Maria": 1, _UNKNOWN_PERSON: 1}
|
|
ALBUM_DICT = {
|
|
"Pumpkin Farm": 3,
|
|
"Test Album": 2,
|
|
"AlbumInFolder": 2,
|
|
"Raw": 4,
|
|
} # Note: there are 2 albums named "Test Album" for testing duplicate album names
|
|
|
|
UUID_DICT = {
|
|
"missing": "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C",
|
|
"favorite": "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51",
|
|
"not_favorite": "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C",
|
|
"hidden": "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C",
|
|
"not_hidden": "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51",
|
|
"has_adjustments": "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51",
|
|
"no_adjustments": "6191423D-8DB8-4D4C-92BE-9BBBA308AAC4",
|
|
"location": "DC99FBDD-7A52-4100-A5BB-344131646C30",
|
|
"no_location": "6191423D-8DB8-4D4C-92BE-9BBBA308AAC4",
|
|
"external_edit": "DC99FBDD-7A52-4100-A5BB-344131646C30",
|
|
"no_external_edit": "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51",
|
|
"export": "D79B8D77-BFFC-460B-9312-034F2877D35B", # "Pumkins2.jpg"
|
|
}
|
|
|
|
|
|
def test_init1():
|
|
# test named argument
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
assert isinstance(photosdb, osxphotos.PhotosDB)
|
|
|
|
|
|
def test_init2():
|
|
# test positional argument
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(PHOTOS_DB)
|
|
assert isinstance(photosdb, osxphotos.PhotosDB)
|
|
|
|
|
|
def test_init3():
|
|
# test positional and named argument (raises exception)
|
|
import osxphotos
|
|
|
|
with pytest.raises(Exception):
|
|
assert osxphotos.PhotosDB(PHOTOS_DB, dbfile=PHOTOS_DB)
|
|
|
|
|
|
def test_init4():
|
|
# test invalid db
|
|
import os
|
|
import tempfile
|
|
import osxphotos
|
|
|
|
(bad_db, bad_db_name) = tempfile.mkstemp(suffix=".db", prefix="osxphotos-")
|
|
os.close(bad_db)
|
|
|
|
with pytest.raises(Exception):
|
|
assert osxphotos.PhotosDB(bad_db_name)
|
|
|
|
with pytest.raises(Exception):
|
|
assert osxphotos.PhotosDB(dbfile=bad_db_name)
|
|
|
|
try:
|
|
os.remove(bad_db_name)
|
|
except:
|
|
pass
|
|
|
|
|
|
def test_init5(mocker):
|
|
# test failed get_last_library_path
|
|
import osxphotos
|
|
|
|
def bad_library():
|
|
return None
|
|
|
|
# get_last_library actually in utils but need to patch it in photosdb because it's imported into photosdb
|
|
# because of the layout of photosdb/ need to patch it this way...don't really understand why, but it works
|
|
mocker.patch("osxphotos.photosdb.photosdb.get_last_library_path", new=bad_library)
|
|
|
|
with pytest.raises(Exception):
|
|
assert osxphotos.PhotosDB()
|
|
|
|
|
|
def test_db_len():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
# assert photosdb.db_version in osxphotos._TESTED_DB_VERSIONS
|
|
assert len(photosdb) == 12
|
|
|
|
|
|
def test_db_version():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
# assert photosdb.db_version in osxphotos._TESTED_DB_VERSIONS
|
|
assert photosdb.db_version == "6000"
|
|
|
|
|
|
def test_persons():
|
|
import osxphotos
|
|
import collections
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
assert "Katie" in photosdb.persons
|
|
assert collections.Counter(PERSONS) == collections.Counter(photosdb.persons)
|
|
|
|
|
|
def test_keywords():
|
|
import osxphotos
|
|
import collections
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
assert "wedding" in photosdb.keywords
|
|
assert collections.Counter(KEYWORDS) == collections.Counter(photosdb.keywords)
|
|
|
|
|
|
def test_album_names():
|
|
import osxphotos
|
|
import collections
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
assert "Pumpkin Farm" in photosdb.albums
|
|
assert collections.Counter(ALBUMS) == collections.Counter(photosdb.albums)
|
|
|
|
|
|
def test_keywords_dict():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
keywords = photosdb.keywords_as_dict
|
|
assert keywords["wedding"] == 2
|
|
assert keywords == KEYWORDS_DICT
|
|
|
|
|
|
def test_persons_as_dict():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
persons = photosdb.persons_as_dict
|
|
assert persons["Maria"] == 1
|
|
assert persons == PERSONS_DICT
|
|
|
|
|
|
def test_albums_as_dict():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
albums = photosdb.albums_as_dict
|
|
assert albums["Pumpkin Farm"] == 3
|
|
assert albums == ALBUM_DICT
|
|
|
|
|
|
def test_attributes():
|
|
import datetime
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=["D79B8D77-BFFC-460B-9312-034F2877D35B"])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
assert p.keywords == ["Kids"]
|
|
assert p.original_filename == "Pumkins2.jpg"
|
|
assert p.filename == "D79B8D77-BFFC-460B-9312-034F2877D35B.jpeg"
|
|
assert p.date == datetime.datetime(
|
|
2018, 9, 28, 16, 7, 7, 0, datetime.timezone(datetime.timedelta(seconds=-14400))
|
|
)
|
|
assert p.description == "Girl holding pumpkin"
|
|
assert p.title == "I found one!"
|
|
assert sorted(p.albums) == ["Pumpkin Farm", "Test Album"]
|
|
assert p.persons == ["Katie"]
|
|
assert p.path.endswith(
|
|
"tests/Test-10.15.4.photoslibrary/originals/D/D79B8D77-BFFC-460B-9312-034F2877D35B.jpeg"
|
|
)
|
|
assert p.ismissing == False
|
|
|
|
|
|
def test_missing():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["missing"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
assert p.path == None
|
|
assert p.ismissing == True
|
|
|
|
|
|
def test_favorite():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["favorite"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
assert p.favorite == True
|
|
|
|
|
|
def test_not_favorite():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["not_favorite"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
assert p.favorite == False
|
|
|
|
|
|
def test_hidden():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["hidden"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
assert p.hidden == True
|
|
|
|
|
|
def test_not_hidden():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["not_hidden"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
assert p.hidden == False
|
|
|
|
|
|
def test_location_1():
|
|
# test photo with lat/lon info
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["location"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
lat, lon = p.location
|
|
assert lat == pytest.approx(51.50357167)
|
|
assert lon == pytest.approx(-0.1318055)
|
|
|
|
|
|
def test_location_2():
|
|
# test photo with no location info
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["no_location"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
lat, lon = p.location
|
|
assert lat is None
|
|
assert lon is None
|
|
|
|
|
|
def test_hasadjustments1():
|
|
# test hasadjustments == True
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["has_adjustments"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
assert p.hasadjustments == True
|
|
|
|
|
|
def test_hasadjustments2():
|
|
# test hasadjustments == False
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
assert p.hasadjustments == False
|
|
|
|
|
|
def test_external_edit1():
|
|
# test image has been edited in external editor
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["external_edit"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
|
|
assert p.external_edit == True
|
|
|
|
|
|
def test_external_edit2():
|
|
# test image has not been edited in external editor
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["no_external_edit"]])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
|
|
assert p.external_edit == False
|
|
|
|
|
|
def test_path_edited1():
|
|
# test a valid edited path
|
|
import os.path
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=["E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51"])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
path = p.path_edited
|
|
assert path.endswith(
|
|
"resources/renders/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_1_201_a.jpeg"
|
|
)
|
|
assert os.path.exists(path)
|
|
|
|
|
|
def test_path_edited2():
|
|
# test an invalid edited path
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=["6191423D-8DB8-4D4C-92BE-9BBBA308AAC4"])
|
|
assert len(photos) == 1
|
|
p = photos[0]
|
|
path = p.path_edited
|
|
assert path is None
|
|
|
|
|
|
def test_count():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos()
|
|
assert len(photos) == 12
|
|
|
|
|
|
def test_keyword_2():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(keywords=["wedding"])
|
|
assert len(photos) == 2
|
|
|
|
|
|
def test_keyword_not_in_album():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
|
|
# find all photos with keyword "Kids" not in the album "Pumpkin Farm"
|
|
photos1 = photosdb.photos(albums=["Pumpkin Farm"])
|
|
photos2 = photosdb.photos(keywords=["Kids"])
|
|
photos3 = [p for p in photos2 if p not in photos1]
|
|
assert len(photos3) == 1
|
|
assert photos3[0].uuid == "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C"
|
|
|
|
|
|
def test_get_db_path():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
db_path = photosdb.db_path
|
|
assert db_path.endswith(PHOTOS_DB_PATH)
|
|
|
|
|
|
def test_get_library_path():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
lib_path = photosdb.library_path
|
|
assert lib_path.endswith(PHOTOS_LIBRARY_PATH)
|
|
|
|
|
|
def test_export_1():
|
|
# test basic export
|
|
# get an unedited image and export it using default filename
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
|
|
filename = photos[0].original_filename
|
|
expected_dest = os.path.join(dest, filename)
|
|
got_dest = photos[0].export(dest)[0]
|
|
|
|
assert got_dest == expected_dest
|
|
assert os.path.isfile(got_dest)
|
|
|
|
|
|
def test_export_2():
|
|
# test export with user provided filename
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
import time
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
|
|
timestamp = time.time()
|
|
filename = f"osxphotos-export-2-test-{timestamp}.jpg"
|
|
expected_dest = os.path.join(dest, filename)
|
|
got_dest = photos[0].export(dest, filename)[0]
|
|
|
|
assert got_dest == expected_dest
|
|
assert os.path.isfile(got_dest)
|
|
|
|
|
|
def test_export_3():
|
|
# test file already exists and test increment=True (default)
|
|
import os
|
|
import os.path
|
|
import pathlib
|
|
import tempfile
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
|
|
filename = photos[0].original_filename
|
|
filename2 = pathlib.Path(filename)
|
|
filename2 = f"{filename2.stem} (1){filename2.suffix}"
|
|
expected_dest_2 = os.path.join(dest, filename2)
|
|
|
|
got_dest = photos[0].export(dest)[0]
|
|
got_dest_2 = photos[0].export(dest)[0]
|
|
|
|
assert got_dest_2 == expected_dest_2
|
|
assert os.path.isfile(got_dest_2)
|
|
|
|
|
|
def test_export_4():
|
|
# test user supplied file already exists and test increment=True (default)
|
|
import os
|
|
import os.path
|
|
import pathlib
|
|
import tempfile
|
|
import time
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
|
|
timestamp = time.time()
|
|
filename = f"osxphotos-export-2-test-{timestamp}.jpg"
|
|
filename2 = f"osxphotos-export-2-test-{timestamp} (1).jpg"
|
|
expected_dest_2 = os.path.join(dest, filename2)
|
|
|
|
got_dest = photos[0].export(dest, filename)[0]
|
|
got_dest_2 = photos[0].export(dest, filename)[0]
|
|
|
|
assert got_dest_2 == expected_dest_2
|
|
assert os.path.isfile(got_dest_2)
|
|
|
|
|
|
def test_export_5():
|
|
# test file already exists and test increment=True (default)
|
|
# and overwrite = True
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
|
|
filename = photos[0].original_filename
|
|
expected_dest = os.path.join(dest, filename)
|
|
|
|
got_dest = photos[0].export(dest)[0]
|
|
got_dest_2 = photos[0].export(dest, overwrite=True)[0]
|
|
|
|
assert got_dest_2 == got_dest
|
|
assert got_dest_2 == expected_dest
|
|
assert os.path.isfile(got_dest_2)
|
|
|
|
|
|
def test_export_6():
|
|
# test user supplied file already exists and test increment=True (default)
|
|
# and overwrite = True
|
|
import os
|
|
import os.path
|
|
import pathlib
|
|
import tempfile
|
|
import time
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
|
|
timestamp = time.time()
|
|
filename = f"osxphotos-export-test-{timestamp}.jpg"
|
|
expected_dest = os.path.join(dest, filename)
|
|
|
|
got_dest = photos[0].export(dest, filename)[0]
|
|
got_dest_2 = photos[0].export(dest, filename, overwrite=True)[0]
|
|
|
|
assert got_dest_2 == got_dest
|
|
assert got_dest_2 == expected_dest
|
|
assert os.path.isfile(got_dest_2)
|
|
|
|
|
|
def test_export_7():
|
|
# test file already exists and test increment=False (not default), overwrite=False (default)
|
|
# should raise exception
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
|
|
filename = photos[0].filename
|
|
|
|
got_dest = photos[0].export(dest)[0]
|
|
with pytest.raises(Exception) as e:
|
|
# try to export again with increment = False
|
|
assert photos[0].export(dest, increment=False)
|
|
assert e.type == type(FileExistsError())
|
|
|
|
|
|
def test_export_8():
|
|
# try to export missing file
|
|
# should raise exception
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["missing"]])
|
|
|
|
filename = photos[0].filename
|
|
|
|
with pytest.raises(Exception) as e:
|
|
assert photos[0].export(dest)[0]
|
|
assert e.type == type(FileNotFoundError())
|
|
|
|
|
|
def test_export_9():
|
|
# try to export edited file that's not edited
|
|
# should raise exception
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]])
|
|
|
|
filename = photos[0].filename
|
|
|
|
with pytest.raises(Exception) as e:
|
|
assert photos[0].export(dest, edited=True)
|
|
assert e.type == ValueError
|
|
|
|
|
|
def test_export_10():
|
|
# try to export edited file that's not edited and name provided
|
|
# should raise exception
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
import time
|
|
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]])
|
|
|
|
timestamp = time.time()
|
|
filename = f"osxphotos-export-test-{timestamp}.jpg"
|
|
|
|
with pytest.raises(Exception) as e:
|
|
assert photos[0].export(dest, filename, edited=True)
|
|
assert e.type == ValueError
|
|
|
|
|
|
def test_export_11():
|
|
# export edited file with name provided
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
import time
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["has_adjustments"]])
|
|
|
|
timestamp = time.time()
|
|
filename = f"osxphotos-export-test-{timestamp}.jpg"
|
|
expected_dest = os.path.join(dest, filename)
|
|
|
|
got_dest = photos[0].export(dest, filename, edited=True)[0]
|
|
assert got_dest == expected_dest
|
|
|
|
|
|
def test_export_12():
|
|
# export edited file with default name
|
|
import os
|
|
import os.path
|
|
import pathlib
|
|
import tempfile
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["has_adjustments"]])
|
|
|
|
edited_name = pathlib.Path(photos[0].path_edited).name
|
|
edited_suffix = pathlib.Path(edited_name).suffix
|
|
filename = pathlib.Path(photos[0].original_filename).stem + "_edited" + edited_suffix
|
|
expected_dest = os.path.join(dest, filename)
|
|
|
|
got_dest = photos[0].export(dest, edited=True)[0]
|
|
assert got_dest == expected_dest
|
|
|
|
|
|
def test_export_13():
|
|
# export to invalid destination
|
|
# should raise exception
|
|
import os
|
|
import os.path
|
|
import tempfile
|
|
|
|
import osxphotos
|
|
|
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
|
dest = tempdir.name
|
|
|
|
# create a folder that doesn't exist
|
|
i = 0
|
|
while os.path.isdir(dest):
|
|
dest = os.path.join(dest, str(i))
|
|
i += 1
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
|
|
filename = photos[0].filename
|
|
|
|
with pytest.raises(Exception) as e:
|
|
assert photos[0].export(dest)
|
|
assert e.type == type(FileNotFoundError())
|
|
|
|
|
|
def test_eq():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos1 = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
photos2 = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
assert photos1[0] == photos2[0]
|
|
|
|
|
|
def test_not_eq():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos1 = photosdb.photos(uuid=[UUID_DICT["export"]])
|
|
photos2 = photosdb.photos(uuid=[UUID_DICT["missing"]])
|
|
assert photos1[0] != photos2[0]
|
|
|
|
|
|
def test_photosdb_repr():
|
|
import osxphotos
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photosdb2 = eval(repr(photosdb))
|
|
|
|
ignore_keys = ["_tmp_db", "_tempdir", "_tempdir_name"]
|
|
assert {k: v for k, v in photosdb.__dict__.items() if k not in ignore_keys} == {
|
|
k: v for k, v in photosdb2.__dict__.items() if k not in ignore_keys
|
|
}
|
|
|
|
|
|
def test_photosinfo_repr():
|
|
import osxphotos
|
|
import datetime
|
|
|
|
photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
|
|
photos = photosdb.photos(uuid=[UUID_DICT["favorite"]])
|
|
photo = photos[0]
|
|
photo2 = eval(repr(photo))
|
|
|
|
assert {k: str(v).encode("utf-8") for k, v in photo.__dict__.items()} == {
|
|
k: str(v).encode("utf-8") for k, v in photo2.__dict__.items()
|
|
}
|
|
|
|
|
|
def test_from_to_date():
|
|
import osxphotos
|
|
import datetime as dt
|
|
import os
|
|
import time
|
|
|
|
os.environ["TZ"] = "US/Pacific"
|
|
time.tzset()
|
|
|
|
photosdb = osxphotos.PhotosDB(PHOTOS_DB)
|
|
|
|
photos = photosdb.photos(from_date=dt.datetime(2018, 10, 28))
|
|
assert len(photos) == 6
|
|
|
|
photos = photosdb.photos(to_date=dt.datetime(2018, 10, 28))
|
|
assert len(photos) == 6
|
|
|
|
photos = photosdb.photos(
|
|
from_date=dt.datetime(2018, 9, 28), to_date=dt.datetime(2018, 9, 29)
|
|
)
|
|
assert len(photos) == 4
|