Pad/internal/editor/auto_save_test.go
Greg Pomerantz 03fb63863c Fix test build after NewLogic signature change; add development plan draft
NewLogic now takes (FileSystem, path, openfunc); update the e2e harness
and editor tests accordingly. The harness uses a no-op openfunc, matching
impl_other.go (the real app's OpenFile is a platform bridge, no-op off
Android).

Also adds doc/development_plan.md (draft, with corrections note re: the
live repo state).
2026-08-15 22:18:04 -04:00

82 lines
2.0 KiB
Go

package editor
import (
"log"
"testing"
"time"
"pad/internal/io/pool"
"pad/internal/io/pool/mock"
)
// TestWriteFailureTracking verifies that a write failure updates WriteFailed status
func TestWriteFailureTracking(t *testing.T) {
state := NewState()
filename := "test.txt"
state.Editor.Filename = filename
// Simulate a write failure
state.Editor.SetWriteFailed(filename, true)
if !state.Editor.WriteFailed() {
t.Errorf("Expected WriteFailed() to be true")
}
// Reset
state.Editor.SetWriteFailed(filename, false)
if state.Editor.WriteFailed() {
t.Errorf("Expected WriteFailed() to be false")
}
}
// TestAutoSave_RetryFails verifies that failed writes trigger retry mechanism.
// TestAutoSave_RetryFails verifies that failed writes trigger retry mechanism.
func TestAutoSave_RetryFails(t *testing.T) {
// Setup: New Logic, set mock FS to fail
l := NewLogic(nil, "/", func(string) {})
// Start a goroutine to drain frameChan to prevent deadlocks
go func() {
for range l.frameChan {
}
}()
filename := "test.txt"
l.state.Editor.Filename = filename
l.state.Editor.Buffer = "hello"
// Mock FS to fail on Write
mfs, ok := l.mockFS.(*mock.FileSystem)
if !ok {
t.Fatal("mockFS is not a *mock.FileSystem")
}
mfs.SetWriteError(true)
// 1. Manually dispatch a write task
task := pool.NewWriteFileTask(filename, []byte("hello"), l.mockFS)
l.workerPool.Dispatch(task)
// 2. Manually process the result to trigger the failure state
res := <-l.workerPool.ResultChan()
l.handleWorkerResult(res)
// 3. Assert failure
if !l.state.Editor.WriteFailed() {
t.Errorf("Expected WriteFailed() to be true")
}
// 4. Assert retry scheduled
retryTriggered := false
select {
case filename := <-l.retryChan:
log.Printf("Test: Received retry for %s", filename)
retryTriggered = true
case <-time.After(5 * time.Second):
t.Log("Test: Timed out waiting for retry trigger in retryChan")
}
if !retryTriggered {
t.Errorf("Retry was not triggered")
}
}