fix tests

This commit is contained in:
2026-01-09 15:05:09 +01:00
parent 554fb2e6d0
commit 77826783ed
2 changed files with 103 additions and 28 deletions

View File

@@ -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();
} }
} }

View File

@@ -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();
} }
} }