package photato.core;
import photato.core.PhotatoFilesManager;
import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;
import java.io.IOException;
import photato.core.entities.PhotatoFolder;
import photato.core.entities.PhotatoPicture;
import photato.core.metadata.IMetadataAggregator;
import photato.core.metadata.Metadata;
import photato.helpers.Tuple;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.FileTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.FileEntity;
import org.junit.Assert;
import org.junit.Test;
import photato.core.entities.PhotatoMedia;
import photato.core.resize.fullscreen.IFullScreenImageGetter;
import photato.core.resize.thumbnails.IThumbnailGenerator;
public class PhotatoFilesManagerTest {
private static class ThumbnailsGeneratorMock implements IThumbnailGenerator {
private static final Set<String> thumbnails = new HashSet<>();
@Override
public void generateThumbnail(PhotatoMedia media) {
thumbnails.add(media.fsPath.toString());
}
@Override
public void deleteThumbnail(Path originalFilename, long lastModifiedTimestamp) {
thumbnails.remove(originalFilename.toString());
}
public boolean contains(Path originalFilename, long lastModifiedTimestamp) {
return thumbnails.contains(originalFilename.toString());
}
@Override
public String getThumbnailUrl(Path originalFilename, long lastModifiedTimestamp) {
return "/thumbnail/" + originalFilename + "_" + lastModifiedTimestamp;
}
@Override
public int getThumbnailWidth(int originalWidth, int originalHeight) {
return 10;
}
@Override
public int getThumbnailHeight(int originalWidth, int originalHeight) {
return 20;
}
}
private static class MetadataGetterMock implements IMetadataAggregator {
private final Map<String, List<String>> map = new HashMap<>();
public void addMetadata(Path path, String metadata) {
List<String> l = this.map.get(path.toString());
if (l == null) {
l = new ArrayList<>();
this.map.put(path.toString(), l);
}
l.add(metadata);
}
@Override
public Metadata getMetadata(Path path, long lastModificationTimestamp) {
Metadata metadata = new Metadata();
List<String> tagsList = this.map.get(path.toString());
metadata.tags = tagsList == null ? new String[0] : tagsList.toArray(new String[tagsList.size()]);
metadata.persons = new String[0];
return metadata;
}
@Override
public Map<Path, Metadata> getMetadatas(List<Tuple<Path, Long>> paths) {
Map<Path, Metadata> result = new HashMap<>();
for (Tuple<Path, Long> pathTuple : paths) {
result.put(pathTuple.o1, this.getMetadata(pathTuple.o1, pathTuple.o2));
}
return result;
}
}
private static class FullScreenGetterMock implements IFullScreenImageGetter {
@Override
public void generateImage(PhotatoMedia media) throws IOException {
}
@Override
public void deleteImage(PhotatoMedia media) throws IOException {
}
@Override
public FileEntity getImage(PhotatoMedia media, ContentType contentType) throws IOException {
return null;
}
@Override
public String getImageUrl(Path originalFilename, long lastModifiedTimestamp) {
return "";
}
@Override
public int getImageWidth(int originalWidth, int originalHeight) {
return 10;
}
@Override
public int getImageHeight(int originalWidth, int originalHeight) {
return 10;
}
}
@Test
public void test() throws Exception {
String rootFolder = "/home/myself/images";
int sleepDelayForWaitingWatcherThread = 5000;
MetadataGetterMock metadataGetterMock = new MetadataGetterMock();
ThumbnailsGeneratorMock thumbnailsGeneratorMock = new ThumbnailsGeneratorMock();
FullScreenGetterMock fullScreenGetterMock = new FullScreenGetterMock();
try (FileSystem fileSystem = Jimfs.newFileSystem(Configuration.unix())) {
Files.deleteIfExists(fileSystem.getPath(rootFolder));
Files.createDirectories(fileSystem.getPath(rootFolder));
Files.createDirectory(fileSystem.getPath(rootFolder + "/new-york"));
Files.createDirectories(fileSystem.getPath(rootFolder + "/cacadada/titi"));
Files.createDirectory(fileSystem.getPath(rootFolder + "/tmptmp"));
Files.createDirectory(fileSystem.getPath(rootFolder + "/toignore"));
Files.createFile(fileSystem.getPath(rootFolder + "/toignore/.photatoIgnore"));
Files.createFile(fileSystem.getPath(rootFolder + "/toignore/ghost.png"));
Path photatoPicture1 = fileSystem.getPath("/home/myself/images/new-york/my awesome picture1.jpg");
Path photatoPicture2 = fileSystem.getPath("/home/myself/images/cacadada/titi/cool me.png");
Files.createFile(photatoPicture1);
Files.createFile(photatoPicture2);
metadataGetterMock.addMetadata(photatoPicture1, "Pierre-Arthur Edouard");
metadataGetterMock.addMetadata(photatoPicture1, "Moi");
metadataGetterMock.addMetadata(photatoPicture1, "Antoine Wolololo Ching");
metadataGetterMock.addMetadata(photatoPicture1, "Central park");
metadataGetterMock.addMetadata(photatoPicture1, "Manhattan");
metadataGetterMock.addMetadata(photatoPicture1, "New-York");
metadataGetterMock.addMetadata(photatoPicture1, "États-Unis d'Amérique");
metadataGetterMock.addMetadata(photatoPicture2, "Pierre-Arthur Edouard");
metadataGetterMock.addMetadata(photatoPicture2, "Antoine Prout");
metadataGetterMock.addMetadata(photatoPicture2, "Mont Royal");
metadataGetterMock.addMetadata(photatoPicture2, "Montréal");
metadataGetterMock.addMetadata(photatoPicture2, "Québec");
metadataGetterMock.addMetadata(photatoPicture2, "Canada");
try (PhotatoFilesManager photatoFilesManager = new PhotatoFilesManager(fileSystem.getPath(rootFolder), fileSystem, metadataGetterMock, thumbnailsGeneratorMock, fullScreenGetterMock, true, true, false)) {
// TEST SEARCH
List<PhotatoMedia> res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "pierre-arthur");
Assert.assertEquals(2, res.size());
res = photatoFilesManager.searchMediasInFolder("/home/myself/images/cacadada/titi", "pierre-arthur");
Assert.assertEquals(1, res.size());
res = photatoFilesManager.searchMediasInFolder("/home/myself/images/cacadada", "pierre-arthur");
Assert.assertEquals(1, res.size());
res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "cacadada");
Assert.assertEquals(1, res.size());
res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "titi");
Assert.assertEquals(1, res.size());
res = photatoFilesManager.searchMediasInFolder("/home/myself/images/tmptmp", "pierre-arthur");
Assert.assertEquals(0, res.size());
// TEST DIRECTORY LISTING (Counts take into account ignored folders)
List<PhotatoFolder> foldersInFolder = photatoFilesManager.getFoldersInFolder("/home/myself/images");
Assert.assertEquals(2, foldersInFolder.size()); // Not counting empty and .photatoignoreD folders
foldersInFolder = photatoFilesManager.getFoldersInFolder("/home/myself/cacadada/titi"); // Parent folder
Assert.assertEquals(0, foldersInFolder.size());
foldersInFolder = photatoFilesManager.getFoldersInFolder("/home/myself/images/cacadada");
Assert.assertEquals(1, foldersInFolder.size());
List<PhotatoMedia> picturesInFolder = photatoFilesManager.getMediasInFolder("/home/myself/images/cacadada/titi");
Assert.assertEquals(1, picturesInFolder.size());
// TEST THUMBNAIL GENERATION
Assert.assertTrue(thumbnailsGeneratorMock.contains(photatoPicture1, 0));
Assert.assertTrue(thumbnailsGeneratorMock.contains(photatoPicture2, 0));
// TEST ONLINE FILE ADDITION
Path photatoPicture3 = fileSystem.getPath("/home/myself/images/cacadada/santa.jpg"); // Picture with no metadata
Files.createFile(photatoPicture3);
Thread.sleep(sleepDelayForWaitingWatcherThread);
picturesInFolder = photatoFilesManager.getMediasInFolder("/home/myself/images/cacadada");
foldersInFolder = photatoFilesManager.getFoldersInFolder("/home/myself/images/cacadada");
Assert.assertEquals(1, picturesInFolder.size());
Assert.assertEquals(1, foldersInFolder.size());
res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "santa");
Assert.assertEquals(1, res.size());
Assert.assertTrue(thumbnailsGeneratorMock.contains(photatoPicture3, 0));
// TEST ONLINE FILE DELETION
Files.delete(photatoPicture3);
Thread.sleep(sleepDelayForWaitingWatcherThread);
res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "santa");
Assert.assertEquals(0, res.size());
Assert.assertFalse(thumbnailsGeneratorMock.contains(photatoPicture3, 0));
// TEST ONLINE FOLDER CREATION
Path photatoPicture4_0 = fileSystem.getPath("/home/myself/images/carry fisher");
Path photatoPicture4_1 = fileSystem.getPath("/home/myself/images/carry fisher/vador.jpg");
Files.createDirectory(photatoPicture4_0);
Files.createFile(photatoPicture4_1);
Thread.sleep(sleepDelayForWaitingWatcherThread);
res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "carry fisher");
Assert.assertEquals(1, res.size());
res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "vador");
Assert.assertEquals(1, res.size());
res = photatoFilesManager.searchMediasInFolder("/home/myself/images/carry fisher", "vador");
Assert.assertEquals(1, res.size());
Assert.assertTrue(thumbnailsGeneratorMock.contains(photatoPicture4_1, 0));
// TEST ONLINE MODIFICATION
res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "yoda");
Assert.assertEquals(0, res.size());
metadataGetterMock.addMetadata(photatoPicture4_1, "yoda");
Files.setLastModifiedTime(photatoPicture4_1, FileTime.fromMillis(System.currentTimeMillis()));
Thread.sleep(sleepDelayForWaitingWatcherThread);
res = photatoFilesManager.searchMediasInFolder("/home/myself/images", "yoda");
Assert.assertEquals(1, res.size());
}
}
}
}