Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 104 additions & 67 deletions smoc.Tests/Configuration/ConfigurationBindingTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,85 +8,122 @@ namespace smoc.Tests.Configuration;
public class ConfigurationBindingTest {
[Fact]
public void Bind_SmocConfiguration_FromSection_UsingTuiConfigurationBuilder() {
var json = """
{
"SmocConfiguration": {
"LogLevel": "Trace",
"ActiveService": "SoundCloud",
"SongCacheSizeBytes": 5000000,
"SongCacheMaxElements": 20,
"AlbumCoverCacheSizeBytes": 3000000,
"AlbumCoverCacheMaxElements": 40,
"VisualizerFps": 30,
"EnableLoudnessNormalization": true,
"LoudnessNormalizationMode": "Full"
var originalConfig = SmocConfiguration.Defaults;
try {
var json = """
{
"SmocConfiguration": {
"LogLevel": "Trace",
"ActiveService": "SoundCloud",
"SongCacheSizeBytes": 5000000,
"SongCacheMaxElements": 20,
"AlbumCoverCacheSizeBytes": 3000000,
"AlbumCoverCacheMaxElements": 40,
"VisualizerFps": 30,
"EnableLoudnessNormalization": true,
"LoudnessNormalizationMode": "Full"
}
}
}
""";
""";

var builder = new TuiConfigurationBuilder("SMoC");
builder.RuntimeConfig = json;
builder.BindAppSettings<SmocConfiguration>("SmocConfiguration", s => SmocConfiguration.Defaults = s);
var builder = new TuiConfigurationBuilder("SMoC");
builder.RuntimeConfig = json;
builder.BindAppSettings<SmocConfiguration>("SmocConfiguration", s => SmocConfiguration.Defaults = s);

Assert.Equal(LogLevel.Trace, SmocConfiguration.Defaults.LogLevel);
Assert.Equal(StreamingService.SoundCloud, SmocConfiguration.Defaults.ActiveService);
Assert.Equal(5000000, SmocConfiguration.Defaults.SongCacheSizeBytes);
Assert.Equal(20, SmocConfiguration.Defaults.SongCacheMaxElements);
Assert.Equal(3000000, SmocConfiguration.Defaults.AlbumCoverCacheSizeBytes);
Assert.Equal(40, SmocConfiguration.Defaults.AlbumCoverCacheMaxElements);
Assert.Equal(30, SmocConfiguration.Defaults.VisualizerFps);
Assert.True(SmocConfiguration.Defaults.EnableLoudnessNormalization);
Assert.Equal(LoudnessNormalizationMode.Full, SmocConfiguration.Defaults.LoudnessNormalizationMode);
Assert.Equal(LogLevel.Trace, SmocConfiguration.Defaults.LogLevel);
Assert.Equal(StreamingService.SoundCloud, SmocConfiguration.Defaults.ActiveService);
Assert.Equal(5000000, SmocConfiguration.Defaults.SongCacheSizeBytes);
Assert.Equal(20, SmocConfiguration.Defaults.SongCacheMaxElements);
Assert.Equal(3000000, SmocConfiguration.Defaults.AlbumCoverCacheSizeBytes);
Assert.Equal(40, SmocConfiguration.Defaults.AlbumCoverCacheMaxElements);
Assert.Equal(30, SmocConfiguration.Defaults.VisualizerFps);
Assert.True(SmocConfiguration.Defaults.EnableLoudnessNormalization);
Assert.Equal(LoudnessNormalizationMode.Full, SmocConfiguration.Defaults.LoudnessNormalizationMode);
} finally {
SmocConfiguration.Defaults = originalConfig;
}
}

[Fact]
public void Bind_OtherConfigs_UsingTuiConfigurationBuilder() {
var json = """
{
"ListenHistoryConfig": {
"Enabled": false,
"MinimumPositionSeconds": 45,
"MinimumFraction": 0.75
},
"SoundCloudConfig": {
"ClientId": "sc-id",
"AuthToken": "sc-token"
},
"SubsonicConfig": {
"ServerHost": "subsonic.local",
"ServerPort": 4040,
"ServerScheme": "https",
"Username": "admin",
"Password": "secretpassword",
"UseToken": false
},
"YouTubeMusicConfig": {
"PlayerId": "player123"
var origListen = ListenHistoryConfig.Defaults;
var origSoundCloud = SoundCloudConfig.Defaults;
var origSubsonic = SubsonicConfig.Defaults;
var origTidal = TidalConfig.Defaults;
var origYtm = YouTubeMusicConfig.Defaults;

try {
var json = """
{
"ListenHistoryConfig": {
"Enabled": false,
"MinimumPositionSeconds": 45,
"MinimumFraction": 0.75
},
"SoundCloudConfig": {
"ClientId": "sc-id",
"AuthToken": "sc-token"
},
"SubsonicConfig": {
"ServerHost": "subsonic.local",
"ServerPort": 4040,
"ServerScheme": "https",
"Username": "admin",
"Password": "secretpassword",
"UseToken": false
},
"TidalConfig": {
"ClientId": "tidal-client-id",
"ClientSecret": "tidal-client-secret",
"AccessToken": "tidal-access-token",
"RefreshToken": "tidal-refresh-token",
"TokenExpiry": 1700000000,
"Quality": "LOSSLESS",
"CountryCode": "GB"
},
"YouTubeMusicConfig": {
"PlayerId": "player123"
}
}
}
""";
""";

var builder = new TuiConfigurationBuilder("SMoC");
builder.RuntimeConfig = json;
builder.BindAppSettings<ListenHistoryConfig>("ListenHistoryConfig", s => ListenHistoryConfig.Defaults = s)
.BindAppSettings<SoundCloudConfig>("SoundCloudConfig", s => SoundCloudConfig.Defaults = s)
.BindAppSettings<SubsonicConfig>("SubsonicConfig", s => SubsonicConfig.Defaults = s)
.BindAppSettings<TidalConfig>("TidalConfig", s => TidalConfig.Defaults = s)
.BindAppSettings<YouTubeMusicConfig>("YouTubeMusicConfig", s => YouTubeMusicConfig.Defaults = s);

var builder = new TuiConfigurationBuilder("SMoC");
builder.RuntimeConfig = json;
builder.BindAppSettings<ListenHistoryConfig>("ListenHistoryConfig", s => ListenHistoryConfig.Defaults = s)
.BindAppSettings<SoundCloudConfig>("SoundCloudConfig", s => SoundCloudConfig.Defaults = s)
.BindAppSettings<SubsonicConfig>("SubsonicConfig", s => SubsonicConfig.Defaults = s)
.BindAppSettings<YouTubeMusicConfig>("YouTubeMusicConfig", s => YouTubeMusicConfig.Defaults = s);
Assert.False(ListenHistoryConfig.Defaults.Enabled);
Assert.Equal(45, ListenHistoryConfig.Defaults.MinimumPositionSeconds);
Assert.Equal(0.75, ListenHistoryConfig.Defaults.MinimumFraction);

Assert.False(ListenHistoryConfig.Defaults.Enabled);
Assert.Equal(45, ListenHistoryConfig.Defaults.MinimumPositionSeconds);
Assert.Equal(0.75, ListenHistoryConfig.Defaults.MinimumFraction);
Assert.Equal("sc-id", SoundCloudConfig.Defaults.ClientId);
Assert.Equal("sc-token", SoundCloudConfig.Defaults.AuthToken);

Assert.Equal("sc-id", SoundCloudConfig.Defaults.ClientId);
Assert.Equal("sc-token", SoundCloudConfig.Defaults.AuthToken);
Assert.Equal("subsonic.local", SubsonicConfig.Defaults.ServerHost);
Assert.Equal(4040, SubsonicConfig.Defaults.ServerPort);
Assert.Equal("https", SubsonicConfig.Defaults.ServerScheme);
Assert.Equal("admin", SubsonicConfig.Defaults.Username);
Assert.Equal("secretpassword", SubsonicConfig.Defaults.Password);
Assert.False(SubsonicConfig.Defaults.UseToken);

Assert.Equal("subsonic.local", SubsonicConfig.Defaults.ServerHost);
Assert.Equal(4040, SubsonicConfig.Defaults.ServerPort);
Assert.Equal("https", SubsonicConfig.Defaults.ServerScheme);
Assert.Equal("admin", SubsonicConfig.Defaults.Username);
Assert.Equal("secretpassword", SubsonicConfig.Defaults.Password);
Assert.False(SubsonicConfig.Defaults.UseToken);
Assert.Equal("tidal-client-id", TidalConfig.Defaults.ClientId);
Assert.Equal("tidal-client-secret", TidalConfig.Defaults.ClientSecret);
Assert.Equal("tidal-access-token", TidalConfig.Defaults.AccessToken);
Assert.Equal("tidal-refresh-token", TidalConfig.Defaults.RefreshToken);
Assert.Equal(1700000000L, TidalConfig.Defaults.TokenExpiry);
Assert.Equal("LOSSLESS", TidalConfig.Defaults.Quality);
Assert.Equal("GB", TidalConfig.Defaults.CountryCode);

Assert.Equal("player123", YouTubeMusicConfig.Defaults.PlayerId);
Assert.Equal("player123", YouTubeMusicConfig.Defaults.PlayerId);
} finally {
ListenHistoryConfig.Defaults = origListen;
SoundCloudConfig.Defaults = origSoundCloud;
SubsonicConfig.Defaults = origSubsonic;
TidalConfig.Defaults = origTidal;
YouTubeMusicConfig.Defaults = origYtm;
}
}
}
79 changes: 79 additions & 0 deletions smoc.Tests/Streaming/Tidal/TidalMappingTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
using Smoc.Streaming.Tidal;
using Smoc.Streaming.Tidal.Models;
using Xunit;

namespace smoc.Tests.Streaming.Tidal;

public class TidalMappingTest {
[Fact]
public void MapTrackToSong_FullMetadata_MapsCorrectly() {
var artist = new TidalArtist(42, "Test Artist", "pic-id");
var album = new TidalAlbum(101, "Test Album", "cover-uuid-1234", "2024-05-15", artist);
var track = new TidalTrack(999, "Test Track", 215, 3, album, artist, [artist]);

var song = TidalStreamingClient.MapTrackToSong(track);

Assert.Equal("999", song.Id);
Assert.Equal("Test Track", song.Title);
Assert.Equal(TimeSpan.FromSeconds(215), song.Duration);
Assert.Equal(3, song.TrackNumber);
Assert.Equal("Test Artist", song.Artist.Name);
Assert.Equal("42", song.Artist.Id);
Assert.Equal("101", song.Album.Id);
Assert.Equal("Test Album", song.Album.Name);
Assert.Equal(2024, song.Album.ReleaseYear);
Assert.Equal(2, song.Album.Covers.Count());
}

[Fact]
public void MapTrackToSong_NullArtist_FallsBackToAlbumArtist() {
var albumArtist = new TidalArtist(55, "Album Artist", null);
var album = new TidalAlbum(202, "Album Name", null, "2020-01-01", albumArtist);
var track = new TidalTrack(888, "Track Name", 180, 1, album, null, null);

var song = TidalStreamingClient.MapTrackToSong(track);

Assert.Equal("Album Artist", song.Artist.Name);
Assert.Equal("55", song.Artist.Id);
Assert.Empty(song.Album.Covers);
Assert.Equal(2020, song.Album.ReleaseYear);
}

[Fact]
public void MapTrackToSong_NullArtistAndAlbum_DoesNotThrow() {
var track = new TidalTrack(777, "Standalone Track", 120, 1, null, null, null);

var song = TidalStreamingClient.MapTrackToSong(track);

Assert.Equal("777", song.Id);
Assert.Equal("Standalone Track", song.Title);
Assert.Equal("Unknown Artist", song.Artist.Name);
Assert.Equal("Unknown Album", song.Album.Name);
Assert.Empty(song.Album.Covers);
Assert.Null(song.Album.ReleaseYear);
}

[Fact]
public void MapAlbumToAlbum_NullCoverAndInvalidReleaseDate_HandlesGracefully() {
var tidalAlbum = new TidalAlbum(303, "Album Without Cover", null, "invalid-date", null);

var album = TidalStreamingClient.MapAlbumToAlbum(tidalAlbum);

Assert.Equal("303", album.Id);
Assert.Equal("Album Without Cover", album.Name);
Assert.Empty(album.Covers);
Assert.Null(album.ReleaseYear);
Assert.Equal("Unknown Artist", album.Artist.Name);
}

[Fact]
public void MapAlbumToAlbum_CoverFormattedWithSlashes() {
var tidalAlbum = new TidalAlbum(404, "Cover Album", "ab-cd-ef", "1999-12-31", null);

var album = TidalStreamingClient.MapAlbumToAlbum(tidalAlbum);

Assert.NotEmpty(album.Covers);
Assert.Contains("ab/cd/ef", album.Covers.First().Url);
Assert.Equal(1999, album.ReleaseYear);
}
}
Loading
Loading