package api import ( "context" "errors" "testing" creator "git.ipao.vip/rogee/creator-hub/internal/creator" ) type eventCoverFilesStub struct { files map[string]bool readErr, saveErr error } func (s *eventCoverFilesStub) GetPlatformWorkCover(uid, key string) (string, error) { if s.readErr != nil { return "", s.readErr } if s.files[uid+"/"+key] { return "cached", nil } return "", creator.ErrNotFound } func (s *eventCoverFilesStub) SavePlatformWorkCover(uid, key, mime string, data []byte) error { if s.saveErr != nil { return s.saveErr } s.files[uid+"/"+key] = true return nil } func coverNotice() creator.ListenerDelivery { return creator.ListenerDelivery{Kind: "notice", Notice: &creator.ListenerNotice{EventKey: "1", WorkID: "2", WorkAuthorUID: "3", WorkCoverURL: "https://p3.douyinpic.com/a.jpg", MessageText: "原内容", WorkCoverError: "old failure"}} } func TestListenerWorkCoversReuseSharedFilesAndExposeFailures(t *testing.T) { files := &eventCoverFilesStub{files: map[string]bool{}} calls := 0 fetch := func(context.Context, string) (string, []byte, error) { calls++ return "image/jpeg", []byte("image"), nil } items := []creator.ListenerDelivery{coverNotice(), coverNotice(), {Kind: "checkpoint"}} cacheListenerWorkCovers(context.Background(), files, fetch, items) if calls != 1 || items[0].Notice.WorkCoverError != "" || items[1].Notice.WorkCoverError != "" { t.Fatalf("duplicate fetch/old errors: %d %+v", calls, items) } for _, failure := range []string{"read", "download", "save"} { files := &eventCoverFilesStub{files: map[string]bool{}} failed := errors.New(failure + " failed") called := false fetch := func(context.Context, string) (string, []byte, error) { called = true if failure == "download" { return "", nil, failed } return "image/jpeg", []byte("image"), nil } if failure == "read" { files.readErr = failed } if failure == "save" { files.saveErr = failed } items := []creator.ListenerDelivery{coverNotice()} cacheListenerWorkCovers(context.Background(), files, fetch, items) if items[0].Notice.WorkCoverError != failed.Error() || items[0].Notice.MessageText != "原内容" { t.Fatalf("failure hidden: %+v", items) } if failure == "read" && called { t.Fatal("filesystem failure concealed by download") } } }