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() } }