Skip to content

Commit

Permalink
add tests for db initialisation
Browse files Browse the repository at this point in the history
  • Loading branch information
Viperinius committed Jan 27, 2025
1 parent 4b8a8a7 commit 37192bf
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 4 deletions.
24 changes: 24 additions & 0 deletions Viperinius.Plugin.SpotifyImport.Tests/Db/DbRepositoryWrapper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Data.Sqlite;
using Viperinius.Plugin.SpotifyImport.Utils;

namespace Viperinius.Plugin.SpotifyImport.Tests.Db
{
internal class DbRepositoryWrapper : DbRepository
{
public DbRepositoryWrapper(string path) : base(path)
{
}

public SqliteConnection WrappedConnection => Connection;

public static DbRepositoryWrapper GetInstance()
{
return new DbRepositoryWrapper(":memory:");
}
}
}
80 changes: 80 additions & 0 deletions Viperinius.Plugin.SpotifyImport.Tests/Db/InitTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;

namespace Viperinius.Plugin.SpotifyImport.Tests.Db
{
public class InitTests
{
private static Dictionary<string, List<(string, string)>> _tableCols = new Dictionary<string, List<(string, string)>>
{
{ "ProviderPlaylists", [("Id", "INTEGER"), ("ProviderId", "TEXT"), ("PlaylistId", "TEXT"), ("LastState", "TEXT"), ("LastTimestamp", "TEXT")] },
{ "ProviderTracks", [("Id", "INTEGER"), ("ProviderId", "TEXT"), ("TrackId", "TEXT"), ("Name", "TEXT"), ("AlbumName", "TEXT"), ("AlbumArtistNames", "TEXT"), ("ArtistNames", "TEXT"), ("Number", "INTEGER"), ("IsrcId", "TEXT")] },
{ "ProviderPlaylistTracks", [("Id", "INTEGER"), ("PlaylistId", "INTEGER"), ("TrackId", "INTEGER"), ("Position", "INTEGER")] },
};

[Fact]
public void ReturnsPath()
{
using var db = DbRepositoryWrapper.GetInstance();
Assert.Equal(":memory:", db.Path);
}

[Fact]
public void SupportsForeignKeys()
{
using var db = DbRepositoryWrapper.GetInstance();
using var cmd = db.WrappedConnection.CreateCommand();
cmd.CommandText = "PRAGMA foreign_keys;";
var result = (long?)cmd.ExecuteScalar();
Assert.Equal(1, result);
}

[Fact]
public void SetupTables()
{
using var db = DbRepositoryWrapper.GetInstance();
using var cmd = db.WrappedConnection.CreateCommand();
cmd.CommandText = "SELECT name FROM sqlite_schema WHERE type = 'table' AND name NOT LIKE 'sqlite_%'";
var tableRowCount = 0;
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
tableRowCount++;
}
}

Assert.Equal(0, tableRowCount);

db.InitDb();

using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
tableRowCount++;
var colRowCount = 0;
var name = reader.GetString(0);
Assert.True(_tableCols.ContainsKey(name));

using var colCmd = db.WrappedConnection.CreateCommand();
colCmd.CommandText = $"SELECT name, type FROM pragma_table_info('{name}')";
using var colReader = colCmd.ExecuteReader();
while (colReader.Read())
{
colRowCount++;
Assert.Contains((colReader.GetString(0), colReader.GetString(1)), _tableCols[name]);
}
}
}

Assert.Equal(_tableCols.Count, tableRowCount);
}
}
}
8 changes: 4 additions & 4 deletions Viperinius.Plugin.SpotifyImport/Utils/DbRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ internal class DbRepository : IDisposable
/*private const string TableProviderTrackMatchesName = "ProviderTrackMatches";*/

private const string UpdateProviderPlaylistGenericCmd = $"UPDATE {TableProviderPlaylistsName} SET ProviderId = $ProviderId, PlaylistId = $PlaylistId, LastState = $LastState, LastTimestamp = $LastTimestamp";
private const string InsertProviderPlaylistCmd = $"INSERT INTO {TableProviderPlaylistsName} (ProviderId, PlaylistId, LastState, LastTimestamp) VALUES ($ProviderId, $PlaylistId, $LastState, $LastTimestamp)";
private const string InsertProviderTrackCmd = $"INSERT INTO {TableProviderTracksName} (ProviderId, TrackId, Name, AlbumName, AlbumArtistNames, ArtistNames, Number, IsrcId) VALUES ($ProviderId, $TrackId, $Name, $AlbumName, $AlbumArtistNames, $ArtistNames, $Number, $IsrcId)";
protected const string InsertProviderPlaylistCmd = $"INSERT INTO {TableProviderPlaylistsName} (ProviderId, PlaylistId, LastState, LastTimestamp) VALUES ($ProviderId, $PlaylistId, $LastState, $LastTimestamp)";
protected const string InsertProviderTrackCmd = $"INSERT INTO {TableProviderTracksName} (ProviderId, TrackId, Name, AlbumName, AlbumArtistNames, ArtistNames, Number, IsrcId) VALUES ($ProviderId, $TrackId, $Name, $AlbumName, $AlbumArtistNames, $ArtistNames, $Number, $IsrcId)";
private const string UpdateProviderPlaylistTrackGenericCmd = $"UPDATE {TableProviderPlaylistTracksName} SET PlaylistId = $PlaylistId, TrackId = $TrackId, Position = $Position";
private const string InsertProviderPlaylistTrackCmd = $"INSERT INTO {TableProviderPlaylistTracksName} (PlaylistId, TrackId, Position) VALUES ($PlaylistId, $TrackId, $Position)";
protected const string InsertProviderPlaylistTrackCmd = $"INSERT INTO {TableProviderPlaylistTracksName} (PlaylistId, TrackId, Position) VALUES ($PlaylistId, $TrackId, $Position)";

private static readonly string[] _tableNames = new[]
{
Expand Down Expand Up @@ -81,7 +81,7 @@ public DbRepository(string path)
};
}

private SqliteConnection Connection
protected SqliteConnection Connection
{
get
{
Expand Down

0 comments on commit 37192bf

Please sign in to comment.