From 7e91260f845e6c860b674c15d1ef013413e5a481 Mon Sep 17 00:00:00 2001 From: wo80 Date: Tue, 7 Oct 2025 14:09:34 +0200 Subject: [PATCH 1/8] Update tests. Add IRequestCache implementation that uses embedded resources. This way the MusicBrainzClient can be used to load the JSON file. --- src/Hqub.MusicBrainz.Tests/ArtistListTests.cs | 13 ++- src/Hqub.MusicBrainz.Tests/ArtistTests.cs | 13 ++- .../EmbeddedResourceCache.cs | 82 +++++++++++++++++++ src/Hqub.MusicBrainz.Tests/LabelListTests.cs | 13 ++- src/Hqub.MusicBrainz.Tests/LabelTests.cs | 15 +++- .../RecordingListTests.cs | 13 ++- src/Hqub.MusicBrainz.Tests/RecordingTests.cs | 17 +++- .../ReleaseGroupListTests.cs | 13 ++- .../ReleaseGroupTests.cs | 15 +++- .../ReleaseListTests.cs | 13 ++- src/Hqub.MusicBrainz.Tests/ReleaseTests.cs | 15 +++- src/Hqub.MusicBrainz.Tests/TestHelper.cs | 39 --------- 12 files changed, 192 insertions(+), 69 deletions(-) create mode 100644 src/Hqub.MusicBrainz.Tests/EmbeddedResourceCache.cs delete mode 100644 src/Hqub.MusicBrainz.Tests/TestHelper.cs diff --git a/src/Hqub.MusicBrainz.Tests/ArtistListTests.cs b/src/Hqub.MusicBrainz.Tests/ArtistListTests.cs index b257743..d4436b3 100644 --- a/src/Hqub.MusicBrainz.Tests/ArtistListTests.cs +++ b/src/Hqub.MusicBrainz.Tests/ArtistListTests.cs @@ -3,6 +3,7 @@ namespace Hqub.MusicBrainz.Tests { using Hqub.MusicBrainz.Entities.Collections; using NUnit.Framework; + using System.Threading.Tasks; // Resource: artist-search.json // Artist.Search("artist:(bob dylan)", 10); @@ -11,11 +12,17 @@ namespace Hqub.MusicBrainz.Tests public class ArtistListTests { - private readonly ArtistList data; + private ArtistList data; - public ArtistListTests() + [OneTimeSetUp] + public async Task Init() { - data = TestHelper.GetJson("artist-search.json"); + var client = new MusicBrainzClient() + { + Cache = EmbeddedResourceCache.Instance + }; + + data = await client.Artists.SearchAsync("artist:(bob dylan)", 10); } [Test] diff --git a/src/Hqub.MusicBrainz.Tests/ArtistTests.cs b/src/Hqub.MusicBrainz.Tests/ArtistTests.cs index 4324a50..036ca86 100644 --- a/src/Hqub.MusicBrainz.Tests/ArtistTests.cs +++ b/src/Hqub.MusicBrainz.Tests/ArtistTests.cs @@ -4,6 +4,7 @@ namespace Hqub.MusicBrainz.Tests using Hqub.MusicBrainz.Entities; using NUnit.Framework; using System.Linq; + using System.Threading.Tasks; // Resource: artist-get.json // Artist.Get("12195c41-6136-4dfd-acf1-9923dadc73e2", "release-groups", "tags", "works", "ratings", "artist-rels", "url-rels"); @@ -14,9 +15,17 @@ public class ArtistTests { Artist artist; - public ArtistTests() + [OneTimeSetUp] + public async Task Init() { - this.artist = TestHelper.GetJson("artist-get.json"); + var client = new MusicBrainzClient() + { + Cache = EmbeddedResourceCache.Instance + }; + + string[] inc = ["release-groups", "tags", "works", "ratings", "artist-rels", "url-rels"]; + + artist = await client.Artists.GetAsync("12195c41-6136-4dfd-acf1-9923dadc73e2", inc); } [Test] diff --git a/src/Hqub.MusicBrainz.Tests/EmbeddedResourceCache.cs b/src/Hqub.MusicBrainz.Tests/EmbeddedResourceCache.cs new file mode 100644 index 0000000..808d6be --- /dev/null +++ b/src/Hqub.MusicBrainz.Tests/EmbeddedResourceCache.cs @@ -0,0 +1,82 @@ + +namespace Hqub.MusicBrainz.Tests +{ + using Hqub.MusicBrainz.Cache; + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Reflection; + using System.Threading.Tasks; + + class EmbeddedResourceCache : IRequestCache + { + #region Singleton + + private static readonly object creationLock = new(); + private static EmbeddedResourceCache _default; + + public static EmbeddedResourceCache Instance + { + get + { + if (_default == null) + { + lock (creationLock) + { + _default ??= new EmbeddedResourceCache(); + } + } + + return _default; + } + } + + #endregion + + private static readonly Dictionary Data = new() + { + { "artist?query", "artist-search" }, + { "artist/", "artist-get" }, + { "label?query", "label-search" }, + { "label/", "label-get" }, + { "recording?query", "recording-search" }, + { "recording/", "recording-get" }, + { "release?query", "release-search" }, + { "release/", "release-get" }, + { "release-group?query", "releasegroup-search" }, + { "release-group/", "releasegroup-get" }, + }; + + private const string PATH_TEMPLATE = "Hqub.MusicBrainz.Tests.Data.{0}.json"; + + public Task Add(string request, Stream response) + { + throw new NotImplementedException(); + } + + public Task TryGetCachedItem(string request, out Stream stream) + { + foreach (var i in Data) + { + if (request.Contains(i.Key)) + { + var path = string.Format(PATH_TEMPLATE, i.Value); + + stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path); + + return Task.FromResult(true); + } + } + + // Do not go on calling the web service, but throw exception to signal + // that the test data is not setup correctly. + throw new Exception("Item not in cache."); + } + + public Task Contains(string request) + { + return Task.FromResult(Data.Any(i => request.Contains(i.Key))); + } + } +} diff --git a/src/Hqub.MusicBrainz.Tests/LabelListTests.cs b/src/Hqub.MusicBrainz.Tests/LabelListTests.cs index 7f091ce..aecc7ec 100644 --- a/src/Hqub.MusicBrainz.Tests/LabelListTests.cs +++ b/src/Hqub.MusicBrainz.Tests/LabelListTests.cs @@ -3,6 +3,7 @@ namespace Hqub.MusicBrainz.Tests { using Hqub.MusicBrainz.Entities.Collections; using NUnit.Framework; + using System.Threading.Tasks; // Resource: label-search.json // Label.Search("City Slang"); @@ -11,11 +12,17 @@ namespace Hqub.MusicBrainz.Tests public class LabelListTests { - private readonly LabelList data; + private LabelList data; - public LabelListTests() + [OneTimeSetUp] + public async Task Init() { - data = TestHelper.GetJson("label-search.json"); + var client = new MusicBrainzClient() + { + Cache = EmbeddedResourceCache.Instance + }; + + data = await client.Labels.SearchAsync("City Slang", 10); } [Test] diff --git a/src/Hqub.MusicBrainz.Tests/LabelTests.cs b/src/Hqub.MusicBrainz.Tests/LabelTests.cs index 3777f3d..1a27806 100644 --- a/src/Hqub.MusicBrainz.Tests/LabelTests.cs +++ b/src/Hqub.MusicBrainz.Tests/LabelTests.cs @@ -4,6 +4,7 @@ namespace Hqub.MusicBrainz.Tests using Hqub.MusicBrainz.Entities; using NUnit.Framework; using System.Linq; + using System.Threading.Tasks; // Resource: label-get.json // Label.Get("82935ddb-a9d6-45a7-85e3-0b0add51fa1c", "releases", "artist-credits", "genres", "url-rels"); @@ -12,11 +13,19 @@ namespace Hqub.MusicBrainz.Tests public class LabelTests { - Label label; + private Label label; - public LabelTests() + [OneTimeSetUp] + public async Task Init() { - this.label = TestHelper.GetJson