filed

Job queue using FUSE

git clone git://mccd.space/filed

jobs_test.go (3264B)

      1 package store
      2 
      3 import (
      4 	"path/filepath"
      5 	"testing"
      6 )
      7 
      8 // Create a new store in a temporary directory for each test.
      9 func setupTestDB(t *testing.T) *Store {
     10 	t.Helper()
     11 	tmpDir := t.TempDir()
     12 	dbPath := filepath.Join(tmpDir, "jobs.db")
     13 
     14 	store, err := NewStore(dbPath)
     15 	if err != nil {
     16 		t.Fatalf("Failed to create store: %v", err)
     17 	}
     18 
     19 	t.Cleanup(func() {
     20 		store.Close()
     21 	})
     22 
     23 	return store
     24 }
     25 
     26 func TestCreateJob(t *testing.T) {
     27 	s := setupTestDB(t)
     28 
     29 	jobID := "job-123"
     30 	cmd := "echo hello"
     31 
     32 	job, err := s.CreateJob(jobID, cmd)
     33 	if err != nil {
     34 		t.Fatalf("Failed to create job: %v", err)
     35 	}
     36 
     37 	if job.ID != jobID {
     38 		t.Errorf("Expected ID %s, got %s", jobID, job.ID)
     39 	}
     40 	if job.State != StatePending {
     41 		t.Errorf("Expected state %s, got %s", StatePending, job.State)
     42 	}
     43 	if job.Command != cmd {
     44 		t.Errorf("Expected command %s, got %s", cmd, job.Command)
     45 	}
     46 }
     47 
     48 func TestGetJob(t *testing.T) {
     49 	s := setupTestDB(t)
     50 	jobID := "test-job-get"
     51 
     52 	_, err := s.CreateJob(jobID, "sleep 1")
     53 	if err != nil {
     54 		t.Fatalf("CreateJob failed: %v", err)
     55 	}
     56 
     57 	// Retrieve it
     58 	job, err := s.GetJob(jobID)
     59 	if err != nil {
     60 		t.Fatalf("GetJob failed: %v", err)
     61 	}
     62 
     63 	if job.ID != jobID {
     64 		t.Errorf("Expected retrieved ID to match")
     65 	}
     66 }
     67 
     68 func TestLifecycleTransitions(t *testing.T) {
     69 	s := setupTestDB(t)
     70 	jobID := "lifecycle-1"
     71 
     72 	_, err := s.CreateJob(jobID, "echo hello")
     73 	if err != nil {
     74 		t.Fatalf("CreateJob failed: %v", err)
     75 	}
     76 
     77 	// 1. Pending -> Running (AttemptJob)
     78 	if err := s.AttemptJob(jobID); err != nil {
     79 		t.Fatalf("AttemptJob failed: %v", err)
     80 	}
     81 
     82 	j, _ := s.GetJob(jobID)
     83 	if j.State != StateRunning {
     84 		t.Errorf("Expected state Running, got %s", j.State)
     85 	}
     86 	if j.Attempts != 1 {
     87 		t.Errorf("Expected attempts 1, got %d", j.Attempts)
     88 	}
     89 
     90 	// 2. Running -> Completed
     91 	if err := s.CompleteJob(jobID, []byte("hello")); err != nil {
     92 		t.Fatalf("CompleteJob failed: %v", err)
     93 	}
     94 
     95 	j, _ = s.GetJob(jobID)
     96 	if j.State != StateCompleted {
     97 		t.Errorf("Expected state Completed, got %s", j.State)
     98 	}
     99 
    100 	// 3. Restart (Completed -> Pending)
    101 	if err := s.RestartJob(jobID, nil); err != nil {
    102 		t.Fatalf("RestartJob failed: %v", err)
    103 	}
    104 
    105 	j, _ = s.GetJob(jobID)
    106 	if j.State != StatePending {
    107 		t.Errorf("Expected state Pending after restart, got %s", j.State)
    108 	}
    109 }
    110 
    111 func TestListJobsByState(t *testing.T) {
    112 	s := setupTestDB(t)
    113 
    114 	s.CreateJob("p1", "cmd1")
    115 	s.CreateJob("p2", "cmd2")
    116 
    117 	s.CreateJob("c1", "cmd3")
    118 	s.CompleteJob("c1", []byte("out"))
    119 
    120 	// List Pending
    121 	pending, err := s.ListJobsByState(StatePending)
    122 	if err != nil {
    123 		t.Fatalf("ListJobsByState failed: %v", err)
    124 	}
    125 
    126 	if len(pending) != 2 {
    127 		t.Errorf("Expected 2 pending jobs, got %d", len(pending))
    128 	}
    129 
    130 	// List Completed
    131 	completed, err := s.ListJobsByState(StateCompleted)
    132 	if err != nil {
    133 		t.Fatalf("ListJobsByState failed: %v", err)
    134 	}
    135 	if len(completed) != 1 {
    136 		t.Errorf("Expected 1 completed job, got %d", len(completed))
    137 	}
    138 	if completed[0].ID != "c1" {
    139 		t.Errorf("Expected completed job to be c1")
    140 	}
    141 }
    142 
    143 func TestDeleteJob(t *testing.T) {
    144 	s := setupTestDB(t)
    145 	jobID := "del-1"
    146 
    147 	s.CreateJob(jobID, "cmd")
    148 
    149 	if err := s.DeleteJob(jobID); err != nil {
    150 		t.Fatalf("DeleteJob failed: %v", err)
    151 	}
    152 
    153 	_, err := s.GetJob(jobID)
    154 	if err == nil {
    155 		t.Error("Expected error getting deleted job, got nil")
    156 	}
    157 }