commit
cd05af87dc
@ -0,0 +1,12 @@ |
||||
package org.airsonic.player.dao; |
||||
|
||||
import org.airsonic.player.domain.PlayQueue; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
@Component |
||||
public class PlayerDaoPlayQueueFactory { |
||||
|
||||
public PlayQueue createPlayQueue() { |
||||
return new PlayQueue(); |
||||
} |
||||
} |
@ -0,0 +1,14 @@ |
||||
package org.airsonic.player.service.jukebox; |
||||
|
||||
import org.airsonic.player.service.JukeboxLegacySubsonicService; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import java.io.InputStream; |
||||
|
||||
@Component |
||||
public class AudioPlayerFactory { |
||||
|
||||
public AudioPlayer createAudioPlayer(InputStream in, JukeboxLegacySubsonicService jukeboxLegacySubsonicService) throws Exception { |
||||
return new AudioPlayer(in, jukeboxLegacySubsonicService); |
||||
} |
||||
} |
@ -0,0 +1,17 @@ |
||||
package org.airsonic.player.service.jukebox; |
||||
|
||||
import com.github.biconou.AudioPlayer.JavaPlayer; |
||||
import com.github.biconou.AudioPlayer.api.Player; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
@Component |
||||
public class JavaPlayerFactory { |
||||
|
||||
public Player createJavaPlayer() { |
||||
return new JavaPlayer(); |
||||
} |
||||
|
||||
public Player createJavaPlayer(String mixerName) { |
||||
return new JavaPlayer(mixerName); |
||||
} |
||||
} |
@ -0,0 +1,59 @@ |
||||
package org.airsonic.player.api; |
||||
|
||||
import org.airsonic.player.TestCaseUtils; |
||||
import org.airsonic.player.util.HomeRule; |
||||
import org.junit.BeforeClass; |
||||
import org.junit.ClassRule; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; |
||||
import org.springframework.boot.test.context.SpringBootTest; |
||||
import org.springframework.http.MediaType; |
||||
import org.springframework.test.context.junit4.SpringRunner; |
||||
import org.springframework.test.web.servlet.MockMvc; |
||||
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
||||
|
||||
|
||||
@RunWith(SpringRunner.class) |
||||
@SpringBootTest |
||||
@AutoConfigureMockMvc |
||||
public class AirsonicRestApiIntTest { |
||||
|
||||
public static final String CLIENT_NAME = "airsonic"; |
||||
public static final String AIRSONIC_USER = "admin"; |
||||
public static final String AIRSONIC_PASSWORD = "admin"; |
||||
public static final String EXPECTED_FORMAT = "json"; |
||||
|
||||
private static String AIRSONIC_API_VERSION; |
||||
|
||||
@Autowired |
||||
private MockMvc mvc; |
||||
|
||||
@ClassRule |
||||
public static final HomeRule classRule = new HomeRule(); // sets airsonic.home to a temporary dir
|
||||
|
||||
@BeforeClass |
||||
public static void setupClass() { |
||||
AIRSONIC_API_VERSION = TestCaseUtils.restApiVersion(); |
||||
} |
||||
|
||||
@Test |
||||
public void pingTest() throws Exception { |
||||
mvc.perform(get("/rest/ping") |
||||
.param("v", AIRSONIC_API_VERSION) |
||||
.param("c", CLIENT_NAME) |
||||
.param("u", AIRSONIC_USER) |
||||
.param("p", AIRSONIC_PASSWORD) |
||||
.param("f", EXPECTED_FORMAT) |
||||
.contentType(MediaType.APPLICATION_JSON)) |
||||
.andExpect(status().isOk()) |
||||
.andExpect(jsonPath("$.subsonic-response.status").value("ok")) |
||||
.andExpect(jsonPath("$.subsonic-response.version").value(AIRSONIC_API_VERSION)) |
||||
.andDo(print()); |
||||
} |
||||
} |
@ -0,0 +1,279 @@ |
||||
package org.airsonic.player.api.jukebox; |
||||
|
||||
import org.airsonic.player.TestCaseUtils; |
||||
import org.airsonic.player.dao.*; |
||||
import org.airsonic.player.domain.*; |
||||
import org.airsonic.player.service.MediaScannerService; |
||||
import org.airsonic.player.service.PlayerService; |
||||
import org.airsonic.player.service.SettingsService; |
||||
import org.airsonic.player.util.HomeRule; |
||||
import org.junit.*; |
||||
import org.junit.runner.RunWith; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; |
||||
import org.springframework.boot.test.context.SpringBootTest; |
||||
import org.springframework.boot.test.context.TestConfiguration; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.http.MediaType; |
||||
import org.springframework.security.test.context.support.WithMockUser; |
||||
import org.springframework.test.annotation.DirtiesContext; |
||||
import org.springframework.test.context.junit4.SpringRunner; |
||||
import org.springframework.test.web.servlet.MockMvc; |
||||
import org.springframework.test.web.servlet.ResultActions; |
||||
import org.springframework.test.web.servlet.ResultMatcher; |
||||
|
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Date; |
||||
import java.util.TimeZone; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.mockito.Mockito.*; |
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
||||
|
||||
@RunWith(SpringRunner.class) |
||||
@SpringBootTest |
||||
@AutoConfigureMockMvc |
||||
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) |
||||
public abstract class AbstractAirsonicRestApiJukeboxIntTest { |
||||
|
||||
@ClassRule |
||||
public static final HomeRule classRule = new HomeRule(); // sets airsonic.home to a temporary dir
|
||||
|
||||
@TestConfiguration |
||||
static class Config { |
||||
private static class SpiedPlayerDaoPlayQueueFactory extends PlayerDaoPlayQueueFactory { |
||||
@Override |
||||
public PlayQueue createPlayQueue() { |
||||
return spy(super.createPlayQueue()); |
||||
} |
||||
} |
||||
|
||||
@Bean |
||||
public PlayerDaoPlayQueueFactory playerDaoPlayQueueFactory() { |
||||
return new SpiedPlayerDaoPlayQueueFactory(); |
||||
} |
||||
} |
||||
|
||||
protected static final String CLIENT_NAME = "airsonic"; |
||||
protected static final String JUKEBOX_PLAYER_NAME = CLIENT_NAME + "-jukebox"; |
||||
private static final String EXPECTED_FORMAT = "json"; |
||||
private static String AIRSONIC_API_VERSION; |
||||
|
||||
private static boolean dataBasePopulated; |
||||
private static DaoHelper staticDaoHelper; |
||||
|
||||
@Autowired |
||||
protected PlayerService playerService; |
||||
@Autowired |
||||
private MockMvc mvc; |
||||
@Autowired |
||||
private MusicFolderDao musicFolderDao; |
||||
@Autowired |
||||
private SettingsService settingsService; |
||||
@Autowired |
||||
private MediaScannerService mediaScannerService; |
||||
@Autowired |
||||
private PlayerDao playerDao; |
||||
@Autowired |
||||
private MediaFileDao mediaFileDao; |
||||
@Autowired |
||||
private DaoHelper daoHelper; |
||||
@Autowired |
||||
private AlbumDao albumDao; |
||||
@Autowired |
||||
private ArtistDao artistDao; |
||||
|
||||
private Player testJukeboxPlayer; |
||||
|
||||
@BeforeClass |
||||
public static void setupClass() { |
||||
AIRSONIC_API_VERSION = TestCaseUtils.restApiVersion(); |
||||
dataBasePopulated = false; |
||||
} |
||||
|
||||
@AfterClass |
||||
public static void cleanDataBase() { |
||||
staticDaoHelper.getJdbcTemplate().execute("DROP SCHEMA PUBLIC CASCADE"); |
||||
staticDaoHelper = null; |
||||
dataBasePopulated = false; |
||||
} |
||||
|
||||
/** |
||||
* Populate test datas in the database only once. |
||||
* |
||||
* <ul> |
||||
* <li>Creates 2 music folder</li> |
||||
* <li>Scans the music folders</li> |
||||
* <li>Creates a test jukebox player</li> |
||||
* </ul> |
||||
*/ |
||||
private void populateDatabase() { |
||||
if (!dataBasePopulated) { |
||||
staticDaoHelper = daoHelper; |
||||
|
||||
assertThat(musicFolderDao.getAllMusicFolders().size()).isEqualTo(1); |
||||
MusicFolderTestData.getTestMusicFolders().forEach(musicFolderDao::createMusicFolder); |
||||
settingsService.clearMusicFolderCache(); |
||||
|
||||
TestCaseUtils.execScan(mediaScannerService); |
||||
|
||||
assertThat(playerDao.getAllPlayers().size()).isEqualTo(0); |
||||
createTestPlayer(); |
||||
assertThat(playerDao.getAllPlayers().size()).isEqualTo(1); |
||||
|
||||
dataBasePopulated = true; |
||||
} |
||||
} |
||||
|
||||
@Before |
||||
public void setup() throws Exception { |
||||
populateDatabase(); |
||||
|
||||
testJukeboxPlayer = findTestJukeboxPlayer(); |
||||
assertThat(testJukeboxPlayer).isNotNull(); |
||||
reset(testJukeboxPlayer.getPlayQueue()); |
||||
testJukeboxPlayer.getPlayQueue().clear(); |
||||
assertThat(testJukeboxPlayer.getPlayQueue().size()).isEqualTo(0); |
||||
testJukeboxPlayer.getPlayQueue().addFiles(true, |
||||
mediaFileDao.getSongsForAlbum("_DIR_ Ravel", "Complete Piano Works")); |
||||
assertThat(testJukeboxPlayer.getPlayQueue().size()).isEqualTo(2); |
||||
} |
||||
|
||||
protected abstract void createTestPlayer(); |
||||
|
||||
private Player findTestJukeboxPlayer() { |
||||
return playerDao.getAllPlayers().stream().filter(player -> player.getName().equals(JUKEBOX_PLAYER_NAME)) |
||||
.findFirst().orElseThrow(() -> new RuntimeException("No player found in database")); |
||||
} |
||||
|
||||
private String convertDateToString(Date date) { |
||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'"); |
||||
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); |
||||
return formatter.format(date); |
||||
} |
||||
|
||||
private ResultMatcher playListItem1isCorrect() { |
||||
MediaFile mediaFile = testJukeboxPlayer.getPlayQueue().getFile(0); |
||||
MediaFile parent = mediaFileDao.getMediaFile(mediaFile.getParentPath()); |
||||
Album album = albumDao.getAlbum(mediaFile.getArtist(), mediaFile.getAlbumName()); |
||||
Artist artist = artistDao.getArtist(mediaFile.getArtist()); |
||||
assertThat(album).isNotNull(); |
||||
return result -> { |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].id").value(mediaFile.getId()).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].parent").value(parent.getId()).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].isDir").value(false).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].title").value("01 - Gaspard de la Nuit - i. Ondine").match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].album").value("Complete Piano Works").match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].artist").value("_DIR_ Ravel").match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].coverArt").value(parent.getId()).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].size").value(45138).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].contentType").value("audio/mpeg").match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].suffix").value("mp3").match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].duration").value(2).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].bitRate").value(128).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].path").value("_DIR_ Ravel/_DIR_ Ravel - Complete Piano Works/01 - Gaspard de la Nuit - i. Ondine.mp3").match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].isVideo").value(false).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].playCount").isNumber().match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].created").value(convertDateToString(mediaFile.getCreated())).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].albumId").value(album.getId()).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].artistId").value(artist.getId()).match(result); |
||||
jsonPath("$.subsonic-response.jukeboxPlaylist.entry[0].type").value("music").match(result); |
||||
}; |
||||
} |
||||
|
||||
@Test |
||||
@WithMockUser(username = "admin") |
||||
public void jukeboxStartActionTest() throws Exception { |
||||
// Given
|
||||
|
||||
// When and Then
|
||||
performStartAction(); |
||||
performStatusAction("true"); |
||||
performGetAction() |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxPlaylist.currentIndex").value("0")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxPlaylist.playing").value("true")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxPlaylist.gain").value("0.75")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxPlaylist.position").value("0")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxPlaylist.entry").isArray()) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxPlaylist.entry.length()").value(2)) |
||||
.andExpect(playListItem1isCorrect()) |
||||
.andDo(print()); |
||||
|
||||
verify(testJukeboxPlayer.getPlayQueue(), times(2)).setStatus(PlayQueue.Status.PLAYING); |
||||
assertThat(testJukeboxPlayer.getPlayQueue().getIndex()).isEqualTo(0); |
||||
assertThat(testJukeboxPlayer.getPlayQueue().getStatus()).isEqualTo(PlayQueue.Status.PLAYING); |
||||
} |
||||
|
||||
@Test |
||||
@WithMockUser(username = "admin") |
||||
public void jukeboxStopActionTest() throws Exception { |
||||
// Given
|
||||
|
||||
// When and Then
|
||||
performStartAction(); |
||||
performStatusAction("true"); |
||||
performStopAction(); |
||||
performStatusAction("false"); |
||||
|
||||
verify(testJukeboxPlayer.getPlayQueue(), times(2)).setStatus(PlayQueue.Status.PLAYING); |
||||
verify(testJukeboxPlayer.getPlayQueue(), times(1)).setStatus(PlayQueue.Status.STOPPED); |
||||
assertThat(testJukeboxPlayer.getPlayQueue().getIndex()).isEqualTo(0); |
||||
assertThat(testJukeboxPlayer.getPlayQueue().getStatus()).isEqualTo(PlayQueue.Status.STOPPED); |
||||
} |
||||
|
||||
private void performStatusAction(String expectedPlayingValue) throws Exception { |
||||
mvc.perform(get("/rest/jukeboxControl.view") |
||||
.param("v", AIRSONIC_API_VERSION) |
||||
.param("c", CLIENT_NAME) |
||||
.param("f", EXPECTED_FORMAT) |
||||
.param("action", "status") |
||||
.contentType(MediaType.APPLICATION_JSON)) |
||||
.andExpect(status().isOk()) |
||||
.andExpect(jsonPath("$.subsonic-response.status").value("ok")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.currentIndex").value("0")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.playing").value(expectedPlayingValue)) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.position").value("0")); |
||||
} |
||||
|
||||
private ResultActions performGetAction() throws Exception { |
||||
return mvc.perform(get("/rest/jukeboxControl.view") |
||||
.param("v", AIRSONIC_API_VERSION) |
||||
.param("c", CLIENT_NAME) |
||||
.param("f", EXPECTED_FORMAT) |
||||
.param("action", "get") |
||||
.contentType(MediaType.APPLICATION_JSON)) |
||||
.andExpect(status().isOk()) |
||||
.andExpect(jsonPath("$.subsonic-response.status").value("ok")); |
||||
} |
||||
|
||||
private void performStopAction() throws Exception { |
||||
mvc.perform(get("/rest/jukeboxControl.view") |
||||
.param("v", AIRSONIC_API_VERSION) |
||||
.param("c", CLIENT_NAME) |
||||
.param("f", EXPECTED_FORMAT) |
||||
.param("action", "stop") |
||||
.contentType(MediaType.APPLICATION_JSON)) |
||||
.andExpect(status().isOk()) |
||||
.andExpect(jsonPath("$.subsonic-response.status").value("ok")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.currentIndex").value("0")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.playing").value("false")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.position").value("0")); |
||||
} |
||||
|
||||
private void performStartAction() throws Exception { |
||||
mvc.perform(get("/rest/jukeboxControl.view") |
||||
.param("v", AIRSONIC_API_VERSION) |
||||
.param("c", CLIENT_NAME) |
||||
.param("f", EXPECTED_FORMAT) |
||||
.param("action", "start") |
||||
.contentType(MediaType.APPLICATION_JSON)) |
||||
.andExpect(status().isOk()) |
||||
.andExpect(jsonPath("$.subsonic-response.status").value("ok")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.currentIndex").value("0")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.playing").value("true")) |
||||
.andExpect(jsonPath("$.subsonic-response.jukeboxStatus.position").value("0")); |
||||
} |
||||
} |
@ -0,0 +1,38 @@ |
||||
package org.airsonic.player.api.jukebox; |
||||
|
||||
import com.github.biconou.AudioPlayer.JavaPlayer; |
||||
import org.airsonic.player.domain.Player; |
||||
import org.airsonic.player.domain.PlayerTechnology; |
||||
import org.airsonic.player.service.jukebox.JavaPlayerFactory; |
||||
import org.junit.Before; |
||||
import org.springframework.boot.test.mock.mockito.MockBean; |
||||
|
||||
import static org.mockito.Mockito.mock; |
||||
import static org.mockito.Mockito.when; |
||||
|
||||
public class AirsonicRestApiJukeboxIntTest extends AbstractAirsonicRestApiJukeboxIntTest { |
||||
|
||||
@MockBean |
||||
protected JavaPlayerFactory javaPlayerFactory; |
||||
|
||||
@Before |
||||
@Override |
||||
public void setup() throws Exception { |
||||
super.setup(); |
||||
JavaPlayer mockJavaPlayer = mock(JavaPlayer.class); |
||||
when(mockJavaPlayer.getPlayingInfos()).thenReturn( () -> 0 ); |
||||
when(mockJavaPlayer.getGain()).thenReturn(0.75f); |
||||
when(javaPlayerFactory.createJavaPlayer()).thenReturn(mockJavaPlayer); |
||||
} |
||||
|
||||
@Override |
||||
protected void createTestPlayer() { |
||||
Player jukeBoxPlayer = new Player(); |
||||
jukeBoxPlayer.setName(JUKEBOX_PLAYER_NAME); |
||||
jukeBoxPlayer.setUsername("admin"); |
||||
jukeBoxPlayer.setClientId(CLIENT_NAME + "-jukebox"); |
||||
jukeBoxPlayer.setTechnology(PlayerTechnology.JAVA_JUKEBOX); |
||||
playerService.createPlayer(jukeBoxPlayer); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,62 @@ |
||||
package org.airsonic.player.api.jukebox; |
||||
|
||||
import org.airsonic.player.domain.Player; |
||||
import org.airsonic.player.domain.PlayerTechnology; |
||||
import org.airsonic.player.service.TranscodingService; |
||||
import org.airsonic.player.service.jukebox.AudioPlayer; |
||||
import org.airsonic.player.service.jukebox.AudioPlayerFactory; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.springframework.boot.test.mock.mockito.MockBean; |
||||
import org.springframework.boot.test.mock.mockito.SpyBean; |
||||
import org.springframework.security.test.context.support.WithMockUser; |
||||
|
||||
import static org.mockito.Matchers.any; |
||||
import static org.mockito.Mockito.*; |
||||
|
||||
public class AirsonicRestApiJukeboxLegacyIntTest extends AirsonicRestApiJukeboxIntTest { |
||||
|
||||
@SpyBean |
||||
private TranscodingService transcodingService; |
||||
@MockBean |
||||
protected AudioPlayerFactory audioPlayerFactory; |
||||
|
||||
private AudioPlayer mockAudioPlayer; |
||||
|
||||
@Before |
||||
@Override |
||||
public void setup() throws Exception { |
||||
super.setup(); |
||||
mockAudioPlayer = mock(AudioPlayer.class); |
||||
when(audioPlayerFactory.createAudioPlayer(any(), any())).thenReturn(mockAudioPlayer); |
||||
doReturn(null).when(transcodingService).getTranscodedInputStream(any()); |
||||
} |
||||
|
||||
@Override |
||||
protected final void createTestPlayer() { |
||||
Player jukeBoxPlayer = new Player(); |
||||
jukeBoxPlayer.setName(JUKEBOX_PLAYER_NAME); |
||||
jukeBoxPlayer.setUsername("admin"); |
||||
jukeBoxPlayer.setClientId(CLIENT_NAME + "-jukebox"); |
||||
jukeBoxPlayer.setTechnology(PlayerTechnology.JUKEBOX); |
||||
playerService.createPlayer(jukeBoxPlayer); |
||||
} |
||||
|
||||
@Test |
||||
@WithMockUser(username = "admin") |
||||
@Override |
||||
public void jukeboxStartActionTest() throws Exception { |
||||
super.jukeboxStartActionTest(); |
||||
verify(mockAudioPlayer).play(); |
||||
} |
||||
|
||||
@Test |
||||
@WithMockUser(username = "admin") |
||||
@Override |
||||
public void jukeboxStopActionTest() throws Exception { |
||||
super.jukeboxStopActionTest(); |
||||
verify(mockAudioPlayer).play(); |
||||
verify(mockAudioPlayer).pause(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,41 @@ |
||||
package org.airsonic.player.service; |
||||
|
||||
import org.airsonic.player.domain.Transcoding; |
||||
import org.airsonic.player.util.HomeRule; |
||||
import org.junit.ClassRule; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.test.context.SpringBootTest; |
||||
import org.springframework.boot.test.mock.mockito.SpyBean; |
||||
import org.springframework.test.context.junit4.SpringRunner; |
||||
import static org.mockito.Mockito.*; |
||||
|
||||
@RunWith(SpringRunner.class) |
||||
@SpringBootTest |
||||
public class TranscodingServiceIntTest { |
||||
|
||||
@Autowired |
||||
private TranscodingService transcodingService; |
||||
@SpyBean |
||||
private PlayerService playerService; |
||||
|
||||
@ClassRule |
||||
public static final HomeRule classRule = new HomeRule(); // sets airsonic.home to a temporary dir
|
||||
|
||||
@Test |
||||
public void createTranscodingTest() { |
||||
// Given
|
||||
Transcoding transcoding = new Transcoding(null, |
||||
"test-transcoding", |
||||
"mp3", |
||||
"wav", |
||||
"step1", |
||||
"step2", |
||||
"step3", |
||||
true); |
||||
|
||||
transcodingService.createTranscoding(transcoding); |
||||
verify(playerService).getAllPlayers(); |
||||
} |
||||
} |
@ -0,0 +1,13 @@ |
||||
spring.mvc.view.prefix: /WEB-INF/jsp/ |
||||
spring.mvc.view.suffix: .jsp |
||||
server.error.includeStacktrace: ALWAYS |
||||
logging.level.root=WARN |
||||
logging.level.org.airsonic=INFO |
||||
logging.level.liquibase=INFO |
||||
logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p){green} %clr(---){faint} %clr(%-40.40logger{32}){blue} %clr(:){faint} %m%n%wEx |
||||
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- %-40.40logger{32} : %m%n%wEx |
||||
DatabaseConfigType=embed |
||||
DatabaseConfigEmbedDriver=org.hsqldb.jdbcDriver |
||||
DatabaseConfigEmbedUrl=jdbc:hsqldb:mem:airsonic |
||||
DatabaseConfigEmbedUsername=sa |
||||
DatabaseConfigEmbedPassword= |
Loading…
Reference in new issue