feat: add mbid column to artist_settings
Additive migration 008 adds an mbid column to artist_settings, extend the ArtistSettings struct and persistence functions (SaveArtistSettings, GetArtistSettings, GetAllArtistSettings, UpdateArtistSettings) to carry the MusicBrainz ID, and add round-trip tests covering empty and set MBID values.
This commit is contained in:
@@ -305,3 +305,158 @@ func TestUpdateArtistSettings_EmptyUpdates(t *testing.T) {
|
||||
t.Error("expected error for empty updates, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
// TestMigration008_MbidColumnExists verifies the 008 migration adds the mbid
|
||||
// column and that rows created before resolution have a NULL/empty MBID.
|
||||
func TestMigration008_MbidColumnExists(t *testing.T) {
|
||||
db, err := New(":memory:")
|
||||
if err != nil {
|
||||
t.Fatalf("New() error: %v", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
// Insert a row without supplying mbid (simulates a pre-resolution row).
|
||||
if _, err := db.Conn().Exec(
|
||||
"INSERT INTO artist_settings (id, name) VALUES (?, ?)",
|
||||
"artist-1", "No MBID Yet",
|
||||
); err != nil {
|
||||
t.Fatalf("insert without mbid: %v", err)
|
||||
}
|
||||
|
||||
var mbid sql.NullString
|
||||
if err := db.Conn().QueryRow(
|
||||
"SELECT mbid FROM artist_settings WHERE id = ?", "artist-1",
|
||||
).Scan(&mbid); err != nil {
|
||||
t.Fatalf("query mbid: %v", err)
|
||||
}
|
||||
if mbid.Valid && mbid.String != "" {
|
||||
t.Errorf("expected empty mbid for pre-resolution row, got %q", mbid.String)
|
||||
}
|
||||
}
|
||||
|
||||
// TestArtistSettings_MbidRoundTrip verifies Save/Get round-trips an MBID,
|
||||
// and that an empty MBID is preserved (not overwritten with garbage).
|
||||
func TestArtistSettings_MbidRoundTrip(t *testing.T) {
|
||||
db, err := New(":memory:")
|
||||
if err != nil {
|
||||
t.Fatalf("New() error: %v", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
s := &ArtistSettings{
|
||||
ID: "artist-1",
|
||||
Name: "Test Artist",
|
||||
MBID: "f27e6623-8771-4a2e-8dcb-6c8b1a4f8b9a",
|
||||
Monitored: true,
|
||||
}
|
||||
if err := SaveArtistSettings(db, s); err != nil {
|
||||
t.Fatalf("SaveArtistSettings() error: %v", err)
|
||||
}
|
||||
|
||||
got, err := GetArtistSettings(db, "artist-1")
|
||||
if err != nil {
|
||||
t.Fatalf("GetArtistSettings() error: %v", err)
|
||||
}
|
||||
if got.MBID != s.MBID {
|
||||
t.Errorf("expected MBID %q, got %q", s.MBID, got.MBID)
|
||||
}
|
||||
}
|
||||
|
||||
// TestArtistSettings_MbidEmptyAllowed verifies an artist can be saved and
|
||||
// retrieved with no MBID set (lazy resolution not yet performed).
|
||||
func TestArtistSettings_MbidEmptyAllowed(t *testing.T) {
|
||||
db, err := New(":memory:")
|
||||
if err != nil {
|
||||
t.Fatalf("New() error: %v", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
s := &ArtistSettings{ID: "artist-1", Name: "No MBID", Monitored: true}
|
||||
if err := SaveArtistSettings(db, s); err != nil {
|
||||
t.Fatalf("SaveArtistSettings() error: %v", err)
|
||||
}
|
||||
|
||||
got, err := GetArtistSettings(db, "artist-1")
|
||||
if err != nil {
|
||||
t.Fatalf("GetArtistSettings() error: %v", err)
|
||||
}
|
||||
if got.MBID != "" {
|
||||
t.Errorf("expected empty MBID, got %q", got.MBID)
|
||||
}
|
||||
}
|
||||
|
||||
// TestArtistSettings_MbidUpdatePersists verifies UpdateArtistSettings can set
|
||||
// and clear the MBID column.
|
||||
func TestArtistSettings_MbidUpdatePersists(t *testing.T) {
|
||||
db, err := New(":memory:")
|
||||
if err != nil {
|
||||
t.Fatalf("New() error: %v", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
if err := SaveArtistSettings(db, &ArtistSettings{ID: "artist-1", Name: "Test", Monitored: true}); err != nil {
|
||||
t.Fatalf("SaveArtistSettings() error: %v", err)
|
||||
}
|
||||
|
||||
mbid := "f27e6623-8771-4a2e-8dcb-6c8b1a4f8b9a"
|
||||
if err := UpdateArtistSettings(db, "artist-1", map[string]interface{}{"mbid": mbid}); err != nil {
|
||||
t.Fatalf("UpdateArtistSettings(set mbid) error: %v", err)
|
||||
}
|
||||
got, err := GetArtistSettings(db, "artist-1")
|
||||
if err != nil {
|
||||
t.Fatalf("GetArtistSettings() error: %v", err)
|
||||
}
|
||||
if got.MBID != mbid {
|
||||
t.Errorf("expected MBID %q after set, got %q", mbid, got.MBID)
|
||||
}
|
||||
|
||||
// Clear it again.
|
||||
if err := UpdateArtistSettings(db, "artist-1", map[string]interface{}{"mbid": ""}); err != nil {
|
||||
t.Fatalf("UpdateArtistSettings(clear mbid) error: %v", err)
|
||||
}
|
||||
got, err = GetArtistSettings(db, "artist-1")
|
||||
if err != nil {
|
||||
t.Fatalf("GetArtistSettings() error: %v", err)
|
||||
}
|
||||
if got.MBID != "" {
|
||||
t.Errorf("expected empty MBID after clear, got %q", got.MBID)
|
||||
}
|
||||
}
|
||||
|
||||
// TestArtistSettings_MbidInGetAll verifies GetAllArtistSettings returns the
|
||||
// MBID field for all rows.
|
||||
func TestArtistSettings_MbidInGetAll(t *testing.T) {
|
||||
db, err := New(":memory:")
|
||||
if err != nil {
|
||||
t.Fatalf("New() error: %v", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
artists := []ArtistSettings{
|
||||
{ID: "a1", Name: "Artist One", MBID: "mbid-1", Monitored: true},
|
||||
{ID: "a2", Name: "Artist Two", Monitored: true},
|
||||
}
|
||||
for _, a := range artists {
|
||||
if err := SaveArtistSettings(db, &a); err != nil {
|
||||
t.Fatalf("SaveArtistSettings(%s) error: %v", a.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
results, err := GetAllArtistSettings(db)
|
||||
if err != nil {
|
||||
t.Fatalf("GetAllArtistSettings() error: %v", err)
|
||||
}
|
||||
if len(results) != 2 {
|
||||
t.Fatalf("expected 2 results, got %d", len(results))
|
||||
}
|
||||
byID := make(map[string]ArtistSettings)
|
||||
for _, r := range results {
|
||||
byID[r.ID] = r
|
||||
}
|
||||
if byID["a1"].MBID != "mbid-1" {
|
||||
t.Errorf("artist a1: expected MBID 'mbid-1', got %q", byID["a1"].MBID)
|
||||
}
|
||||
if byID["a2"].MBID != "" {
|
||||
t.Errorf("artist a2: expected empty MBID, got %q", byID["a2"].MBID)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user