From fcf896cad2025f4d78ada020e860bd9a5212fad4 Mon Sep 17 00:00:00 2001 From: Viperinius Date: Mon, 27 Jan 2025 21:04:14 +0100 Subject: [PATCH] add tests for db provider playlist interactions --- .../Db/DbRepositoryWrapper.cs | 15 ++ .../Db/ProviderPlaylistsTests.cs | 209 ++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 Viperinius.Plugin.SpotifyImport.Tests/Db/ProviderPlaylistsTests.cs diff --git a/Viperinius.Plugin.SpotifyImport.Tests/Db/DbRepositoryWrapper.cs b/Viperinius.Plugin.SpotifyImport.Tests/Db/DbRepositoryWrapper.cs index 5b28ac3..c6aa324 100644 --- a/Viperinius.Plugin.SpotifyImport.Tests/Db/DbRepositoryWrapper.cs +++ b/Viperinius.Plugin.SpotifyImport.Tests/Db/DbRepositoryWrapper.cs @@ -20,5 +20,20 @@ public static DbRepositoryWrapper GetInstance() { return new DbRepositoryWrapper(":memory:"); } + + public string GetInsertProviderPlaylistCmd() + { + return InsertProviderPlaylistCmd; + } + + public string GetInsertProviderTrackCmd() + { + return InsertProviderTrackCmd; + } + + public string GetInsertProviderPlaylistTrackCmd() + { + return InsertProviderPlaylistTrackCmd; + } } } diff --git a/Viperinius.Plugin.SpotifyImport.Tests/Db/ProviderPlaylistsTests.cs b/Viperinius.Plugin.SpotifyImport.Tests/Db/ProviderPlaylistsTests.cs new file mode 100644 index 0000000..59e34e9 --- /dev/null +++ b/Viperinius.Plugin.SpotifyImport.Tests/Db/ProviderPlaylistsTests.cs @@ -0,0 +1,209 @@ +#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; +using static SpotifyAPI.Web.PlayerSetRepeatRequest; + +namespace Viperinius.Plugin.SpotifyImport.Tests.Db +{ + public class ProviderPlaylistsTests + { + [Theory] + [ClassData(typeof(CanRetrieveLastStateData))] + public void CanRetrieveLastState(bool queryCorrectProvider, bool queryCorrectPlaylist, bool queryNonExistent, bool shouldHaveValue, bool shouldHaveCorrectState) + { + var correctProviderId = "ABCDEF"; + var otherProviderId = "xyz"; + var correctPlaylistId = "948basd"; + var otherPlaylistId = "a09hf4ASPd"; + var nonExistentPlaylistId = "adoi4goais"; + var correctState = "hello"; + var otherState = "bye"; + + using var db = DbRepositoryWrapper.GetInstance(); + db.InitDb(); + + using var cmd = db.WrappedConnection.CreateCommand(); + cmd.CommandText = db.GetInsertProviderPlaylistCmd(); + cmd.Parameters.AddWithValue("$ProviderId", correctProviderId); + cmd.Parameters.AddWithValue("$PlaylistId", correctPlaylistId); + cmd.Parameters.AddWithValue("$LastState", correctState); + cmd.Parameters.AddWithValue("$LastTimestamp", DateTime.MinValue); + Assert.Equal(1, cmd.ExecuteNonQuery()); + + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("$ProviderId", otherProviderId); + cmd.Parameters.AddWithValue("$PlaylistId", otherPlaylistId); + cmd.Parameters.AddWithValue("$LastState", otherState); + cmd.Parameters.AddWithValue("$LastTimestamp", DateTime.MinValue); + Assert.Equal(1, cmd.ExecuteNonQuery()); + + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("$ProviderId", otherProviderId); + cmd.Parameters.AddWithValue("$PlaylistId", correctPlaylistId); + cmd.Parameters.AddWithValue("$LastState", otherState); + cmd.Parameters.AddWithValue("$LastTimestamp", DateTime.MinValue); + Assert.Equal(1, cmd.ExecuteNonQuery()); + + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("$ProviderId", correctProviderId); + cmd.Parameters.AddWithValue("$PlaylistId", otherPlaylistId); + cmd.Parameters.AddWithValue("$LastState", otherState); + cmd.Parameters.AddWithValue("$LastTimestamp", DateTime.MinValue); + Assert.Equal(1, cmd.ExecuteNonQuery()); + + var state = db.GetLastProviderPlaylistState( + queryCorrectProvider ? correctProviderId : otherProviderId, + queryNonExistent ? nonExistentPlaylistId : (queryCorrectPlaylist ? correctPlaylistId : otherPlaylistId)); + if (shouldHaveValue) + { + Assert.NotNull(state); + Assert.Equal(shouldHaveCorrectState ? correctState : otherState, state); + } + else + { + Assert.Null(state); + } + } + + class CanRetrieveLastStateData : IEnumerable + { + public IEnumerable GetDefault() + { + yield return new object[] { true, true, false, true, true }; + yield return new object[] { true, false, false, true, false }; + yield return new object[] { false, true, false, true, false }; + yield return new object[] { false, false, false, true, false }; + yield return new object[] { false, false, true, false, false }; + } + + public virtual IEnumerator GetEnumerator() => GetDefault().GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } + + [Fact] + public void CanRetrieveDbId() + { + var correctProviderId = "ABCDEF"; + var correctPlaylistId = "948basd"; + + using var db = DbRepositoryWrapper.GetInstance(); + db.InitDb(); + + using var cmd = db.WrappedConnection.CreateCommand(); + cmd.CommandText = db.GetInsertProviderPlaylistCmd(); + cmd.Parameters.AddWithValue("$ProviderId", "1a"); + cmd.Parameters.AddWithValue("$PlaylistId", "2b"); + cmd.Parameters.AddWithValue("$LastState", string.Empty); + cmd.Parameters.AddWithValue("$LastTimestamp", DateTime.MinValue); + Assert.Equal(1, cmd.ExecuteNonQuery()); + + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("$ProviderId", correctProviderId); + cmd.Parameters.AddWithValue("$PlaylistId", correctPlaylistId); + cmd.Parameters.AddWithValue("$LastState", string.Empty); + cmd.Parameters.AddWithValue("$LastTimestamp", DateTime.MinValue); + Assert.Equal(1, cmd.ExecuteNonQuery()); + + cmd.Parameters.Clear(); + cmd.CommandText = db.GetInsertProviderPlaylistCmd(); + cmd.Parameters.AddWithValue("$ProviderId", "a"); + cmd.Parameters.AddWithValue("$PlaylistId", "b"); + cmd.Parameters.AddWithValue("$LastState", string.Empty); + cmd.Parameters.AddWithValue("$LastTimestamp", DateTime.MinValue); + Assert.Equal(1, cmd.ExecuteNonQuery()); + + var id = db.GetProviderPlaylistDbId(correctProviderId, correctPlaylistId); + Assert.NotNull(id); + Assert.Equal(2, id); + + id = db.GetProviderPlaylistDbId("not", "existing"); + Assert.Null(id); + } + + [Fact] + public void CanInsert() + { + var correctProviderId = "ABCDEF"; + var correctPlaylistId = "948basd"; + var correctState = "diufsbief"; + + using var db = DbRepositoryWrapper.GetInstance(); + db.InitDb(); + + db.UpsertProviderPlaylist(correctProviderId, new ProviderPlaylistInfo + { + Id = correctPlaylistId, + State = correctState, + }); + + using var cmd = db.WrappedConnection.CreateCommand(); + cmd.CommandText = "SELECT * FROM ProviderPlaylists"; + var rowCount = 0; + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + rowCount++; + Assert.Equal(1, reader.GetInt32(0)); + Assert.Equal(correctProviderId, reader.GetString(1)); + Assert.Equal(correctPlaylistId, reader.GetString(2)); + Assert.Equal(correctState, reader.GetString(3)); + Assert.InRange(reader.GetDateTime(4), DateTime.UtcNow - TimeSpan.FromSeconds(5), DateTime.UtcNow + TimeSpan.FromSeconds(5)); + } + } + + Assert.Equal(1, rowCount); + } + + [Fact] + public void CanUpdate() + { + var correctProviderId = "ABCDEF"; + var correctPlaylistId = "948basd"; + var correctOldState = "F($Asdi7uv"; + var correctState = "diufsbief"; + + using var db = DbRepositoryWrapper.GetInstance(); + db.InitDb(); + + using var cmd = db.WrappedConnection.CreateCommand(); + cmd.CommandText = db.GetInsertProviderPlaylistCmd(); + cmd.Parameters.AddWithValue("$ProviderId", correctProviderId); + cmd.Parameters.AddWithValue("$PlaylistId", correctPlaylistId); + cmd.Parameters.AddWithValue("$LastState", correctOldState); + cmd.Parameters.AddWithValue("$LastTimestamp", DateTime.MinValue); + Assert.Equal(1, cmd.ExecuteNonQuery()); + + db.UpsertProviderPlaylist(correctProviderId, new ProviderPlaylistInfo + { + Id = correctPlaylistId, + State = correctState, + }); + + cmd.CommandText = "SELECT * FROM ProviderPlaylists"; + cmd.Parameters.Clear(); + var rowCount = 0; + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + rowCount++; + Assert.Equal(1, reader.GetInt32(0)); + Assert.Equal(correctProviderId, reader.GetString(1)); + Assert.Equal(correctPlaylistId, reader.GetString(2)); + Assert.Equal(correctState, reader.GetString(3)); + Assert.InRange(reader.GetDateTime(4), DateTime.UtcNow - TimeSpan.FromSeconds(5), DateTime.UtcNow + TimeSpan.FromSeconds(5)); + } + } + + Assert.Equal(1, rowCount); + } + } +}