package memory import ( "context" "errors" "testing" "telesrv/internal/domain" ) // TestChannelStoreResolveWebPage 验证频道 WebPageResolve 模式:只换 media、不碰 body/edit_date, // 事件为 channel_web_page,幂等。 func TestChannelStoreResolveWebPage(t *testing.T) { st := NewChannelStore() ctx := context.Background() const creator = int64(1000000301) const url = "https://example.com/c" urlHash := domain.WebPageURLHash(url) created, err := st.CreateChannel(ctx, domain.CreateChannelRequest{ CreatorUserID: creator, Title: "WP", Megagroup: true, Date: 1700000000, }) if err != nil { t.Fatalf("create channel: %v", err) } channelID := created.Channel.ID sent, err := st.SendChannelMessage(ctx, domain.SendChannelMessageRequest{ UserID: creator, ChannelID: channelID, Message: "see " + url, Date: 1700000000, Media: &domain.MessageMedia{Kind: domain.MessageMediaKindWebPage, WebPage: &domain.MessageWebPage{State: domain.MessageWebPageStatePending, ID: urlHash, URL: url}}, }) if err != nil { t.Fatalf("send channel message: %v", err) } done := &domain.MessageMedia{Kind: domain.MessageMediaKindWebPage, WebPage: &domain.MessageWebPage{State: domain.MessageWebPageStateDone, ID: urlHash, URL: url, Title: "Example"}} resolveReq := domain.EditChannelMessageRequest{ UserID: creator, ChannelID: channelID, ID: sent.Message.ID, Media: done, WebPageResolve: true, ExpectedWebPageID: urlHash, } res, err := st.EditChannelMessage(ctx, resolveReq) if err != nil { t.Fatalf("EditChannelMessage(WebPageResolve): %v", err) } if res.Event.Type != domain.ChannelUpdateWebPage { t.Fatalf("event type = %q, want channel_web_page", res.Event.Type) } if res.Message.Media == nil || res.Message.Media.WebPage == nil || res.Message.Media.WebPage.State != domain.MessageWebPageStateDone { t.Fatalf("message media not resolved: %+v", res.Message.Media) } if res.Message.Body != "see "+url || res.Message.EditDate != 0 { t.Fatalf("body/edit_date changed: body=%q edit_date=%d", res.Message.Body, res.Message.EditDate) } if _, err := st.EditChannelMessage(ctx, resolveReq); !errors.Is(err, domain.ErrMessageNotModified) { t.Fatalf("re-resolve err = %v, want ErrMessageNotModified", err) } // 错误的 expectedID → 不替换。 _, err = st.EditChannelMessage(ctx, domain.EditChannelMessageRequest{ UserID: creator, ChannelID: channelID, ID: sent.Message.ID, Media: &domain.MessageMedia{Kind: domain.MessageMediaKindWebPage, WebPage: &domain.MessageWebPage{State: domain.MessageWebPageStateDone, ID: 999, URL: url}}, WebPageResolve: true, ExpectedWebPageID: 999, }) if !errors.Is(err, domain.ErrMessageNotModified) { t.Fatalf("wrong-id resolve err = %v, want ErrMessageNotModified (already resolved, not pending)", err) } }