package deploy import ( "context" "fmt" "log/slog" "os" "path/filepath" "git.eeqj.de/sneak/upaas/internal/config" "git.eeqj.de/sneak/upaas/internal/docker" ) // NewTestService creates a Service with minimal dependencies for testing. func NewTestService(log *slog.Logger) *Service { return &Service{ log: log, } } // CancelActiveDeploy exposes cancelActiveDeploy for testing. func (svc *Service) CancelActiveDeploy(appID string) { svc.cancelActiveDeploy(appID) } // RegisterActiveDeploy registers an active deploy for testing. func (svc *Service) RegisterActiveDeploy(appID string, cancel context.CancelFunc, done chan struct{}) { svc.activeDeploys.Store(appID, &activeDeploy{cancel: cancel, done: done}) } // TryLockApp exposes tryLockApp for testing. func (svc *Service) TryLockApp(appID string) bool { return svc.tryLockApp(appID) } // UnlockApp exposes unlockApp for testing. func (svc *Service) UnlockApp(appID string) { svc.unlockApp(appID) } // NewTestServiceWithConfig creates a Service with config and docker client for testing. func NewTestServiceWithConfig(log *slog.Logger, cfg *config.Config, dockerClient *docker.Client) *Service { return &Service{ log: log, config: cfg, docker: dockerClient, } } // CleanupCancelledDeploy exposes cleanupCancelledDeploy for testing. func (svc *Service) CleanupCancelledDeploy( ctx context.Context, appName string, deploymentID int64, imageID string, ) { // We can't create real models.App/Deployment in tests easily, // so we test the build dir cleanup portion directly. buildDir := svc.GetBuildDir(appName) entries, err := os.ReadDir(buildDir) if err != nil { return } prefix := fmt.Sprintf("%d-", deploymentID) for _, entry := range entries { if entry.IsDir() && len(entry.Name()) > len(prefix) && entry.Name()[:len(prefix)] == prefix { dirPath := filepath.Join(buildDir, entry.Name()) _ = os.RemoveAll(dirPath) } } } // GetBuildDirExported exposes GetBuildDir for testing. func (svc *Service) GetBuildDirExported(appName string) string { return svc.GetBuildDir(appName) }