fix: complete exploration data flow
This commit is contained in:
@@ -3,9 +3,11 @@ package dataset
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"senlinai-agent/backend/internal/models"
|
||||
@@ -164,8 +166,68 @@ func TestSyncAllSourcesCollectsEnabledRSSSourcesForEveryUser(t *testing.T) {
|
||||
require.Equal(t, int64(2), itemCount)
|
||||
}
|
||||
|
||||
func TestSyncSourcesCollectsMultipleSourcesForOneOwner(t *testing.T) {
|
||||
database := newDatasetTestDatabase(t)
|
||||
user := createDatasetTestUser(t, database, "multi-feed-owner@example.com")
|
||||
for index := 0; index < 5; index++ {
|
||||
require.NoError(t, database.Create(&models.SaDatasetSource{
|
||||
CreatedBy: user.ID, Name: fmt.Sprintf("Feed %d", index), Kind: "rss",
|
||||
URL: fmt.Sprintf("https://example.com/feed-%d", index), Enabled: true,
|
||||
}).Error)
|
||||
}
|
||||
|
||||
runs, err := newServiceWithFetcher(database, staticFeedFetcher{}).SyncSources(context.Background(), user.ID)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Len(t, runs, 5)
|
||||
for _, run := range runs {
|
||||
require.Equal(t, "completed", run.Status)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueueSourcesRunsInBackgroundAndRejectsOverlap(t *testing.T) {
|
||||
database := newDatasetTestDatabase(t)
|
||||
user := createDatasetTestUser(t, database, "queued-feed-owner@example.com")
|
||||
source := models.SaDatasetSource{
|
||||
CreatedBy: user.ID, Name: "Queued RSS", Kind: "rss",
|
||||
URL: "https://example.com/feed", Enabled: true,
|
||||
}
|
||||
require.NoError(t, database.Create(&source).Error)
|
||||
fetcher := &blockingFeedFetcher{
|
||||
started: make(chan struct{}),
|
||||
release: make(chan struct{}),
|
||||
}
|
||||
service := newServiceWithFetcher(database, fetcher)
|
||||
|
||||
queued, err := service.QueueSources(user.ID)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Len(t, queued, 1)
|
||||
require.Equal(t, "pending", queued[0].Status)
|
||||
<-fetcher.started
|
||||
_, err = service.QueueSources(user.ID)
|
||||
require.ErrorIs(t, err, ErrSyncInProgress)
|
||||
require.ErrorIs(t, service.DeleteSource(user.ID, source.Identity), ErrSyncInProgress)
|
||||
close(fetcher.release)
|
||||
require.Eventually(t, func() bool {
|
||||
runs, listErr := service.ListCrons(user.ID)
|
||||
return listErr == nil && len(runs) == 1 && runs[0].Status == "completed"
|
||||
}, time.Second, 10*time.Millisecond)
|
||||
}
|
||||
|
||||
type failingFeedFetcher struct{}
|
||||
|
||||
func (failingFeedFetcher) Fetch(context.Context, string) (ParsedFeed, error) {
|
||||
return ParsedFeed{}, errors.New("feed unavailable")
|
||||
}
|
||||
|
||||
type blockingFeedFetcher struct {
|
||||
started chan struct{}
|
||||
release chan struct{}
|
||||
}
|
||||
|
||||
func (f *blockingFeedFetcher) Fetch(context.Context, string) (ParsedFeed, error) {
|
||||
close(f.started)
|
||||
<-f.release
|
||||
return staticFeedFetcher{}.Fetch(context.Background(), "")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user