- Add end-to-end tests for complete workflow validation - Include integration tests for API and database interactions - Add unit tests for all major components and utilities - Include performance tests for payload handling - Add CLI API integration tests - Include Podman container integration tests - Add WebSocket and queue execution tests - Include shell script tests for setup validation Provides comprehensive test coverage ensuring platform reliability and functionality across all components and interactions.
209 lines
5.7 KiB
Go
209 lines
5.7 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/jfraeys/fetch_ml/internal/config"
|
|
)
|
|
|
|
func TestExpandPath(t *testing.T) {
|
|
t.Parallel() // Enable parallel execution
|
|
|
|
// Test empty path
|
|
result := config.ExpandPath("")
|
|
if result != "" {
|
|
t.Errorf("Expected empty string for empty input, got %s", result)
|
|
}
|
|
|
|
// Test normal path (no expansion)
|
|
result = config.ExpandPath("/some/path")
|
|
if result != "/some/path" {
|
|
t.Errorf("Expected /some/path, got %s", result)
|
|
}
|
|
|
|
// Test environment variable expansion
|
|
os.Setenv("TEST_VAR", "test_value")
|
|
defer os.Unsetenv("TEST_VAR")
|
|
|
|
result = config.ExpandPath("/path/$TEST_VAR/file")
|
|
expected := "/path/test_value/file"
|
|
if result != expected {
|
|
t.Errorf("Expected %s, got %s", expected, result)
|
|
}
|
|
|
|
// Test tilde expansion (if home directory is available)
|
|
home, err := os.UserHomeDir()
|
|
if err == nil {
|
|
result = config.ExpandPath("~/test")
|
|
expected := filepath.Join(home, "test")
|
|
if result != expected {
|
|
t.Errorf("Expected %s, got %s", expected, result)
|
|
}
|
|
}
|
|
|
|
// Test combination of tilde and env vars
|
|
if err == nil {
|
|
os.Setenv("TEST_DIR", "mydir")
|
|
defer os.Unsetenv("TEST_DIR")
|
|
|
|
result = config.ExpandPath("~/$TEST_DIR/file")
|
|
expected := filepath.Join(home, "mydir", "file")
|
|
if result != expected {
|
|
t.Errorf("Expected %s, got %s", expected, result)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestResolveConfigPath(t *testing.T) {
|
|
t.Parallel() // Enable parallel execution
|
|
|
|
// Create a temporary directory for testing
|
|
tempDir := t.TempDir()
|
|
|
|
// Test with absolute path that exists
|
|
configFile := filepath.Join(tempDir, "config.yaml")
|
|
err := os.WriteFile(configFile, []byte("test: config"), 0644)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create test config file: %v", err)
|
|
}
|
|
|
|
result, err := config.ResolveConfigPath(configFile)
|
|
if err != nil {
|
|
t.Errorf("Expected no error for existing absolute path, got %v", err)
|
|
}
|
|
if result != config.ExpandPath(configFile) {
|
|
t.Errorf("Expected %s, got %s", config.ExpandPath(configFile), result)
|
|
}
|
|
|
|
// Test with relative path that doesn't exist
|
|
_, err = config.ResolveConfigPath("nonexistent.yaml")
|
|
if err == nil {
|
|
t.Error("Expected error for non-existent config file")
|
|
}
|
|
|
|
// Test with relative path that exists in current directory
|
|
relativeConfig := "relative_config.yaml"
|
|
err = os.WriteFile(relativeConfig, []byte("test: config"), 0644)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create relative config file: %v", err)
|
|
}
|
|
defer os.Remove(relativeConfig)
|
|
|
|
result, err = config.ResolveConfigPath(relativeConfig)
|
|
if err != nil {
|
|
t.Errorf("Expected no error for existing relative path, got %v", err)
|
|
}
|
|
if result != config.ExpandPath(relativeConfig) {
|
|
t.Errorf("Expected %s, got %s", config.ExpandPath(relativeConfig), result)
|
|
}
|
|
|
|
// Test with relative path that exists in configs subdirectory
|
|
configsDir := filepath.Join(tempDir, "configs")
|
|
err = os.MkdirAll(configsDir, 0755)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create configs directory: %v", err)
|
|
}
|
|
|
|
configInConfigs := filepath.Join(configsDir, "config.yaml")
|
|
err = os.WriteFile(configInConfigs, []byte("test: config"), 0644)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create config in configs directory: %v", err)
|
|
}
|
|
|
|
// Change to temp directory to test relative path resolution
|
|
originalWd, err := os.Getwd()
|
|
if err != nil {
|
|
t.Fatalf("Failed to get current working directory: %v", err)
|
|
}
|
|
defer os.Chdir(originalWd)
|
|
|
|
err = os.Chdir(tempDir)
|
|
if err != nil {
|
|
t.Fatalf("Failed to change to temp directory: %v", err)
|
|
}
|
|
|
|
result, err = config.ResolveConfigPath("config.yaml")
|
|
if err != nil {
|
|
t.Errorf("Expected no error for config in configs subdirectory, got %v", err)
|
|
}
|
|
// The result should be the expanded path to the config file
|
|
if !strings.Contains(result, "config.yaml") {
|
|
t.Errorf("Expected result to contain config.yaml, got %s", result)
|
|
}
|
|
}
|
|
|
|
func TestNewJobPaths(t *testing.T) {
|
|
t.Parallel() // Enable parallel execution
|
|
|
|
basePath := "/test/base"
|
|
jobPaths := config.NewJobPaths(basePath)
|
|
|
|
if jobPaths.BasePath != basePath {
|
|
t.Errorf("Expected BasePath %s, got %s", basePath, jobPaths.BasePath)
|
|
}
|
|
}
|
|
|
|
func TestJobPathsMethods(t *testing.T) {
|
|
t.Parallel() // Enable parallel execution
|
|
|
|
basePath := "/test/base"
|
|
jobPaths := config.NewJobPaths(basePath)
|
|
|
|
// Test all path methods
|
|
tests := []struct {
|
|
name string
|
|
method func() string
|
|
expected string
|
|
}{
|
|
{"PendingPath", jobPaths.PendingPath, "/test/base/pending"},
|
|
{"RunningPath", jobPaths.RunningPath, "/test/base/running"},
|
|
{"FinishedPath", jobPaths.FinishedPath, "/test/base/finished"},
|
|
{"FailedPath", jobPaths.FailedPath, "/test/base/failed"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result := tt.method()
|
|
if result != tt.expected {
|
|
t.Errorf("Expected %s, got %s", tt.expected, result)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestJobPathsWithComplexBase(t *testing.T) {
|
|
t.Parallel() // Enable parallel execution
|
|
|
|
basePath := "/very/complex/base/path/with/subdirs"
|
|
jobPaths := config.NewJobPaths(basePath)
|
|
|
|
expectedPending := filepath.Join(basePath, "pending")
|
|
if jobPaths.PendingPath() != expectedPending {
|
|
t.Errorf("Expected %s, got %s", expectedPending, jobPaths.PendingPath())
|
|
}
|
|
|
|
expectedRunning := filepath.Join(basePath, "running")
|
|
if jobPaths.RunningPath() != expectedRunning {
|
|
t.Errorf("Expected %s, got %s", expectedRunning, jobPaths.RunningPath())
|
|
}
|
|
}
|
|
|
|
func TestJobPathsEmptyBase(t *testing.T) {
|
|
t.Parallel() // Enable parallel execution
|
|
|
|
jobPaths := config.NewJobPaths("")
|
|
|
|
// Should still work with empty base path
|
|
expectedPending := "pending"
|
|
if jobPaths.PendingPath() != expectedPending {
|
|
t.Errorf("Expected %s, got %s", expectedPending, jobPaths.PendingPath())
|
|
}
|
|
|
|
expectedRunning := "running"
|
|
if jobPaths.RunningPath() != expectedRunning {
|
|
t.Errorf("Expected %s, got %s", expectedRunning, jobPaths.RunningPath())
|
|
}
|
|
}
|