From 737f01a17dbbc620afc6e411fdbf6fb6567587c6 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sat, 7 Feb 2026 21:30:06 -0500 Subject: [PATCH] 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 --- cmd/server/tests/test_helpers.go | 55 ++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/cmd/server/tests/test_helpers.go b/cmd/server/tests/test_helpers.go index b9154af..9f08707 100644 --- a/cmd/server/tests/test_helpers.go +++ b/cmd/server/tests/test_helpers.go @@ -14,6 +14,7 @@ import ( "encoding/json" "net/http" "net/http/httptest" + "os" "strings" "testing" "time" @@ -49,6 +50,56 @@ func trimSpace(s string) string { return strings.TrimSpace(s) } +// isRunningInContainer detects if tests are running inside a Docker container +func isRunningInContainer() bool { + // Check for container-specific marker file + if _, err := os.Stat("/.dockerenv"); err == nil { + return true + } + + // Check if /app/uploads exists (container path) + if _, err := os.Stat("/app/uploads"); err == nil { + return true + } + + // Check environment variable (explicit override) + if os.Getenv("TEST_IN_CONTAINER") == "true" { + return true + } + + return false +} + +// getUploadPath returns the appropriate upload path based on runtime environment +func getUploadPath() string { + // Check for explicit override first + if path := os.Getenv("TEST_UPLOAD_PATH"); path != "" { + return path + } + + if isRunningInContainer() { + return "/app/uploads" // Container path (right side of volume mount) + } + + return "./uploads" // Host path (left side of volume mount) +} + +// getCachePath returns the appropriate cache path based on runtime environment +func getCachePath() string { + // Check for explicit override first + if path := os.Getenv("TEST_CACHE_PATH"); path != "" { + return path + } + + if isRunningInContainer() { + return "/app/cache/kepub" // Container path (volume mount) + } + + // Note: This is a Docker volume on host, not a folder + // Tests using this should handle the volume appropriately + return "/app/cache/kepub" +} + // setupTestServer creates a test server with a test database // Returns: (*httptest.Server, *database.Queries, *config.Config) func setupTestServer(t *testing.T) (*httptest.Server, *database.Queries, *config.Config) { @@ -59,7 +110,7 @@ func setupTestServer(t *testing.T) (*httptest.Server, *database.Queries, *config cfg.ServerPort = "0" // Use random port for tests cfg.BaseURL = "http://localhost" cfg.JWTSecret = "test-secret-key" - cfg.UploadPath = "./test-uploads" + cfg.UploadPath = getUploadPath() cfg.TestMode = true cfg.RateLimitEnabled = false cfg.RequestsPerMinute = 1000 @@ -94,7 +145,7 @@ func setupTestServer(t *testing.T) (*httptest.Server, *database.Queries, *config queueHandler := handlers.NewQueueHandler(queries, queueProcessor) // Create conversion service for OPDS - conversionService := services.NewConversionService(queries, "/var/bookhoard/cache/kepub") + conversionService := services.NewConversionService(queries, getCachePath()) opdsHandler := handlers.NewOPDSHandler(queries, conversionService) // Create Echo instance