package org.airsonic.player.service.search; import org.airsonic.player.domain.MediaFile; import org.airsonic.player.domain.MusicFolder; import org.airsonic.player.service.SearchService; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import static org.springframework.util.ObjectUtils.isEmpty; /* * Test cases related to #1139. * Confirming whether shuffle search can be performed correctly in MusicFolder containing special strings. * * (Since the query of getRandomAlbums consists of folder paths only, * this verification is easy to perform.) * * This test case is a FalsePattern for search, * but there may be problems with the data flow prior to creating the search index. */ public class SearchServiceSpecialPathTestCase extends AbstractAirsonicHomeTest { private List musicFolders; @Autowired private SearchService searchService; @Override public List getMusicFolders() { if (isEmpty(musicFolders)) { musicFolders = new ArrayList<>(); File musicDir = new File(resolveBaseMediaPath.apply("Search/SpecialPath/accessible")); musicFolders.add(new MusicFolder(1, musicDir, "accessible", true, new Date())); File music2Dir = new File(resolveBaseMediaPath.apply("Search/SpecialPath/accessible's")); musicFolders.add(new MusicFolder(2, music2Dir, "accessible's", true, new Date())); File music3Dir = new File(resolveBaseMediaPath.apply("Search/SpecialPath/accessible+s")); musicFolders.add(new MusicFolder(3, music3Dir, "accessible+s", true, new Date())); } return musicFolders; } @Before public void setup() { populateDatabaseOnlyOnce(); } @Test public void testSpecialCharactersInDirName() { List folders = getMusicFolders(); // ALL Songs List randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folders); Assert.assertEquals("ALL Albums ", 3, randomAlbums.size()); // dir - accessible List folder01 = folders.stream() .filter(m -> "accessible".equals(m.getName())) .collect(Collectors.toList()); randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folder01); Assert.assertEquals("Albums in \"accessible\" ", 1, randomAlbums.size()); // dir - accessible's List folder02 = folders.stream() .filter(m -> "accessible's".equals(m.getName())) .collect(Collectors.toList()); randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folder02); Assert.assertEquals("Albums in \"accessible's\" ", 1, randomAlbums.size()); // dir - accessible+s List folder03 = folders.stream() .filter(m -> "accessible+s".equals(m.getName())) .collect(Collectors.toList()); randomAlbums = searchService.getRandomAlbums(Integer.MAX_VALUE, folder03); Assert.assertEquals("Albums in \"accessible+s\" ", 1, folder03.size()); } }