Files
creator-hub/internal/controlplane/api/comment_aggregation_test.go
T

113 lines
4.4 KiB
Go

package api
import (
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"testing"
"time"
"git.ipao.vip/rogee/creator-hub/internal/creator"
"github.com/gofiber/fiber/v3"
)
func TestCreatorCommentAggregationRoutes(t *testing.T) {
app := fiber.New()
registerCreatorWithServices(app, nil, nil, nil, nil)
for _, query := range []string{"", "source_type=other", "source_type=owned&hours=bad", "source_type=owned&hours=2", "source_type=owned&page=bad", "source_type=owned&page=0", "source_type=owned&page_size=101"} {
response, err := app.Test(httptest.NewRequest(http.MethodGet, "/api/creator/comments/aggregation?"+query, nil))
if err != nil {
t.Fatal(err)
}
response.Body.Close()
if response.StatusCode != http.StatusBadRequest {
t.Fatalf("query=%s status=%d", query, response.StatusCode)
}
}
}
func TestCreatorCommentAggregationRouteIntegration(t *testing.T) {
databaseURL := os.Getenv("CREATORHUB_POSTGRES_TEST_URL")
if databaseURL == "" {
t.Skip("set CREATORHUB_POSTGRES_TEST_URL")
}
store, _, ctx := openCreatorIntegrationStoreForAPITest(t, databaseURL)
now := time.Now().UTC()
competitor, err := store.UpsertCompetitor(ctx, creator.CompetitorInput{Platform: creator.PlatformDouyin, PlatformAccountKey: "aggregation-rival", Nickname: "竞品账号", HomepageURL: "https://www.douyin.com/user/aggregation-rival"})
if err != nil {
t.Fatal(err)
}
work, _, err := store.UpsertWork(ctx, creator.WorkInput{Platform: creator.PlatformDouyin, WorkKey: "aggregation-work", SourceType: creator.SourceCompetitor, SourceID: competitor.ID, Title: "作品"}, now)
if err != nil {
t.Fatal(err)
}
comment, _, err := store.SaveComment(ctx, creator.CommentInput{Platform: creator.PlatformDouyin, WorkID: work.ID, CommentKey: "aggregation-comment", Content: "评论", CommentType: "top_level", PublishedAt: &now})
if err != nil {
t.Fatal(err)
}
app := fiber.New()
registerCreatorWithServices(app, store, nil, nil, nil)
response, err := app.Test(httptest.NewRequest(http.MethodGet, "/api/creator/comments/aggregation?source_type=competitor&source_id="+competitor.ID, nil))
if err != nil {
t.Fatal(err)
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
t.Fatalf("status=%d", response.StatusCode)
}
var page creator.Page[creator.AggregatedComment]
if err := json.NewDecoder(response.Body).Decode(&page); err != nil {
t.Fatal(err)
}
if page.Page != 1 || page.PageSize != 25 || page.Total != 1 || len(page.Data) != 1 || page.Data[0].ID != comment.ID || page.Data[0].SourceName != "竞品账号" {
t.Fatalf("page=%+v", page)
}
if err := store.Close(); err != nil {
t.Fatal(err)
}
response, err = app.Test(httptest.NewRequest(http.MethodGet, "/api/creator/comments/aggregation?source_type=competitor", nil))
if err != nil {
t.Fatal(err)
}
response.Body.Close()
if response.StatusCode != http.StatusInternalServerError {
t.Fatalf("database failure status=%d", response.StatusCode)
}
}
func TestCreatorCommentAggregationFilter(t *testing.T) {
app := fiber.New()
app.Get("/", func(c fiber.Ctx) error {
filter, err := creatorCommentAggregationFilter(c)
if err != nil {
return creatorError(c, err)
}
return c.JSON(filter)
})
for _, query := range []string{"source_type=owned", "source_type=competitor&source_id=account-1&hours=6", "source_type=owned&hours=168"} {
response, err := app.Test(httptest.NewRequest(http.MethodGet, "/?"+query, nil))
if err != nil || response.StatusCode != http.StatusOK {
t.Fatalf("query=%s response=%v err=%v", query, response, err)
}
var filter creator.CommentAggregationFilter
if err := json.NewDecoder(response.Body).Decode(&filter); err != nil {
t.Fatal(err)
}
response.Body.Close()
if query == "source_type=owned" && filter.Hours != 24 {
t.Fatalf("default=%+v", filter)
}
if query == "source_type=competitor&source_id=account-1&hours=6" && (filter.SourceType != creator.SourceCompetitor || filter.SourceID != "account-1" || filter.Hours != 6) {
t.Fatalf("filter=%+v", filter)
}
}
for _, query := range []string{"", "source_type=other", "source_type=owned&hours=bad", "source_type=owned&hours=0", "source_type=owned&hours=-1", "source_type=owned&hours=2", "source_type=owned&hours=169"} {
response, err := app.Test(httptest.NewRequest(http.MethodGet, "/?"+query, nil))
if err != nil || response.StatusCode != http.StatusBadRequest {
t.Fatalf("query=%s response=%v err=%v", query, response, err)
}
response.Body.Close()
}
}