From 54f19cd9a28bafbc3ed483155a6b377f279b68a0 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Fri, 6 Mar 2026 09:51:56 +0000 Subject: [PATCH] Fix ArtistInfo.country/1 crash when area is missing --- lib/music_library/artists/artist_info.ex | 3 +- .../artists/artist_info_test.exs | 60 +++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 test/music_library/artists/artist_info_test.exs diff --git a/lib/music_library/artists/artist_info.ex b/lib/music_library/artists/artist_info.ex index 9a5b6102..67d40f9a 100644 --- a/lib/music_library/artists/artist_info.ex +++ b/lib/music_library/artists/artist_info.ex @@ -37,8 +37,7 @@ defmodule MusicLibrary.Artists.ArtistInfo do @spec country(t()) :: %{name: String.t(), code: String.t()} def country(artist_info) do - %{"area" => area} = - artist_info.musicbrainz_data + area = Map.get(artist_info.musicbrainz_data, "area", %{}) country_code = case area["iso-3166-1-codes"] || area["iso-3166-2-codes"] do diff --git a/test/music_library/artists/artist_info_test.exs b/test/music_library/artists/artist_info_test.exs new file mode 100644 index 00000000..f762dd99 --- /dev/null +++ b/test/music_library/artists/artist_info_test.exs @@ -0,0 +1,60 @@ +defmodule MusicLibrary.Artists.ArtistInfoTest do + use MusicLibrary.DataCase, async: true + + alias MusicLibrary.Artists.ArtistInfo + + describe "country/1" do + test "returns country from area with ISO 3166-1 codes" do + artist_info = %ArtistInfo{ + musicbrainz_data: %{ + "area" => %{ + "name" => "United Kingdom", + "iso-3166-1-codes" => ["GB"] + } + } + } + + assert ArtistInfo.country(artist_info) == %{name: "United Kingdom", code: "GB"} + end + + test "returns country from area with ISO 3166-2 codes" do + artist_info = %ArtistInfo{ + musicbrainz_data: %{ + "area" => %{ + "name" => "England", + "iso-3166-2-codes" => ["GB-ENG"] + } + } + } + + assert ArtistInfo.country(artist_info) == %{name: "England", code: "GB-ENG"} + end + + test "falls back to top-level country when area has no ISO codes" do + artist_info = %ArtistInfo{ + musicbrainz_data: %{ + "country" => "US", + "area" => %{"name" => "United States"} + } + } + + assert ArtistInfo.country(artist_info) == %{name: "United States", code: "US"} + end + + test "returns defaults when area key is missing" do + artist_info = %ArtistInfo{ + musicbrainz_data: %{} + } + + assert ArtistInfo.country(artist_info) == %{name: "World", code: "XW"} + end + + test "falls back to top-level country when area is missing" do + artist_info = %ArtistInfo{ + musicbrainz_data: %{"country" => "JP"} + } + + assert ArtistInfo.country(artist_info) == %{name: "World", code: "JP"} + end + end +end