package notifications import ( "encoding/json" "testing" "github.com/stretchr/testify/require" ) // render stores p the way Notify does (through Map) and reads it back. func render(k Kind, p Payload) Rendered { b, err := json.Marshal(p.Map()) if err != nil { panic(err) } return Render(k, b) } func TestRender_EveryKindHasATitleAndALink(t *testing.T) { for _, k := range Kinds() { r := Render(k, []byte(`{}`)) require.NotEmpty(t, r.Title, k) require.NotEqual(t, "Notification", r.Title, "%s falls through to the default", k) require.NotEmpty(t, r.Link, k) } } func TestRender_RequestCompletedLinksToWhatArrived(t *testing.T) { require.Equal(t, "/albums/al-1", render(KindRequestCompleted, Payload{Name: "WWW", AlbumID: "al-1", ArtistID: "ar-1"}).Link) require.Equal(t, "/artists/ar-1", render(KindRequestCompleted, Payload{Name: "Moe Shop", ArtistID: "ar-1"}).Link) require.Equal(t, "/requests", render(KindRequestCompleted, Payload{Name: "WWW"}).Link) require.Equal(t, "WWW has arrived.", render(KindRequestCompleted, Payload{Name: "WWW"}).Body) } func TestRender_RejectionCarriesTheReasonWhenThereIsOne(t *testing.T) { require.Equal(t, "WWW was declined.", render(KindRequestRejected, Payload{Name: "WWW"}).Body) require.Equal(t, "WWW was declined: already owned", render(KindRequestRejected, Payload{Name: "WWW", Reason: "already owned"}).Body) } func TestRender_CoalescedCountsReadNaturally(t *testing.T) { require.Equal(t, "1 track went missing", render(KindTracksMissing, Payload{Count: 1}).Title) require.Equal(t, "14 tracks went missing", render(KindTracksMissing, Payload{Count: 14}).Title) require.Equal(t, "Library scan failed", render(KindScanFailed, Payload{Count: 1, Detail: "x"}).Title) require.Equal(t, "Library scan failed 3 times", render(KindScanFailed, Payload{Count: 3}).Title) require.Equal(t, "Some tracks went missing", Render(KindTracksMissing, []byte(`{}`)).Title) } func TestRender_AnUnreadablePayloadStillRenders(t *testing.T) { r := Render(KindRequestApproved, []byte(`not json`)) require.Equal(t, "Request approved", r.Title) require.Equal(t, "Your request is on its way.", r.Body) } func TestPayloadMap_DropsEmptyFields(t *testing.T) { require.Equal(t, map[string]any{"name": "WWW", "count": float64(2)}, Payload{Name: "WWW", Count: 2}.Map()) }