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")); + + } + } +} 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 } } 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: // // /// 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; }