mirror of
https://github.com/imgfloat/server.git
synced 2026-02-05 03:39:26 +00:00
fix tests
This commit is contained in:
@@ -11,12 +11,17 @@ import static org.mockito.Mockito.when;
|
|||||||
|
|
||||||
import dev.kruhlmann.imgfloat.model.Asset;
|
import dev.kruhlmann.imgfloat.model.Asset;
|
||||||
import dev.kruhlmann.imgfloat.model.AssetView;
|
import dev.kruhlmann.imgfloat.model.AssetView;
|
||||||
|
import dev.kruhlmann.imgfloat.model.AudioAsset;
|
||||||
import dev.kruhlmann.imgfloat.model.Channel;
|
import dev.kruhlmann.imgfloat.model.Channel;
|
||||||
|
import dev.kruhlmann.imgfloat.model.ScriptAsset;
|
||||||
import dev.kruhlmann.imgfloat.model.Settings;
|
import dev.kruhlmann.imgfloat.model.Settings;
|
||||||
import dev.kruhlmann.imgfloat.model.TransformRequest;
|
import dev.kruhlmann.imgfloat.model.TransformRequest;
|
||||||
import dev.kruhlmann.imgfloat.model.VisibilityRequest;
|
import dev.kruhlmann.imgfloat.model.VisibilityRequest;
|
||||||
import dev.kruhlmann.imgfloat.repository.AssetRepository;
|
import dev.kruhlmann.imgfloat.repository.AssetRepository;
|
||||||
|
import dev.kruhlmann.imgfloat.repository.AudioAssetRepository;
|
||||||
import dev.kruhlmann.imgfloat.repository.ChannelRepository;
|
import dev.kruhlmann.imgfloat.repository.ChannelRepository;
|
||||||
|
import dev.kruhlmann.imgfloat.repository.ScriptAssetRepository;
|
||||||
|
import dev.kruhlmann.imgfloat.repository.VisualAssetRepository;
|
||||||
import dev.kruhlmann.imgfloat.service.AssetStorageService;
|
import dev.kruhlmann.imgfloat.service.AssetStorageService;
|
||||||
import dev.kruhlmann.imgfloat.service.ChannelDirectoryService;
|
import dev.kruhlmann.imgfloat.service.ChannelDirectoryService;
|
||||||
import dev.kruhlmann.imgfloat.service.SettingsService;
|
import dev.kruhlmann.imgfloat.service.SettingsService;
|
||||||
@@ -48,6 +53,9 @@ class ChannelDirectoryServiceTest {
|
|||||||
private SimpMessagingTemplate messagingTemplate;
|
private SimpMessagingTemplate messagingTemplate;
|
||||||
private ChannelRepository channelRepository;
|
private ChannelRepository channelRepository;
|
||||||
private AssetRepository assetRepository;
|
private AssetRepository assetRepository;
|
||||||
|
private VisualAssetRepository visualAssetRepository;
|
||||||
|
private AudioAssetRepository audioAssetRepository;
|
||||||
|
private ScriptAssetRepository scriptAssetRepository;
|
||||||
private SettingsService settingsService;
|
private SettingsService settingsService;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
@@ -55,6 +63,9 @@ class ChannelDirectoryServiceTest {
|
|||||||
messagingTemplate = mock(SimpMessagingTemplate.class);
|
messagingTemplate = mock(SimpMessagingTemplate.class);
|
||||||
channelRepository = mock(ChannelRepository.class);
|
channelRepository = mock(ChannelRepository.class);
|
||||||
assetRepository = mock(AssetRepository.class);
|
assetRepository = mock(AssetRepository.class);
|
||||||
|
visualAssetRepository = mock(VisualAssetRepository.class);
|
||||||
|
audioAssetRepository = mock(AudioAssetRepository.class);
|
||||||
|
scriptAssetRepository = mock(ScriptAssetRepository.class);
|
||||||
settingsService = mock(SettingsService.class);
|
settingsService = mock(SettingsService.class);
|
||||||
when(settingsService.get()).thenReturn(Settings.defaults());
|
when(settingsService.get()).thenReturn(Settings.defaults());
|
||||||
setupInMemoryPersistence();
|
setupInMemoryPersistence();
|
||||||
@@ -68,6 +79,9 @@ class ChannelDirectoryServiceTest {
|
|||||||
service = new ChannelDirectoryService(
|
service = new ChannelDirectoryService(
|
||||||
channelRepository,
|
channelRepository,
|
||||||
assetRepository,
|
assetRepository,
|
||||||
|
visualAssetRepository,
|
||||||
|
audioAssetRepository,
|
||||||
|
scriptAssetRepository,
|
||||||
messagingTemplate,
|
messagingTemplate,
|
||||||
assetStorageService,
|
assetStorageService,
|
||||||
mediaDetectionService,
|
mediaDetectionService,
|
||||||
@@ -111,7 +125,7 @@ class ChannelDirectoryServiceTest {
|
|||||||
String id = createSampleAsset(channel);
|
String id = createSampleAsset(channel);
|
||||||
|
|
||||||
TransformRequest transform = validTransform();
|
TransformRequest transform = validTransform();
|
||||||
transform.setWidth(0);
|
transform.setWidth(0.0);
|
||||||
|
|
||||||
assertThatThrownBy(() -> service.updateTransform(channel, id, transform))
|
assertThatThrownBy(() -> service.updateTransform(channel, id, transform))
|
||||||
.isInstanceOf(ResponseStatusException.class)
|
.isInstanceOf(ResponseStatusException.class)
|
||||||
@@ -145,19 +159,13 @@ class ChannelDirectoryServiceTest {
|
|||||||
|
|
||||||
TransformRequest transform = validTransform();
|
TransformRequest transform = validTransform();
|
||||||
transform.setSpeed(0.1);
|
transform.setSpeed(0.1);
|
||||||
transform.setAudioSpeed(0.1);
|
|
||||||
transform.setAudioPitch(0.1);
|
|
||||||
transform.setAudioVolume(0.01);
|
transform.setAudioVolume(0.01);
|
||||||
transform.setAudioDelayMillis(0);
|
|
||||||
transform.setZIndex(1);
|
transform.setZIndex(1);
|
||||||
|
|
||||||
AssetView view = service.updateTransform(channel, id, transform).orElseThrow();
|
AssetView view = service.updateTransform(channel, id, transform).orElseThrow();
|
||||||
|
|
||||||
assertThat(view.speed()).isEqualTo(0.1);
|
assertThat(view.speed()).isEqualTo(0.1);
|
||||||
assertThat(view.audioSpeed()).isEqualTo(0.1);
|
|
||||||
assertThat(view.audioPitch()).isEqualTo(0.1);
|
|
||||||
assertThat(view.audioVolume()).isEqualTo(0.01);
|
assertThat(view.audioVolume()).isEqualTo(0.01);
|
||||||
assertThat(view.audioDelayMillis()).isEqualTo(0);
|
|
||||||
assertThat(view.zIndex()).isEqualTo(1);
|
assertThat(view.zIndex()).isEqualTo(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,17 +183,20 @@ class ChannelDirectoryServiceTest {
|
|||||||
|
|
||||||
private TransformRequest validTransform() {
|
private TransformRequest validTransform() {
|
||||||
TransformRequest transform = new TransformRequest();
|
TransformRequest transform = new TransformRequest();
|
||||||
transform.setX(10);
|
transform.setX(10.0);
|
||||||
transform.setY(20);
|
transform.setY(20.0);
|
||||||
transform.setWidth(200);
|
transform.setWidth(200.0);
|
||||||
transform.setHeight(150);
|
transform.setHeight(150.0);
|
||||||
transform.setRotation(45);
|
transform.setRotation(45.0);
|
||||||
return transform;
|
return transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupInMemoryPersistence() {
|
private void setupInMemoryPersistence() {
|
||||||
Map<String, Channel> channels = new ConcurrentHashMap<>();
|
Map<String, Channel> channels = new ConcurrentHashMap<>();
|
||||||
Map<String, Asset> assets = new ConcurrentHashMap<>();
|
Map<String, Asset> assets = new ConcurrentHashMap<>();
|
||||||
|
Map<String, dev.kruhlmann.imgfloat.model.VisualAsset> visualAssets = new ConcurrentHashMap<>();
|
||||||
|
Map<String, AudioAsset> audioAssets = new ConcurrentHashMap<>();
|
||||||
|
Map<String, ScriptAsset> scriptAssets = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
when(channelRepository.findById(anyString())).thenAnswer((invocation) ->
|
when(channelRepository.findById(anyString())).thenAnswer((invocation) ->
|
||||||
Optional.ofNullable(channels.get(invocation.getArgument(0)))
|
Optional.ofNullable(channels.get(invocation.getArgument(0)))
|
||||||
@@ -222,21 +233,88 @@ class ChannelDirectoryServiceTest {
|
|||||||
Optional.ofNullable(assets.get(invocation.getArgument(0)))
|
Optional.ofNullable(assets.get(invocation.getArgument(0)))
|
||||||
);
|
);
|
||||||
when(assetRepository.findByBroadcaster(anyString())).thenAnswer((invocation) ->
|
when(assetRepository.findByBroadcaster(anyString())).thenAnswer((invocation) ->
|
||||||
filterAssetsByBroadcaster(assets.values(), invocation.getArgument(0), false)
|
filterAssetsByBroadcaster(assets.values(), invocation.getArgument(0))
|
||||||
);
|
|
||||||
when(assetRepository.findByBroadcasterAndHiddenFalse(anyString())).thenAnswer((invocation) ->
|
|
||||||
filterAssetsByBroadcaster(assets.values(), invocation.getArgument(0), true)
|
|
||||||
);
|
);
|
||||||
doAnswer((invocation) -> assets.remove(invocation.getArgument(0, Asset.class).getId()))
|
doAnswer((invocation) -> assets.remove(invocation.getArgument(0, Asset.class).getId()))
|
||||||
.when(assetRepository)
|
.when(assetRepository)
|
||||||
.delete(any(Asset.class));
|
.delete(any(Asset.class));
|
||||||
|
|
||||||
|
when(visualAssetRepository.save(any(dev.kruhlmann.imgfloat.model.VisualAsset.class))).thenAnswer(
|
||||||
|
(invocation) -> {
|
||||||
|
dev.kruhlmann.imgfloat.model.VisualAsset visual = invocation.getArgument(0);
|
||||||
|
visualAssets.put(visual.getId(), visual);
|
||||||
|
return visual;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
when(visualAssetRepository.findById(anyString())).thenAnswer((invocation) ->
|
||||||
|
Optional.ofNullable(visualAssets.get(invocation.getArgument(0)))
|
||||||
|
);
|
||||||
|
when(visualAssetRepository.findByIdIn(any())).thenAnswer((invocation) -> {
|
||||||
|
Collection<String> ids = invocation.getArgument(0);
|
||||||
|
return visualAssets
|
||||||
|
.values()
|
||||||
|
.stream()
|
||||||
|
.filter((visual) -> ids.contains(visual.getId()))
|
||||||
|
.toList();
|
||||||
|
});
|
||||||
|
when(visualAssetRepository.findByIdInAndHiddenFalse(any())).thenAnswer((invocation) -> {
|
||||||
|
Collection<String> ids = invocation.getArgument(0);
|
||||||
|
return visualAssets
|
||||||
|
.values()
|
||||||
|
.stream()
|
||||||
|
.filter((visual) -> ids.contains(visual.getId()))
|
||||||
|
.filter((visual) -> !visual.isHidden())
|
||||||
|
.toList();
|
||||||
|
});
|
||||||
|
doAnswer((invocation) -> visualAssets.remove(invocation.getArgument(0, String.class)))
|
||||||
|
.when(visualAssetRepository)
|
||||||
|
.deleteById(anyString());
|
||||||
|
|
||||||
|
when(audioAssetRepository.save(any(AudioAsset.class))).thenAnswer((invocation) -> {
|
||||||
|
AudioAsset audio = invocation.getArgument(0);
|
||||||
|
audioAssets.put(audio.getId(), audio);
|
||||||
|
return audio;
|
||||||
|
});
|
||||||
|
when(audioAssetRepository.findById(anyString())).thenAnswer((invocation) ->
|
||||||
|
Optional.ofNullable(audioAssets.get(invocation.getArgument(0)))
|
||||||
|
);
|
||||||
|
when(audioAssetRepository.findByIdIn(any())).thenAnswer((invocation) -> {
|
||||||
|
Collection<String> ids = invocation.getArgument(0);
|
||||||
|
return audioAssets
|
||||||
|
.values()
|
||||||
|
.stream()
|
||||||
|
.filter((audio) -> ids.contains(audio.getId()))
|
||||||
|
.toList();
|
||||||
|
});
|
||||||
|
doAnswer((invocation) -> audioAssets.remove(invocation.getArgument(0, String.class)))
|
||||||
|
.when(audioAssetRepository)
|
||||||
|
.deleteById(anyString());
|
||||||
|
|
||||||
|
when(scriptAssetRepository.save(any(ScriptAsset.class))).thenAnswer((invocation) -> {
|
||||||
|
ScriptAsset script = invocation.getArgument(0);
|
||||||
|
scriptAssets.put(script.getId(), script);
|
||||||
|
return script;
|
||||||
|
});
|
||||||
|
when(scriptAssetRepository.findById(anyString())).thenAnswer((invocation) ->
|
||||||
|
Optional.ofNullable(scriptAssets.get(invocation.getArgument(0)))
|
||||||
|
);
|
||||||
|
when(scriptAssetRepository.findByIdIn(any())).thenAnswer((invocation) -> {
|
||||||
|
Collection<String> ids = invocation.getArgument(0);
|
||||||
|
return scriptAssets
|
||||||
|
.values()
|
||||||
|
.stream()
|
||||||
|
.filter((script) -> ids.contains(script.getId()))
|
||||||
|
.toList();
|
||||||
|
});
|
||||||
|
doAnswer((invocation) -> scriptAssets.remove(invocation.getArgument(0, String.class)))
|
||||||
|
.when(scriptAssetRepository)
|
||||||
|
.deleteById(anyString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Asset> filterAssetsByBroadcaster(Collection<Asset> assets, String broadcaster, boolean onlyVisible) {
|
private List<Asset> filterAssetsByBroadcaster(Collection<Asset> assets, String broadcaster) {
|
||||||
return assets
|
return assets
|
||||||
.stream()
|
.stream()
|
||||||
.filter((asset) -> asset.getBroadcaster().equalsIgnoreCase(broadcaster))
|
.filter((asset) -> asset.getBroadcaster().equalsIgnoreCase(broadcaster))
|
||||||
.filter((asset) -> !onlyVisible || !asset.isHidden())
|
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package dev.kruhlmann.imgfloat.service;
|
|||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
|
|
||||||
import dev.kruhlmann.imgfloat.model.Asset;
|
|
||||||
import dev.kruhlmann.imgfloat.service.media.AssetContent;
|
import dev.kruhlmann.imgfloat.service.media.AssetContent;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@@ -34,15 +33,14 @@ class AssetStorageServiceTest {
|
|||||||
@Test
|
@Test
|
||||||
void storesAndLoadsAssets() throws IOException {
|
void storesAndLoadsAssets() throws IOException {
|
||||||
byte[] bytes = new byte[] { 1, 2, 3 };
|
byte[] bytes = new byte[] { 1, 2, 3 };
|
||||||
Asset asset = new Asset("caster", "asset", "http://example.com", 10, 10);
|
String assetId = "asset-1";
|
||||||
asset.setMediaType("image/png");
|
|
||||||
|
|
||||||
service.storeAsset("caster", asset.getId(), bytes, "image/png");
|
service.storeAsset("caster", assetId, bytes, "image/png");
|
||||||
|
|
||||||
AssetContent loaded = service.loadAssetFile(asset).orElseThrow();
|
AssetContent loaded = service.loadAssetFile("caster", assetId, "image/png").orElseThrow();
|
||||||
assertThat(loaded.bytes()).containsExactly(bytes);
|
assertThat(loaded.bytes()).containsExactly(bytes);
|
||||||
assertThat(loaded.mediaType()).isEqualTo("image/png");
|
assertThat(loaded.mediaType()).isEqualTo("image/png");
|
||||||
assertThat(Files.exists(assets.resolve("caster").resolve(asset.getId() + ".png"))).isTrue();
|
assertThat(Files.exists(assets.resolve("caster").resolve(assetId + ".png"))).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -54,10 +52,9 @@ class AssetStorageServiceTest {
|
|||||||
@Test
|
@Test
|
||||||
void storesAndLoadsPreviews() throws IOException {
|
void storesAndLoadsPreviews() throws IOException {
|
||||||
byte[] preview = new byte[] { 9, 8, 7 };
|
byte[] preview = new byte[] { 9, 8, 7 };
|
||||||
Asset asset = new Asset("caster", "asset", "http://example.com", 10, 10);
|
String assetId = "asset-2";
|
||||||
asset.setMediaType("image/png");
|
|
||||||
|
|
||||||
service.storePreview("caster", asset.getId(), preview);
|
service.storePreview("caster", assetId, preview);
|
||||||
assertThat(service.loadPreview(asset)).isPresent();
|
assertThat(service.loadPreview("caster", assetId)).isPresent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user