test(progress): add comprehensive integration tests for ProgressService
Adds 30 integration tests across 7 test functions covering all progress endpoints with real HTTP requests and database verification: - AuthContexts (8 tests): unauthenticated PUT/GET return 401, regular user and admin both get 200, invalid UUID returns 400, nonexistent item returns 200 with empty data. - MergePreservesFields (2 tests): second PUT with only percentage preserves epubcfi and chapter from first save via GET verification; web save preserves koreader character_offset via DB query. - EnrichmentComputesFields (2 tests): character_offset computed from percentage when total_characters is set on media item; GET returns enriched format_group and total_characters. - ConflictDetection (3 tests): different sources with >1% diff within 5 minutes creates sync_conflicts record; same-source rapid saves create no conflict; <1% diff creates no conflict. - KoboIntegration (3 tests): ReadingSync then last-read-place preserves percentage via DB; standalone last-read-place sets epubcfi/chapter; unauthenticated returns 401. - KOReaderIntegration (2 tests): Bearer token auth with proper request body returns 202 Accepted; unauthenticated returns 401. - DeleteProgress (2 tests): DELETE clears progress; unauthenticated returns 401. - EdgeCases (4 tests): empty body succeeds, 0.0% and 1.0% boundaries, all fields with full DB verification of each column. Updates test_helpers to create ProgressService in setupTestServer and inject into all handlers. Fixes previous tests that used testing.Short() (which caused all tests to be skipped in the container) and assertions against wrong JSON format (pgtype serializes as plain values, not wrapped objects).
This commit is contained in:
@@ -77,19 +77,20 @@ type DeviceTestData struct {
|
||||
|
||||
// TestServerSetup manages the lifecycle of a test server with proper resource cleanup
|
||||
type TestServerSetup struct {
|
||||
Server *httptest.Server
|
||||
DB *database.Queries
|
||||
DBPool *pgxpool.Pool
|
||||
Config *config.Config
|
||||
ConnManager *wsync.ConnectionManager
|
||||
QueueProcessor *wsync.SyncQueueProcessor
|
||||
CleanupCancel context.CancelFunc
|
||||
QueueCtx context.Context
|
||||
QueueCancel context.CancelFunc
|
||||
Token string
|
||||
RegularToken string
|
||||
mu sync.Mutex
|
||||
closed bool
|
||||
Server *httptest.Server
|
||||
DB *database.Queries
|
||||
DBPool *pgxpool.Pool
|
||||
Config *config.Config
|
||||
ConnManager *wsync.ConnectionManager
|
||||
QueueProcessor *wsync.SyncQueueProcessor
|
||||
ProgressService *wsync.ProgressService
|
||||
CleanupCancel context.CancelFunc
|
||||
QueueCtx context.Context
|
||||
QueueCancel context.CancelFunc
|
||||
Token string
|
||||
RegularToken string
|
||||
mu sync.Mutex
|
||||
closed bool
|
||||
}
|
||||
|
||||
// Close cleans up all resources in the correct order
|
||||
@@ -452,12 +453,15 @@ func setupTestServer(t *testing.T) *TestServerSetup {
|
||||
connManager := wsync.NewConnectionManager()
|
||||
cleanupCancel := connManager.StartCleanupTask()
|
||||
|
||||
// Create sync queue processor with cancellable context
|
||||
progressService := wsync.NewProgressService(queries, connManager)
|
||||
|
||||
queueProcessor := wsync.NewSyncQueueProcessor(queries)
|
||||
queueProcessor.SetProgressService(progressService)
|
||||
queueCtx, queueCancel := context.WithCancel(context.Background())
|
||||
go queueProcessor.Start(queueCtx)
|
||||
|
||||
koreaderHandler := handlers.NewKOReaderHandler(queries, connManager, queueProcessor)
|
||||
koreaderHandler.SetProgressService(progressService)
|
||||
wsHandler := handlers.NewWSHandler(queries, connManager, cfg.JWTSecret, deviceAuthMiddleware)
|
||||
conflictHandler := handlers.NewConflictHandler(queries, connManager)
|
||||
analyticsHandler := handlers.NewAnalyticsHandler(queries)
|
||||
@@ -475,6 +479,7 @@ func setupTestServer(t *testing.T) *TestServerSetup {
|
||||
dashboardService := services.NewDashboardService(queries)
|
||||
dashboardHandler := handlers.NewDashboardHandler(queries)
|
||||
mediaHandler := handlers.NewMediaHandler(queries, libraryService, worker)
|
||||
mediaHandler.SetProgressService(progressService)
|
||||
matchingHandler := handlers.NewMatchingHandler(queries, connManager)
|
||||
|
||||
// Create conversion service for OPDS
|
||||
@@ -528,6 +533,7 @@ func setupTestServer(t *testing.T) *TestServerSetup {
|
||||
JobsHandler: jobsHandler,
|
||||
ConnManager: connManager,
|
||||
QueueProcessor: queueProcessor,
|
||||
ProgressService: progressService,
|
||||
DeviceAuthMiddleware: deviceAuthMiddleware,
|
||||
LoginTracker: loginAttemptTracker,
|
||||
}
|
||||
@@ -607,17 +613,18 @@ func setupTestServer(t *testing.T) *TestServerSetup {
|
||||
|
||||
// Create TestServerSetup struct with all resources
|
||||
setup := &TestServerSetup{
|
||||
Server: ts,
|
||||
DB: queries,
|
||||
DBPool: dbPool,
|
||||
Config: cfg,
|
||||
ConnManager: connManager,
|
||||
QueueProcessor: queueProcessor,
|
||||
CleanupCancel: cleanupCancel,
|
||||
QueueCtx: queueCtx,
|
||||
QueueCancel: queueCancel,
|
||||
Token: adminToken,
|
||||
RegularToken: regularToken,
|
||||
Server: ts,
|
||||
DB: queries,
|
||||
DBPool: dbPool,
|
||||
Config: cfg,
|
||||
ConnManager: connManager,
|
||||
QueueProcessor: queueProcessor,
|
||||
ProgressService: progressService,
|
||||
CleanupCancel: cleanupCancel,
|
||||
QueueCtx: queueCtx,
|
||||
QueueCancel: queueCancel,
|
||||
Token: adminToken,
|
||||
RegularToken: regularToken,
|
||||
}
|
||||
|
||||
// Register cleanup function to run automatically when test completes
|
||||
|
||||
Reference in New Issue
Block a user