feat: implement proto-gen platform
- 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
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
package k8s
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
batchv1 "k8s.io/api/batch/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/client-go/kubernetes/fake"
|
||||
)
|
||||
|
||||
func TestCreateJob(t *testing.T) {
|
||||
clientset := fake.NewSimpleClientset()
|
||||
client := NewClientFromInterface(clientset)
|
||||
|
||||
job, err := client.CreateJob(&JobSpec{
|
||||
Name: "test-job",
|
||||
Namespace: "default",
|
||||
Image: "test-image:v1",
|
||||
EnvVars: map[string]string{"KEY": "value"},
|
||||
TimeoutSecond: 300,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("CreateJob: %v", err)
|
||||
}
|
||||
if job.Name != "test-job" {
|
||||
t.Errorf("Name = %q, want %q", job.Name, "test-job")
|
||||
}
|
||||
if job.Status != JobPending {
|
||||
t.Errorf("Status = %q, want %q", job.Status, JobPending)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetJob(t *testing.T) {
|
||||
clientset := fake.NewSimpleClientset(&batchv1.Job{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "done-job", Namespace: "default"},
|
||||
Status: batchv1.JobStatus{Succeeded: 1},
|
||||
})
|
||||
client := NewClientFromInterface(clientset)
|
||||
|
||||
job, err := client.GetJob("done-job", "default")
|
||||
if err != nil {
|
||||
t.Fatalf("GetJob: %v", err)
|
||||
}
|
||||
if job.Status != JobSucceeded {
|
||||
t.Errorf("Status = %q, want %q", job.Status, JobSucceeded)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetJob_Running(t *testing.T) {
|
||||
clientset := fake.NewSimpleClientset(&batchv1.Job{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "run-job", Namespace: "default"},
|
||||
Status: batchv1.JobStatus{Active: 1},
|
||||
})
|
||||
client := NewClientFromInterface(clientset)
|
||||
|
||||
job, err := client.GetJob("run-job", "default")
|
||||
if err != nil {
|
||||
t.Fatalf("GetJob: %v", err)
|
||||
}
|
||||
if job.Status != JobRunning {
|
||||
t.Errorf("Status = %q, want %q", job.Status, JobRunning)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeleteJob(t *testing.T) {
|
||||
clientset := fake.NewSimpleClientset(&batchv1.Job{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "del-job", Namespace: "default"},
|
||||
})
|
||||
client := NewClientFromInterface(clientset)
|
||||
|
||||
err := client.DeleteJob("del-job", "default")
|
||||
if err != nil {
|
||||
t.Fatalf("DeleteJob: %v", err)
|
||||
}
|
||||
|
||||
_, err = clientset.BatchV1().Jobs("default").Get(nil, "del-job", metav1.GetOptions{})
|
||||
if err == nil {
|
||||
t.Error("expected error getting deleted job")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user