From 2fbdcdb463bfc57d14f5f25c11cc64b22e62817c Mon Sep 17 00:00:00 2001 From: wo80 Date: Sun, 12 Oct 2025 10:11:51 +0200 Subject: [PATCH 1/4] Add support for area relationship to Relation class. --- src/Hqub.MusicBrainz/Entities/Relation.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Hqub.MusicBrainz/Entities/Relation.cs b/src/Hqub.MusicBrainz/Entities/Relation.cs index 113b764..7f9d942 100644 --- a/src/Hqub.MusicBrainz/Entities/Relation.cs +++ b/src/Hqub.MusicBrainz/Entities/Relation.cs @@ -86,6 +86,12 @@ public class Relation [DataMember(Name = "work")] public Work Work { get; set; } + /// + /// Gets or sets the area relationship (include area-rels). + /// + [DataMember(Name = "area")] + public Area Area { get; set; } + // Other relationships: // // /// From 817964e39f5d0d260f911984eeecfd88d0570fb7 Mon Sep 17 00:00:00 2001 From: wo80 Date: Sun, 12 Oct 2025 10:13:21 +0200 Subject: [PATCH 2/4] Add support for relations to Area class. --- src/Hqub.MusicBrainz/Entities/Area.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Hqub.MusicBrainz/Entities/Area.cs b/src/Hqub.MusicBrainz/Entities/Area.cs index 34f1604..8a2245b 100644 --- a/src/Hqub.MusicBrainz/Entities/Area.cs +++ b/src/Hqub.MusicBrainz/Entities/Area.cs @@ -11,6 +11,8 @@ namespace Hqub.MusicBrainz.Entities [DataContract(Name = "area")] public class Area : IEntity { + #region Properties + /// /// Gets or sets the MusicBrainz id. /// @@ -52,5 +54,20 @@ public class Area : IEntity /// [DataMember(Name = "iso-3166-2-codes")] public List Iso2Codes { get; set; } + + #endregion + + #region Sub-queries + + /// + /// Gets or sets a list of relations associated to this area. + /// + /// + /// var e = await client.Area.GetAsync(mbid, "area-rels"); + /// + [DataMember(Name = "relations")] + public List Relations { get; set; } + + #endregion } } From ffc39eddc1870deb880a82c3cde2284f32a7c0bf Mon Sep 17 00:00:00 2001 From: wo80 Date: Sun, 12 Oct 2025 10:14:47 +0200 Subject: [PATCH 3/4] Add area lookup service to MusicBrainzClient. --- src/Hqub.MusicBrainz/MusicBrainzClient.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Hqub.MusicBrainz/MusicBrainzClient.cs b/src/Hqub.MusicBrainz/MusicBrainzClient.cs index 1153894..55b8576 100644 --- a/src/Hqub.MusicBrainz/MusicBrainzClient.cs +++ b/src/Hqub.MusicBrainz/MusicBrainzClient.cs @@ -56,6 +56,11 @@ public sealed class MusicBrainzClient : IDisposable /// public ILookupService Work { get; } + /// + /// Gets the area entity lookup service. + /// + public ILookupService Area { get; } + #endregion /// @@ -63,7 +68,7 @@ public sealed class MusicBrainzClient : IDisposable /// public IRequestCache Cache { get; set; } - private HttpClient client; + private readonly HttpClient client; /// /// Initializes a new instance of the class. @@ -116,6 +121,7 @@ public MusicBrainzClient(HttpClient httpClient) ReleaseGroups = new ReleaseGroupService(this, urlBuilder); Work = new LookupService(this, urlBuilder, "work"); + Area = new LookupService(this, urlBuilder, "area"); client = httpClient; } From 505331b0c1ad2cd343e47ea793a063136df09c6f Mon Sep 17 00:00:00 2001 From: wo80 Date: Sun, 12 Oct 2025 10:22:35 +0200 Subject: [PATCH 4/4] Add area service tests. --- src/Hqub.MusicBrainz.Tests/AreaGetTests.cs | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/Hqub.MusicBrainz.Tests/AreaGetTests.cs diff --git a/src/Hqub.MusicBrainz.Tests/AreaGetTests.cs b/src/Hqub.MusicBrainz.Tests/AreaGetTests.cs new file mode 100644 index 0000000..a335286 --- /dev/null +++ b/src/Hqub.MusicBrainz.Tests/AreaGetTests.cs @@ -0,0 +1,61 @@ +namespace Hqub.MusicBrainz.Tests +{ + using Hqub.MusicBrainz.Entities; + using NUnit.Framework; + using System.Linq; + using System.Threading.Tasks; + + // Resource: area-get.json + // URL: https://musicbrainz.org/ws/2/area/c9ac1239-e832-41bc-9930-e252a1fd1105?inc=area-rels&fmt=json + + public class AreaGetTests + { + private Area area; + + [OneTimeSetUp] + public async Task Init() + { + var client = new MusicBrainzClient() + { + Cache = EmbeddedResourceCache.Instance + }; + + string[] inc = ["area-rels"]; + + area = await client.Area.GetAsync("c9ac1239-e832-41bc-9930-e252a1fd1105", inc); + } + + [Test] + public void TestAreaElements() + { + Assert.That(area.Id, Is.EqualTo("c9ac1239-e832-41bc-9930-e252a1fd1105")); + Assert.That(area.Type, Is.EqualTo("City")); + Assert.That(area.Name, Is.EqualTo("Berlin")); + Assert.That(area.Relations, Is.Not.Null); + Assert.That(area.Iso2Codes, Is.Not.Null); + } + + [Test] + public void TestAreaForwardRelations() + { + var list = area.Relations.Where(r => r.TargetType == "area" && r.Direction == "forward"); + + Assert.That(list.Count(), Is.GreaterThanOrEqualTo(6)); + } + + [Test] + public void TestAreaBackwardRelations() + { + var list = area.Relations.Where(r => r.TargetType == "area" && r.Direction == "backward"); + + Assert.That(list.Count(), Is.EqualTo(1)); + + var relation = list.First(); + + Assert.That(relation.Area, Is.Not.Null); + Assert.That(relation.Area.Type, Is.EqualTo("Country")); + Assert.That(relation.Area.Name, Is.EqualTo("Germany")); + + } + } +}