Files
goclaw/internal/http/channel_instance_metadata_test.go
2026-07-10 22:25:45 +07:00

88 lines
2.8 KiB
Go

package http
import (
"context"
"net/http"
"net/http/httptest"
"testing"
"github.com/google/uuid"
"github.com/nextlevelbuilder/goclaw/internal/bus"
"github.com/nextlevelbuilder/goclaw/internal/channels"
"github.com/nextlevelbuilder/goclaw/internal/store"
)
type metadataRefreshChannel struct {
*channels.BaseChannel
called bool
}
func (c *metadataRefreshChannel) Start(context.Context) error { return nil }
func (c *metadataRefreshChannel) Stop(context.Context) error { return nil }
func (c *metadataRefreshChannel) Send(context.Context, bus.OutboundMessage) error {
return nil
}
func (c *metadataRefreshChannel) IsRunning() bool { return true }
func (c *metadataRefreshChannel) IsAllowed(string) bool {
return true
}
func (c *metadataRefreshChannel) RefreshContactCache(context.Context) (channels.MetadataRefreshReport, error) {
c.called = true
return channels.MetadataRefreshReport{OK: true, GroupsRefreshed: 1}, nil
}
func TestRefreshChannelMetadataCallsDiscordRefresher(t *testing.T) {
instID := uuid.New()
channelName := "discord-main"
handler := NewChannelInstancesHandler(
&stubChannelInstanceStore{inst: &store.ChannelInstanceData{
BaseModel: store.BaseModel{ID: instID},
Name: channelName,
ChannelType: channels.TypeDiscord,
}},
nil, nil, nil, nil, nil,
)
manager := channels.NewManager(bus.New())
ch := &metadataRefreshChannel{BaseChannel: channels.NewBaseChannel(channels.TypeDiscord, nil, nil)}
ch.SetName(channelName)
ch.SetType(channels.TypeDiscord)
manager.RegisterChannel(channelName, ch)
handler.SetChannelManager(manager)
req := httptest.NewRequest(http.MethodPost, "/v1/channels/instances/"+instID.String()+"/metadata/refresh", nil)
req = req.WithContext(store.WithRole(req.Context(), store.RoleOwner))
req.SetPathValue("id", instID.String())
rec := httptest.NewRecorder()
handler.handleRefreshChannelMetadata(rec, req)
if rec.Code != http.StatusOK {
t.Fatalf("status = %d, want 200; body=%s", rec.Code, rec.Body.String())
}
if !ch.called {
t.Fatal("RefreshContactCache was not called")
}
}
func TestRefreshChannelMetadataRejectsNonDiscord(t *testing.T) {
instID := uuid.New()
handler := NewChannelInstancesHandler(
&stubChannelInstanceStore{inst: &store.ChannelInstanceData{
BaseModel: store.BaseModel{ID: instID},
Name: "telegram-main",
ChannelType: channels.TypeTelegram,
}},
nil, nil, nil, nil, nil,
)
req := httptest.NewRequest(http.MethodPost, "/v1/channels/instances/"+instID.String()+"/metadata/refresh", nil)
req = req.WithContext(store.WithRole(req.Context(), store.RoleOwner))
req.SetPathValue("id", instID.String())
rec := httptest.NewRecorder()
handler.handleRefreshChannelMetadata(rec, req)
if rec.Code != http.StatusBadRequest {
t.Fatalf("status = %d, want 400; body=%s", rec.Code, rec.Body.String())
}
}