- Config loader with env var expansion and validation - SQLite database with tasks and toolchain_versions tables - Gitea REST API client for repository and branch operations - K8s client for Job lifecycle management (with noop fallback for local dev) - REST API: tasks CRUD, retry, plugins, version management - Worker/scheduler with polling, concurrency control, and job tracking - Static frontend: generate, tasks, settings pages - Toolchain images: Go and Node.js Dockerfiles with entrypoint scripts - Helm chart with deployment, service, configmap, ingress, PVC - Multi-stage Dockerfile for service - Unit tests for config, database, gitclient, k8s, api, worker - E2E tests for idempotency, version switch, failure recovery
54 lines
1.0 KiB
Go
54 lines
1.0 KiB
Go
package worker
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"proto-gen/internal/config"
|
|
"proto-gen/internal/database"
|
|
"proto-gen/internal/k8s"
|
|
)
|
|
|
|
func newTestScheduler(t *testing.T) (*Scheduler, *database.DB) {
|
|
t.Helper()
|
|
db, err := database.New(t.TempDir() + "/test.db")
|
|
if err != nil {
|
|
t.Fatalf("creating db: %v", err)
|
|
}
|
|
t.Cleanup(func() { db.Close() })
|
|
|
|
cfg := &config.Config{
|
|
Cluster: config.ClusterConfig{
|
|
Namespace: "test",
|
|
JobTimeout: 300,
|
|
MaxConcurrent: 2,
|
|
},
|
|
ToolchainRegistry: "registry.example.com",
|
|
}
|
|
|
|
k8sClient := k8s.NewClientFromInterface(nil)
|
|
scheduler := NewScheduler(db, k8sClient, cfg)
|
|
scheduler.pollInterval = 100 * time.Millisecond
|
|
|
|
return scheduler, db
|
|
}
|
|
|
|
func TestNewScheduler(t *testing.T) {
|
|
scheduler, db := newTestScheduler(t)
|
|
defer db.Close()
|
|
|
|
if scheduler.db == nil {
|
|
t.Error("db is nil")
|
|
}
|
|
if scheduler.k8sClient == nil {
|
|
t.Error("k8sClient is nil")
|
|
}
|
|
}
|
|
|
|
func TestProcessPendingTasks_Empty(t *testing.T) {
|
|
scheduler, db := newTestScheduler(t)
|
|
defer db.Close()
|
|
|
|
scheduler.processPendingTasks()
|
|
}
|