package keepalive import ( "os" "path/filepath" "testing" "time" ) func TestTouchInWorkspace(t *testing.T) { // Create temp directory tmpDir := t.TempDir() // Touch the keepalive TouchInWorkspace(tmpDir, "gt status") // Read back state := Read(tmpDir) if state == nil { t.Fatal("expected state to be non-nil") } if state.LastCommand != "gt status" { t.Errorf("expected last_command 'gt status', got %q", state.LastCommand) } // Check timestamp is recent if time.Since(state.Timestamp) > time.Minute { t.Errorf("timestamp too old: %v", state.Timestamp) } } func TestReadNonExistent(t *testing.T) { tmpDir := t.TempDir() state := Read(tmpDir) if state != nil { t.Error("expected nil state for non-existent file") } } func TestStateAge(t *testing.T) { // Test nil state returns very large age var nilState *State if nilState.Age() < 24*time.Hour { t.Error("nil state should have very large age") } // Test fresh state returns accurate age freshState := &State{Timestamp: time.Now().Add(-30 * time.Second)} age := freshState.Age() if age < 29*time.Second || age > 31*time.Second { t.Errorf("expected ~30s age, got %v", age) } // Test older state returns accurate age olderState := &State{Timestamp: time.Now().Add(-5 * time.Minute)} age = olderState.Age() if age < 4*time.Minute+55*time.Second || age > 5*time.Minute+5*time.Second { t.Errorf("expected ~5m age, got %v", age) } // NOTE: IsFresh(), IsStale(), IsVeryStale() were removed as part of ZFC cleanup. // Staleness classification belongs in Deacon molecule, not Go code. // See gt-gaxo epic for rationale. } func TestDirectoryCreation(t *testing.T) { tmpDir := t.TempDir() workDir := filepath.Join(tmpDir, "some", "nested", "workspace") // Touch should create .runtime directory TouchInWorkspace(workDir, "gt test") // Verify directory was created runtimeDir := filepath.Join(workDir, ".runtime") if _, err := os.Stat(runtimeDir); os.IsNotExist(err) { t.Error("expected .runtime directory to be created") } }