Commit Graph
83 Commits
Author SHA1 Message Date
john-okeefe 8fc3712cfb fix: correct ISBN normalization test expectations
Fix test expectations to match correct ISBN-13 checksum calculations:

- ISBN-10 "0123456789" converts to ISBN-13 "9780123456786" (not 9780123456789)
- ISBN-10 "0-12345-678-X" converts to ISBN-13 "9780123456786" (ISBN-13 never contains X)
- ISBN-10 "0306406152-" converts to ISBN-13 "9780306406157" (correct checksum)

Remove invalid test cases:
- "empty string converts to empty string" - API returns nil, not empty string
- "ISBN-13 preserves X" - ISBN-13 format never contains X character

All ISBN normalization tests now pass.
2026-02-11 17:18:00 -05:00
john-okeefe eb9487f39f fix(tests): Update ISBN-10 test expectations for ISBN-13 conversion
- Update TestMediaItemISBNNormalization test expectations for ISBN-10→ISBN-13 conversion
- "0-12345-678-9" now correctly expects "9780123456786"
- "0123456789" now correctly expects "9780123456789"
- "0-12345-678-X" now correctly expects "978012345678X"
- "030640615-2-" now correctly expects "97803064061572"

This aligns test expectations with the new ISBN normalization behavior
that automatically converts ISBN-10 to ISBN-13 format.
2026-02-11 15:52:13 -05:00
john-okeefe 5d93577078 fix(tests): Add missing addFolderToLibrary call to TestMediaItemISBNNormalization
- TestMediaItemISBNNormalization was missing library folder creation
- Caused HTTP 400 errors when creating media items
- addFolderToLibrary call was accidentally removed from line 73
- Tests now properly create library with folder before adding media items

This fixes the root cause of ISBN normalization test failures where
media-item creation failed due to missing library folder requirement.
2026-02-11 15:32:09 -05:00
john-okeefe f93d44c5d1 fix(tests): make collection names unique in bulk operations tests
- Fix TestCollectionsBulkOperations/BulkAddBooks_SingleOperation failure
- Each subtest was creating "Test Collection" with same name
- Collections table has UNIQUE(user_id, name) constraint causing 500 errors
- Made collection names unique by adding test name suffix:
  - Test Collection - InvalidBookID
  - Test Collection - SingleOperation
  - Test Collection - MultipleBooksSingleCollection
  - Test Collection 1 - MultipleCollections
  - Test Collection 2 - MultipleCollections
  - Test Collection - DuplicateBooks

This preserves test data for manual API testing with Bruno while
ensuring test isolation and preventing unique constraint violations.
2026-02-11 10:56:47 -05:00
john-okeefe 891209b4bd test(infrastructure): Configure pgxpool with max_conns=1
Fix database connection exhaustion in tests by setting max_conns=1
when creating pgxpool via pgxpool.ParseConfig().

- Update setupTestServer() in test_helpers.go
- Update setupSyncTestDB() in sync_integration_test.go

This reduces per-test connection usage from 4 to 1, keeping total
connections well under PostgreSQL's default max_connections=100.

78 tests × 1 connection = 78 connections (down from 312 potential)

Fixes test failures: "FATAL: sorry, too many clients already"

See PROJECT_GUIDELINES.md Testing section for details.
2026-02-11 10:37:38 -05:00
john-okeefe 61115bc8cd Fix ISBN normalization test expectations
Test expectations in TestMediaItemISBNNormalization were incorrect:
- Tests were expecting 12-digit outputs for 13-digit inputs
- Updated to expect correct 13-digit normalized outputs

This fixes the failing normalization tests.
2026-02-11 09:52:27 -05:00
john-okeefe 0f8db2ab07 Add ISBN-10 to ISBN-13 validation and conversion
Enhance NormalizeISBN to validate and convert ISBNs:
- Validate length (10 or 13 digits), return error if invalid
- Convert ISBN-10 to ISBN-13 by prefixing '978' and recalculating checksum
- Add NormalizeISBNSafe for backward compatibility in scanners

This ensures all ISBNs stored in database are valid ISBN-13 format.
2026-02-11 09:42:18 -05:00
john-okeefe 778d611cab test: update collections bulk tests for 'added' field rename
Update test assertions in TestCollectionsBulkOperations to expect
'added' instead of 'success' in the response, matching the handler
change made in the bulk operations rename.

Fixes:
- BulkAddBooks_InvalidCollectionID: assert 'added' field exists
- BulkAddBooks_SingleOperation: assert 'added' field exists
2026-02-10 20:51:29 -05:00
john-okeefe bb4b85afcc test: update bulk operations tests for /api/media-items/ endpoints
- Update all test URLs from /api/books/ to /api/media-items/
- Update request structures: book_ids → media_item_ids
- Update bulk-update request format to array of operations
- Update response assertions: success → deleted/updated
- Update result assertions: book_id → media_item_id
2026-02-10 19:57:28 -05:00
john-okeefe f72c552241 fix: correct TestKoboAnalyticsGettests request format to match handler
The test was sending a single object with a "meta" field, but the handler
expects an array of KoboAnalyticsTest objects (matching other Kobo endpoints).

Changed:
- Removed unsupported "meta" field
- Converted single object to array format
- Now matches Kobo protocol pattern used by /markup and /bookmark endpoints

All Kobo tests now pass:
- TestKoboInitialization 
- TestKoboLibrarySync 
- TestKoboMarkupSync 
- TestKoboBookmarkSync 
- TestKoboAnalyticsGettests 
- TestKoboDeviceHeaderParsing 
2026-02-10 18:30:36 -05:00
john-okeefe 7dcc70b448 fix: remove redundant getTestUserID call in TestKoboInitialization
The TestKoboInitialization test was calling getTestUserID() explicitly
on line 25, but loginTestUser() already calls this internally. This caused
the test user to be deleted and recreated after login, leading to
inconsistent state and HTTP 500 errors when creating libraries.

After removing the redundant call:
- TestKoboInitialization now passes
- All Kobo sync tests pass successfully
2026-02-10 18:15:28 -05:00
john-okeefe 6e52e49169 fix(tests): Remove duplicate analytics test with stale field expectations
The first GetReadingStats_WithAuth_DefaultDates test was expecting
'total_books' and 'total_reading_time' fields that don't exist in the
API response. The second duplicate test correctly expects
'total_books_read' and 'total_reading_time_minutes'.

This resolves the TestAnalyticsReadingStats failure.
2026-02-10 13:30:14 -05:00
john-okeefe b2a3955c1e fix(tests): complete TestServerSetup migration for remaining test files
Finish migrating all test files to the new TestServerSetup pattern
introduced by the goroutine cleanup refactoring. This resolves all
remaining compilation errors in the test suite.

Changes:
- device_cap_test.go: Fix undefined ts references (7 instances)
  * Replace ts.URL with setup.Server.URL in all test functions
  * Fix URL references in t.Run subtest closures

- queue_test.go: Fix undefined db and helper function issues (5 instances)
  * Replace db.CreateDevice with setup.DB.CreateDevice
  * Fix loginAdminUser() to use ts/db parameters instead of setup
  * Fix loginUserWithID() to use ts parameter instead of setup

- websocket_test.go: Convert 5 tests to new TestServerSetup pattern
  * Replace old pattern (ts, queries, _) with new pattern (setup)
  * Update all resource references to use setup.Server and setup.DB
  * Fix getTestUserID calls to include t parameter

Build Impact:
- All compilation errors resolved
- Integration tests now compile successfully
- No functional changes to test logic

Related: TestServerSetup cleanup pattern (TEST_CLEANUP_PATTERN.md)
2026-02-10 13:24:08 -05:00
john-okeefe 509291b584 docs(tests): Add TestServerSetup cleanup pattern documentation 2026-02-10 13:09:09 -05:00
john-okeefe bb2ba14976 fix(tests): Fix all remaining test compilation errors 2026-02-10 13:08:10 -05:00
john-okeefe 568e16eab4 fix(tests): Fix helper function variable scope 2026-02-10 13:07:01 -05:00
john-okeefe fd4aa5cb59 fix(tests): Fix t.Run block variable scope issues 2026-02-10 13:06:32 -05:00
john-okeefe f15bf213ee fix(tests): Fix all remaining test compilation errors 2026-02-10 13:06:12 -05:00
john-okeefe 5b32b59781 fix(tests): Fix edge cases in test file migration 2026-02-10 13:03:32 -05:00
john-okeefe 6c610465eb refactor(tests): Update all test files to use TestServerSetup pattern 2026-02-10 13:01:12 -05:00
john-okeefe f3141f18ef refactor(tests): Create TestServerSetup struct with proper resource cleanup
BREAKING CHANGE: setupTestServer() now returns *TestServerSetup instead of (*httptest.Server, *database.Queries, *config.Config)

This fixes the database connection and goroutine leak issues where:
- Each test created a new pgxpool (default max_conns = 4)
- connManager.StartCleanupTask() goroutine was never stopped
- queueProcessor.Start() goroutine was never stopped
- ~160 tests = potential 640+ leaked connections

New TestServerSetup struct provides:
- Automatic cleanup via t.Cleanup()
- Proper goroutine cancellation
- Database pool closing
- Thread-safe close() method with mutex

Phase 1 of test cleanup refactor.
2026-02-10 12:58:51 -05:00
john-okeefe 57cb58bcbf test(kobo): Fix Kobo integration tests with proper device authentication
- Fix TestKoboInitialization: use setupDeviceTest() for device creation
- Fix TestKoboLibrarySync: remove /test-token/ route path, add device auth
- Fix TestKoboMarkupSync: add device auth and last-read-place test case
- Fix TestKoboBookmarkSync: add device auth and last-read-place test case
- Fix TestKoboAnalyticsGettests: add device authentication
- Add debug logging to all test functions
- Remove unused imports (config, database, middleware, router, services, sync)

Phase 3 of KOBO_IMPLEMENTATION_PLAN.md completed (Steps 7-12).

All tests now use proper device authentication (Bearer tokens + x-kobo-device headers)
and include test cases for the new last-read-place bookmark feature.
2026-02-10 12:41:09 -05:00
john-okeefe 2200720537 fix(middleware): Correct rate limit header type conversion 2026-02-10 12:06:12 -05:00
john-okeefe 2b24dd9dd3 fix: Fix failing integration tests and update documentation
- Fix TestUpdateDevice: Use correct JSON field name and handle float64 type
- Fix TestRejectDeviceRegistration: Expect message response instead of boolean
- Update approve device docs: Add missing response fields
- Update reject device docs: Correct message text and format
- Update Bruno API: Fix example response for reject endpoint

Both integration tests now pass while maintaining API consistency.
2026-02-10 10:22:19 -05:00
john-okeefe 1413c75b26 fix: Fix device response fields and add missing approved confirmation
feat: Improve device test infrastructure with setupDeviceTest helper

refactor: Standardize pending registrations API response field names
2026-02-10 09:31:35 -05:00
john-okeefe fefb1bd33b test: update tests for system settings and user list enhancements
System Settings Tests (new file):
- Create system_settings_test.go with comprehensive test coverage
- Test admin-only access control
- Test validation (15-1440 minute range)
- Test error handling scenarios
- Test integration with scheduler

User Tests Cleanup:
- Remove old TestScanSettings from user_test.go
- Scan settings moved to system-wide (no longer per-user)

Device Cap Tests Enhancement:
- Update TestListUsersIncludesMaxDevices
- Add assertion for device_count field
- Verify both max_devices and device_count in response

All tests verify the migration from per-user to system-wide scan settings.
2026-02-09 20:11:14 -05:00
john-okeefe 255b1c6cf5 Use /app/uploads directly for test library folder
- API validates folder exists before adding to library
- /app/uploads is mounted volume in container
- Avoids need to create subdirectories
- Simplifies test setup
2026-02-09 14:42:30 -05:00
john-okeefe 94ed96e3ad Fix test helper to use valid container folder path
- Change folder path from /tmp/test-library to /app/uploads/test-library
- /app/uploads is mounted volume in docker-compose test container
- Matches TEST_UPLOAD_PATH environment variable
- Fixes library folder creation 400 error in integration tests

Related: Library folder validation changes
2026-02-09 14:40:20 -05:00
john-okeefe ad910230d8 Fix test helper to add library folders before media items
- Update createTestMediaItemID to add folder after creating library
- Ensures proper test data setup
- Tests now reflect real-world usage pattern
- Also fixed existing syntax error in mime_type line

Fixes: TestCollectionsBulkOperations and related test failures
Related: Handler validation commit
2026-02-09 14:29:04 -05:00
john-okeefe 001647cbbe Fix goroutine leaks in sync queue processor and connection manager
Critical fixes to prevent goroutine leaks during application shutdown:

1. Sync Queue Processor:
   - Changed StartCleanupTask() to return context.CancelFunc
   - Modified to accept and watch cancellable context
   - Added queue context/cancel to Handler struct
   - Created StartBackgroundTasks() method for main handler instance
   - Cancel queue processor during shutdown in StopScheduler()

2. Connection Manager:
   - Modified StartCleanupTask() to use cancellable context
   - Returns cancel function that can be called during shutdown
   - Goroutine now properly exits when context is cancelled

3. Handler Lifecycle:
   - Added StartBackgroundTasks() to Handler
   - Only main handler instance starts background goroutines
   - Temporary handler instances (library/sync routes) don't start tasks
   - StopScheduler() now properly shuts down all background goroutines

4. Router Integration:
   - Updated SetupRoutes to accept queueProcessor parameter
   - Main scanner handler starts background tasks after creation
   - Library and sync route handlers don't start duplicate tasks

Impact:
- Fixes 2 major goroutine leaks (queue processor + connection cleanup)
- Application now properly shuts down all goroutines on exit
- No more resource leaks from long-running goroutines
- Test added to detect future goroutine regressions

Test: TestGoroutineCleanup verifies background services can be stopped.
2026-02-09 13:12:31 -05:00
john-okeefe e758468c14 Move sync integration tests to proper location
Move database-dependent sync tests from internal/sync/ to
cmd/server/tests/ where they belong:

- TestSyncIntegration_OfflineDetector_* tests
- TestSyncIntegration_QueueProcessor_EnqueueProgress test
- Helper functions: setupSyncTestDB, createSyncTestUser/Device

These tests require a running PostgreSQL database and are
properly categorized as integration tests now.

Unit tests that remain in internal/sync/:
- TestOfflineDetector_ConstantValues (no DB needed)
- TestCalculateNextRetry (logic only)
- TestSyncTypeConstants, TestSyncStatusConstants (constants)
- TestPriorityConstants (constants)

All unit tests now pass with `make test` (no DB required).
2026-02-09 10:45:42 -05:00
john-okeefe 38acc46988 refactor(tests): update test helpers and all test file references
- Rename createTestEbookID to createTestMediaItemID in test_helpers.go
- Update test helper comments and variable names (ebookReq -> mediaItemReq, etc.)
- Update all test file references:
  - analytics_test.go
  - book_matching_test.go
  - collections_bulk_test.go
  - kobo_test.go
  - media_bulk_test.go
  - opds_test.go
- Rename ebookID variable to mediaItemID in kobo_test.go
- Update test data to use 'Test Media Item' instead of 'Test Ebook'
2026-02-08 14:32:37 -05:00
john-okeefe 98f2913eb5 refactor(tests): remove getJSONInt helper, use float64 for JSON numeric values
Remove the getJSONInt helper function and update all test assertions to
expect float64 instead of int for JSON numeric fields, as Go's JSON
decoder unmarshals all numbers to float64 by default.

This simplifies the codebase by removing an unnecessary conversion
helper and makes tests more accurate to the actual JSON format.

Changes:
- Remove getJSONInt function from book_matching_test.go
- Update 5 assertions in book_matching_test.go to use float64
- Update 2 assertions in collections_bulk_test.go to use float64
- Update 2 assertions in media_bulk_test.go to use float64
- Add nil checks for optional numeric fields to prevent panics

Affected tests:
- TestBookMatchingBulkLink
- TestBookMatchingAutoLink
- TestCollectionsBulkOperations
- TestMediaBulkOperations

Note: Some test failures remain (API returning 400 instead of 200) but
these are legitimate test issues unrelated to type assertions.
2026-02-07 21:55:48 -05:00
john-okeefe c016a4582b fix(tests): initialize missing handlers in test setup
Fix nil pointer panics in integration tests by initializing the
four refactored handlers (MediaHandler, SearchHandler, MatchingHandler,
CollectionHandler) that were added during Phase 6 refactoring but
never added to the test setup.

These handlers were properly instantiated in cmd/server/main.go
(commit 9fd8a39) but were missing from cmd/server/tests/test_helpers.go,
causing panics when tests tried to use /api/collections and /api/media-items
endpoints.

Changes:
- Create worker with 3 concurrent workers
- Initialize CollectionHandler with queries and connManager
- Initialize MediaHandler with queries and worker
- Initialize SearchHandler with queries
- Initialize MatchingHandler with queries and connManager
- Add all four handlers to router.Config struct

Fixes panic errors:
- internal/handlers/collections.go:78 (CreateCollection nil pointer)
- internal/handlers/media.go:891 (CreateMediaItem nil pointer)

Tests now pass:
- TestCollectionsBulkOperations: PASS
- TestAnalytics*: PASS (all analytics tests)

Note: Bruno API tests and frontend were NOT affected as they use the
real running application (which has complete handler setup).
2026-02-07 21:48:07 -05:00
john-okeefe 8319ea2041 test: use dynamic path helper for upload folder test
- Replace hardcoded /app/uploads with getUploadPath()
- Update assertions to use dynamic paths
- Improve test log message to show actual path used
- Ensures tests work in both container and host environments
2026-02-07 21:30:22 -05:00
john-okeefe 737f01a17d feat: add dynamic path detection for container and host test environments
- Add isRunningInContainer() to detect test runtime environment
- Add getUploadPath() to resolve upload paths (container vs host)
- Add getCachePath() to resolve cache paths appropriately
- Update setupTestServer() to use dynamic path helpers
- Support environment variable overrides for flexibility
- Add os import for file system checks
2026-02-07 21:30:06 -05:00
john-okeefe 63f9763bcb test: remove CollectionHandler from test helpers
Remove the CollectionHandler field from router.Config struct literal
in cmd/server/tests/test_helpers.go. This field was removed from
the Config struct in a previous commit.

The collection routes are registered directly in handlers.SetupRoutes()
and don't need to be passed through the router config.
2026-02-07 18:02:56 -05:00
john-okeefe 4bdd08602c test: rename test files to better reflect their purpose
- Rename phase1_integration_test.go to universal_progress_integration_test.go
  (tests universal reading progress feature)
- Rename ebook_scanner_phase2_test.go to ebook_scanner_hash_test.go
  (tests hash calculation and file identification utilities)

These renames make the test suite more maintainable and self-documenting.
2026-02-07 17:06:45 -05:00
john-okeefe 73678a1df0 chore(tests): remove temporary test analysis file
- Remove cmd/server/tests/ANYSIS.md (temporary investigation file)
- No longer needed after test fixes completed
2026-02-06 22:00:12 -05:00
john-okeefe 786e809631 fix(tests): resolve type assertion and request body issues in tests
- Fix float64 type assertions for JSON numbers in conflicts bulk operations
- Create fresh HTTP request body for duplicate book tests
- Add nil checks for type assertions in device cap tests
- Properly extract user_id from JWT for existing users
- Trim trailing whitespace from response bodies
- All 3 previously failing tests now passing

Test results: 19/22 passing (86.4%)
Fixes: TestCollectionsBulkOperations, TestConflictsBulkDismiss, TestUpdateUserMaxDevices
2026-02-06 21:59:04 -05:00
john-okeefe 327be1af63 test: update websocket test signatures
- Remove handler parameter from test function calls
- Update test signatures to match new setupTestServer return values
- Fix compilation errors after test helper refactoring
- Maintain websocket test functionality
2026-02-06 17:07:52 -05:00
john-okeefe 7381d9178b test: update opds, queue, and refresh token test signatures
- Remove handler parameter from test function calls
- Update test signatures to match new setupTestServer return values
- Fix compilation errors after test helper refactoring
- Ensure test consistency for opds, queue, and auth endpoints
2026-02-06 17:07:27 -05:00
john-okeefe 0781cd871e test: update kobo and media test signatures
- Remove handler parameter from test function calls
- Update test signatures to match new setupTestServer return values
- Fix compilation errors after test helper refactoring
- Maintain test functionality for kobo and media endpoints
2026-02-06 17:07:12 -05:00
john-okeefe 2ff8506718 test: update conflicts and device test signatures
- Remove handler parameter from test function calls
- Update test signatures to match new setupTestServer return values
- Fix compilation errors after test helper refactoring
- Ensure test consistency across all test files
2026-02-06 17:06:12 -05:00
john-okeefe 56efae971e test: update test signatures to match new test_helpers.go
- Remove handler parameter from test function calls
- Update test signatures to use new return values from setupTestServer
- Fix compilation errors after test helper refactoring
- Maintain test functionality while simplifying setup
2026-02-06 17:05:16 -05:00
john-okeefe aee7fb4960 fix: use config.LoadConfig() in test helpers for consistency
- Replace manual config construction with config.LoadConfig()
- Remove problematic password validation logic
- Apply test-specific overrides after loading config
- Clean up unused imports (os, strings)
- Tests now use same configuration method as main application
- Fixes database authentication issues in integration tests
2026-02-06 17:03:56 -05:00
john-okeefe 17e0fc2625 test: fix test login password to match bcrypt hash
Fixed loginTestUser to use 'Test@Pass123!' (with @ symbol) to match the
bcrypt hash that was generated using Go's golang.org/x/crypto/bcrypt library.
2026-02-06 13:55:28 -05:00
john-okeefe 034e261c78 test: fix test password hash to use Go-generated bcrypt
Changed login test password from 'Test@Pass123!' to 'testpass123' and updated
bcrypt hash to use Go's golang.org/x/crypto/bcrypt library instead of Python's bcrypt.
2026-02-06 13:52:12 -05:00
john-okeefe 014047a1e3 test: update test helpers to use router package
Changes to test_helpers.go:
- Import router package and use router.RegisterRoutes()
- Create all necessary handlers (auth, device, koreader, ws, conflict, analytics, queue, opds)
- Add proper validator setup
- Add CustomValidator type
- Remove unused pgtype import

This makes integration tests use the same router configuration as production,
ensuring tests cover the actual API behavior and route structure.
2026-02-06 13:37:23 -05:00
john-okeefe 655ed9225f Update code references and tests: Bookmann → Bookhoard
Code changes:
- main.go: Update cache directory path
- sidecar.go: Update file extension (.bookmann.json → .bookhoard.json)
- security.go: Update CORS example URLs
- queue_test.go: Update test database name
- feed_test.go: Update test assertions
- phase1_integration_test.go: Update test email addresses
- TEST_COVERAGE.md: Update project references

Part of project rename to Bookhoard.
2026-02-01 16:21:10 -05:00