package org.airsonic.player.service.search; import static org.springframework.util.ObjectUtils.isEmpty; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.airsonic.player.domain.MediaFile; import org.airsonic.player.domain.MusicFolder; import org.airsonic.player.domain.RandomSearchCriteria; 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 com.google.common.base.Function; /* * Tests to prove what kind of strings/chars can be used in the genre field. */ public class SearchServiceSpecialGenreTestCase 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/SpecialGenre")); musicFolders.add(new MusicFolder(1, musicDir, "accessible", true, new Date())); } return musicFolders; } @Before public void setup() throws Exception { populateDatabaseOnlyOnce(); } /* * There are 19 files * in src/test/resources/MEDIAS/Search/SpecialGenre/ARTIST1/ALBUM_A. * In FILE01 to FILE16, Special strings for Lucene syntax are stored * as tag values ​​of Genre. * * Legacy can not search all these genres. * (Strictly speaking, the genre field is not created at index creation.) */ @Test public void testQueryEscapeRequires() { List folders = getMusicFolders(); Function simpleStringCriteria = s -> new RandomSearchCriteria(Integer.MAX_VALUE, // count s, // genre, null, // fromYear null, // toYear folders // musicFolders ); List songs = searchService.getRandomSongs(simpleStringCriteria.apply("+")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("-")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("&&")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("+")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("||")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply(" ("));// space & bracket Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply(")")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("{}")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("[]")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("^")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("\"")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("~")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("*")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("?")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply(":")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("\\")); Assert.assertEquals(0, songs.size()); songs = searchService.getRandomSongs(simpleStringCriteria.apply("/")); Assert.assertEquals(0, songs.size()); } /* * Jaudiotagger applies special treatment to bracket (FILE17). * */ @Test public void testBrackets() { List folders = getMusicFolders(); RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count "-(GENRE)-", // genre, null, // fromYear null, // toYear folders // musicFolders ); List songs = searchService.getRandomSongs(criteria); Assert.assertEquals(0, songs.size()); criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count " genre", // genre, null, // fromYear null, // toYear folders // musicFolders ); songs = searchService.getRandomSongs(criteria); Assert.assertEquals(1, songs.size()); Assert.assertEquals("Consistency with Tag Parser 1", songs.get(0).getTitle()); Assert.assertEquals("-GENRE -", songs.get(0).getGenre()); } /* * Jaudiotagger applies special treatment to numeric. (FILE18) */ @Test public void testNumericMapping() { List folders = getMusicFolders(); RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count "Rock", // genre, null, // fromYear null, // toYear folders // musicFolders ); List songs = searchService.getRandomSongs(criteria); Assert.assertEquals(1, songs.size()); Assert.assertEquals("Numeric mapping specification of genre 1", songs.get(0).getTitle()); // The value registered in the file is 17 Assert.assertEquals("Rock", songs.get(0).getGenre()); } /* * Other special strings. (FILE19) * * {'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's * * Legacy stores with Analyze, * so searchable characters are different. * */ @Test public void testOthers() { List folders = getMusicFolders(); RandomSearchCriteria criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count "{'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's", // genre, null, // fromYear null, // toYear folders // musicFolders ); List songs = searchService.getRandomSongs(criteria); Assert.assertEquals(0, songs.size()); criteria = new RandomSearchCriteria(Integer.MAX_VALUE, // count "widthcaesar", // genre, null, // fromYear null, // toYear folders // musicFolders ); songs = searchService.getRandomSongs(criteria); Assert.assertEquals(1, songs.size()); Assert.assertEquals("Other special strings 1", songs.get(0).getTitle()); Assert.assertEquals("{'“『【【】】[︴○◎@ $〒→+]FULL-WIDTHCæsar's", songs.get(0).getGenre()); } }