feat: collect JSON and XML feeds

This commit is contained in:
2026-07-23 20:47:54 +08:00
parent 4b38a42607
commit 5da343cc71
8 changed files with 627 additions and 42 deletions

View File

@@ -2,6 +2,7 @@ package dataset
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
@@ -63,17 +64,21 @@ func TestDatasetAPIConnectsSourcesItemsAndSyncTasks(t *testing.T) {
require.True(t, item.Starred)
firstSync := performDatasetRequest(t, ownerRouter, http.MethodPost, "/api/v1/dataset-crons/sync", map[string]any{})
require.Equal(t, http.StatusAccepted, firstSync.Code)
require.Equal(t, http.StatusOK, firstSync.Code)
var firstCrons []CronDTO
require.NoError(t, json.Unmarshal(firstSync.Body.Bytes(), &firstCrons))
require.Len(t, firstCrons, 1)
require.Equal(t, "pending", firstCrons[0].Status)
require.Equal(t, "completed", firstCrons[0].Status)
require.Contains(t, firstCrons[0].LastResult, "format=rss")
secondSync := performDatasetRequest(t, ownerRouter, http.MethodPost, "/api/v1/dataset-crons/sync", map[string]any{})
require.Equal(t, http.StatusAccepted, secondSync.Code)
require.Equal(t, http.StatusOK, secondSync.Code)
var secondCrons []CronDTO
require.NoError(t, json.Unmarshal(secondSync.Body.Bytes(), &secondCrons))
require.Equal(t, firstCrons[0].ID, secondCrons[0].ID)
require.NotEqual(t, firstCrons[0].ID, secondCrons[0].ID)
var collectedItems []models.SaDatasetItem
require.NoError(t, database.Where("source_id = ?", 1).Find(&collectedItems).Error)
require.Len(t, collectedItems, 2)
otherRouter := datasetTestRouter(database, other.ID)
otherSources := performDatasetRequest(t, otherRouter, http.MethodGet, "/api/v1/dataset-sources", nil)
@@ -117,10 +122,25 @@ func datasetTestRouter(database *gorm.DB, userID uint) http.Handler {
return httpx.NewProtectedRouter(
config.Config{Env: "test"},
func(string) (uint, error) { return userID, nil },
NewHandler(NewService(database)),
NewHandler(newServiceWithFetcher(database, staticFeedFetcher{})),
)
}
type staticFeedFetcher struct{}
func (staticFeedFetcher) Fetch(context.Context, string) (ParsedFeed, error) {
return ParsedFeed{
Format: "rss",
Items: []FeedItem{{
ExternalID: "stable-feed-item",
Title: "Collected item",
Summary: "Collected summary",
Content: "Collected content",
URL: "https://example.com/collected",
}},
}, nil
}
func performDatasetRequest(t *testing.T, router http.Handler, method, path string, body any) *httptest.ResponseRecorder {
t.Helper()
var encoded []byte