- A new request still pending after any auto-approval notifies the admins (request_pending), but not the requester if they are an admin. A request that dedups into one already in flight is not announced again. - Approving or rejecting a request notifies the requester, and a rejection carries the admin's notes as the reason. An admin deciding their own request gets nothing. - The reconciler notifies the requester when their request arrives (request_completed), linking the matched album or artist. - A request the re-acquisition sweeper files and cannot approve itself notifies the admins. - A quarantine flag notifies every admin except the flagger, naming the track, the flagger and the reason. lidarrrequests.Service.CreateTracked reports whether a request was inserted or deduped; Create wraps it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
1.8 KiB
Go
53 lines
1.8 KiB
Go
package lidarrrequests
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"testing"
|
||
|
||
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
|
||
"git.fabledsword.com/bvandeusen/minstrel/internal/lidarrconfig"
|
||
"git.fabledsword.com/bvandeusen/minstrel/internal/notifications"
|
||
)
|
||
|
||
// M489: an album request that arrives lands in the requester's inbox once,
|
||
// linked to the album it matched.
|
||
func TestReconciler_CompletionNotifiesRequester(t *testing.T) {
|
||
pool := newPool(t)
|
||
q := dbq.New(pool)
|
||
ctx := context.Background()
|
||
|
||
enableLidarrForPool(t, pool)
|
||
user := seedUser(t, pool)
|
||
artist := seedArtist(t, q, "Notify Artist", "notify-artist-mbid")
|
||
album := seedAlbum(t, q, artist.ID, "Notify Album", "notify-album-mbid")
|
||
_ = seedTrack(t, q, album.ID, artist.ID, "Notify Track", "/music/notify/01.flac")
|
||
seedApprovedRequestDirect(t, q, user, CreateParams{
|
||
Kind: "album", LidarrArtistMBID: "notify-artist-mbid", LidarrAlbumMBID: "notify-album-mbid",
|
||
ArtistName: "Notify Artist", AlbumTitle: "Notify Album",
|
||
})
|
||
|
||
rec := NewReconciler(pool, lidarrconfig.New(pool), nil, newTestLogger(), nil)
|
||
rec.SetNotifier(notifications.New(pool, nil, nil))
|
||
for i := 0; i < 2; i++ { // the second tick finds nothing left to complete
|
||
if err := rec.tickOnce(ctx); err != nil {
|
||
t.Fatalf("tickOnce: %v", err)
|
||
}
|
||
}
|
||
|
||
rows, err := q.ListNotifications(ctx, dbq.ListNotificationsParams{UserID: user, PageLimit: 10})
|
||
if err != nil {
|
||
t.Fatalf("list notifications: %v", err)
|
||
}
|
||
if len(rows) != 1 || rows[0].Kind != string(notifications.KindRequestCompleted) {
|
||
t.Fatalf("inbox = %+v, want one request_completed", rows)
|
||
}
|
||
var p notifications.Payload
|
||
if err := json.Unmarshal(rows[0].Payload, &p); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
if p.Name != "Notify Artist – Notify Album" || p.AlbumID != formatUUIDForBus(album.ID) || p.ArtistID != "" {
|
||
t.Errorf("payload = %+v", p)
|
||
}
|
||
}
|