diff --git a/lib/music_library/scrobble_rules/scrobble_rule.ex b/lib/music_library/scrobble_rules/scrobble_rule.ex index ea0ee1c2..565e440d 100644 --- a/lib/music_library/scrobble_rules/scrobble_rule.ex +++ b/lib/music_library/scrobble_rules/scrobble_rule.ex @@ -29,5 +29,6 @@ defmodule MusicLibrary.ScrobbleRules.ScrobbleRule do scrobble_rule |> cast(attrs, [:type, :match_value, :target_musicbrainz_id, :enabled, :description]) |> validate_required([:type, :match_value, :target_musicbrainz_id]) + |> unique_constraint([:type, :match_value], error_key: :match_value) end end diff --git a/priv/repo/migrations/20260202101204_add_scrobble_rules_constraints.exs b/priv/repo/migrations/20260202101204_add_scrobble_rules_constraints.exs new file mode 100644 index 00000000..4ef486ef --- /dev/null +++ b/priv/repo/migrations/20260202101204_add_scrobble_rules_constraints.exs @@ -0,0 +1,8 @@ +defmodule MusicLibrary.Repo.Migrations.AddScrobbleRulesConstraints do + use Ecto.Migration + + def change do + drop index(:scrobble_rules, [:type, :match_value]) + create unique_index(:scrobble_rules, [:type, :match_value], unique: true) + end +end diff --git a/test/music_library/scrobble_rules_test.exs b/test/music_library/scrobble_rules_test.exs index fca40518..75ceca46 100644 --- a/test/music_library/scrobble_rules_test.exs +++ b/test/music_library/scrobble_rules_test.exs @@ -95,6 +95,17 @@ defmodule MusicLibrary.ScrobbleRulesTest do assert scrobble_rule.description == "Fix Pink Floyd album" end + test "create_scrobble_rule/1 doesn't allow duplicates for the same type" do + valid_attrs = Map.put(@valid_album_attrs, :type, :album) + + assert {:ok, %ScrobbleRule{} = scrobble_rule} = + ScrobbleRules.create_scrobble_rule(valid_attrs) + + assert scrobble_rule.type == :album + + assert {:error, _changeset} = ScrobbleRules.create_scrobble_rule(valid_attrs) + end + test "create_scrobble_rule/1 with invalid data returns error changeset" do assert {:error, %Ecto.Changeset{}} = ScrobbleRules.create_scrobble_rule(@invalid_attrs) end