From a012f6ecd5aa329236e4b767ecaed5aa252ea1d7 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 6 Jan 2026 10:10:28 -0700 Subject: [PATCH] feat: Fetch the artist members as part of the artist details query --- src/models/lidarr_models.rs | 10 +++++++++ src/models/lidarr_models_tests.rs | 19 +++++++++++++--- .../library/lidarr_library_network_tests.rs | 22 ++++++++++++++----- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/models/lidarr_models.rs b/src/models/lidarr_models.rs index bdb8706..0cc6884 100644 --- a/src/models/lidarr_models.rs +++ b/src/models/lidarr_models.rs @@ -26,6 +26,7 @@ pub struct Artist { pub overview: Option, pub artist_type: Option, pub disambiguation: Option, + pub members: Option>, pub path: String, #[serde(deserialize_with = "super::from_i64")] pub quality_profile_id: i64, @@ -63,6 +64,15 @@ pub struct Ratings { impl Eq for Ratings {} +#[derive(Derivative, Serialize, Deserialize, Debug, Default, Clone, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct Member { + pub name: Option, + pub instrument: Option, +} + +impl Eq for Member {} + #[derive(Derivative, Serialize, Deserialize, Debug, Default, Clone, PartialEq)] #[serde(rename_all = "camelCase")] pub struct ArtistStatistics { diff --git a/src/models/lidarr_models_tests.rs b/src/models/lidarr_models_tests.rs index e8f7ea3..a280538 100644 --- a/src/models/lidarr_models_tests.rs +++ b/src/models/lidarr_models_tests.rs @@ -5,7 +5,7 @@ mod tests { use serde_json::json; use crate::models::lidarr_models::{ - DownloadRecord, DownloadStatus, DownloadsResponse, MetadataProfile, NewItemMonitorType, + DownloadRecord, DownloadStatus, DownloadsResponse, Member, MetadataProfile, NewItemMonitorType, SystemStatus, }; use crate::models::servarr_models::{DiskSpace, QualityProfile, RootFolder, Tag}; @@ -74,7 +74,6 @@ mod tests { fn test_artist_deserialization() { let artist_json = json!({ "id": 1, - "mbId": "test-mb-id", "artistName": "Test Artist", "foreignArtistId": "test-foreign-id", "status": "continuing", @@ -82,6 +81,10 @@ mod tests { "artistType": "Group", "disambiguation": "UK Band", "path": "/music/test-artist", + "members": [ + { "name": "alex", "instrument": "piano" }, + { "name": "madi", "instrument": "vocals" } + ], "qualityProfileId": 1, "metadataProfileId": 1, "monitored": true, @@ -102,6 +105,16 @@ mod tests { "percentOfTracks": 83.33 } }); + let expected_members_vec = vec![ + Member { + name: Some("alex".to_string()), + instrument: Some("piano".to_string()), + }, + Member { + name: Some("madi".to_string()), + instrument: Some("vocals".to_string()), + }, + ]; let artist: Artist = serde_json::from_value(artist_json).unwrap(); @@ -113,6 +126,7 @@ mod tests { assert_some_eq_x!(&artist.artist_type, "Group"); assert_some_eq_x!(&artist.disambiguation, "UK Band"); assert_str_eq!(artist.path, "/music/test-artist"); + assert_some_eq_x!(&artist.members, &expected_members_vec); assert_eq!(artist.quality_profile_id, 1); assert_eq!(artist.metadata_profile_id, 1); assert!(artist.monitored); @@ -198,7 +212,6 @@ mod tests { fn test_artist_with_optional_fields_none() { let artist_json = json!({ "id": 1, - "mbId": "", "artistName": "Test Artist", "foreignArtistId": "", "status": "continuing", diff --git a/src/network/lidarr_network/library/lidarr_library_network_tests.rs b/src/network/lidarr_network/library/lidarr_library_network_tests.rs index 4944a8c..5533dba 100644 --- a/src/network/lidarr_network/library/lidarr_library_network_tests.rs +++ b/src/network/lidarr_network/library/lidarr_library_network_tests.rs @@ -11,7 +11,6 @@ mod tests { async fn test_handle_list_artists_event() { let artists_json = json!([{ "id": 1, - "mbId": "test-mb-id", "artistName": "Test Artist", "foreignArtistId": "test-foreign-id", "status": "continuing", @@ -73,18 +72,30 @@ mod tests { async fn test_handle_get_artist_details_event() { let artist_json = json!({ "id": 1, - "mbId": "test-mb-id", "artistName": "Test Artist", "foreignArtistId": "test-foreign-id", "status": "continuing", + "overview": "some interesting description of the artist", + "artistType": "Person", + "disambiguation": "American pianist", "path": "/music/test-artist", + "members": [{"name": "alex", "instrument": "piano"}], "qualityProfileId": 1, "metadataProfileId": 1, "monitored": true, "monitorNewItems": "all", - "genres": [], - "tags": [], - "added": "2023-01-01T00:00:00Z" + "genres": ["soundtrack"], + "tags": [1], + "added": "2023-01-01T00:00:00Z", + "ratings": { "votes": 15, "value": 8.4 }, + "statistics": { + "albumCount": 1, + "trackFileCount": 15, + "trackCount": 15, + "totalTrackCount": 15, + "sizeOnDisk": 12345, + "percentOfTracks": 99.9 + } }); let response: Artist = serde_json::from_value(artist_json.clone()).unwrap(); let (mock, app, _server) = MockServarrApi::get() @@ -112,7 +123,6 @@ mod tests { async fn test_handle_toggle_artist_monitoring_event() { let artist_json = json!({ "id": 1, - "mbId": "test-mb-id", "artistName": "Test Artist", "foreignArtistId": "test-foreign-id", "status": "continuing",