Files
silo-server/internal/webhooksync/service_test.go
T
Silo Server Migration ef1c6accb6 fix(webhooksync): skip events for unmapped external users
- Require explicit profile mapping instead of falling back to the default profile
- Update settings UI copy to reflect that unmapped users are ignored
2026-05-26 08:34:17 -04:00

135 lines
3.2 KiB
Go

package webhooksync
import (
"testing"
"github.com/Silo-Server/silo-server/internal/historyimport"
)
func TestShouldApplyPlexWebhookEvent(t *testing.T) {
t.Parallel()
cases := map[string]bool{
"media.scrobble": true,
"media.stop": true,
"media.pause": true,
"media.play": false,
"media.resume": false,
"library.new": false,
"": false,
}
for event, want := range cases {
event := event
want := want
t.Run(event, func(t *testing.T) {
t.Parallel()
if got := shouldApplyPlexWebhookEvent(event); got != want {
t.Fatalf("shouldApplyPlexWebhookEvent(%q) = %v, want %v", event, got, want)
}
})
}
}
func TestBuildWebhookURL(t *testing.T) {
t.Parallel()
if got := buildWebhookURL("", "abc123"); got != "/api/v1/webhook-sync/webhooks/abc123" {
t.Fatalf("unexpected relative webhook URL: %q", got)
}
if got := buildWebhookURL("https://example.com/", "abc123"); got != "https://example.com/api/v1/webhook-sync/webhooks/abc123" {
t.Fatalf("unexpected absolute webhook URL: %q", got)
}
}
func TestResolveWebhookProfileRequiresExplicitMapping(t *testing.T) {
t.Parallel()
linkedProfileID := "linked-profile"
cases := []struct {
name string
mapping *ProfileMapping
want string
wantOK bool
}{
{
name: "missing mapping is skipped",
wantOK: false,
},
{
name: "unmapped external user is skipped",
mapping: &ProfileMapping{},
wantOK: false,
},
{
name: "empty profile mapping is skipped",
mapping: &ProfileMapping{SiloProfileID: ptrString("")},
wantOK: false,
},
{
name: "explicit profile mapping is used",
mapping: &ProfileMapping{SiloProfileID: &linkedProfileID},
want: linkedProfileID,
wantOK: true,
},
}
for _, tc := range cases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
got, ok := resolveWebhookProfileID(tc.mapping)
if ok != tc.wantOK || got != tc.want {
t.Fatalf("resolveWebhookProfileID() = (%q, %v), want (%q, %v)", got, ok, tc.want, tc.wantOK)
}
})
}
}
func TestFilterDiscoveredAccounts(t *testing.T) {
t.Parallel()
accounts := []historyimport.ExternalUser{
{ID: "1", Name: "Owner", Home: true},
{ID: "2", Name: "Kid", Restricted: true},
{ID: "5", Name: "", Home: true},
{ID: "3", Name: "Friend"},
{ID: "4", Name: "Mapped Friend"},
}
mappings := []ProfileMapping{
{ExternalUserID: "4"},
}
filtered := filterDiscoveredAccounts(accounts, mappings)
if len(filtered) != 3 {
t.Fatalf("expected 3 filtered accounts, got %d", len(filtered))
}
if filtered[0].ID != "1" || filtered[1].ID != "2" || filtered[2].ID != "4" {
t.Fatalf("unexpected filtered accounts: %#v", filtered)
}
}
func TestFilterDiscoveredAccountsFallsBackWhenFlagsMissing(t *testing.T) {
t.Parallel()
accounts := []historyimport.ExternalUser{
{ID: "10", Name: "Unflagged One"},
{ID: "12", Name: ""},
{ID: "11", Name: "Unflagged Two"},
}
filtered := filterDiscoveredAccounts(accounts, nil)
if len(filtered) != 2 {
t.Fatalf("expected only named accounts when no household flags exist, got %d", len(filtered))
}
if filtered[0].ID != "10" || filtered[1].ID != "11" {
t.Fatalf("unexpected fallback accounts: %#v", filtered)
}
}
func ptrString(value string) *string {
return &value
}