Files

125 lines
2.6 KiB
Go
Raw Permalink Normal View History

package persistence_test
import (
"errors"
"os"
"reflect"
"testing"
"github.com/StevanFreeborn/term-tier/internal/core"
"github.com/StevanFreeborn/term-tier/internal/persistence"
)
func TestFileSaver_Save(t *testing.T) {
t.Run("Successfully saves content to mock FS", func(t *testing.T) {
mock := newMockFS()
saver := persistence.NewFileSaverWithFS(mock)
inputState := core.SaveState{}
filename := "test_tierlist.json"
err := saver.Save(filename, inputState)
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
if _, exists := mock.files[filename]; !exists {
t.Error("Expected file to be created in mock FS")
}
})
t.Run("Returns error on write failure", func(t *testing.T) {
mock := newMockFS()
mock.writeErr = errors.New("disk full")
saver := persistence.NewFileSaverWithFS(mock)
err := saver.Save("fail.json", core.SaveState{})
if err == nil {
t.Error("Expected error due to write failure, got nil")
}
})
}
func TestFileSaver_Load(t *testing.T) {
t.Run("Successfully loads existing file", func(t *testing.T) {
mock := newMockFS()
filename := "data.json"
validJSON := []byte(`{
"tiers": []
}`)
mock.files[filename] = validJSON
saver := persistence.NewFileSaverWithFS(mock)
result, err := saver.Load(filename)
if err != nil {
t.Fatalf("Expected no error, got %v", err)
}
if reflect.ValueOf(result).IsZero() && len(validJSON) == 0 {
t.Error("Loaded data does not match expected content")
}
})
t.Run("Returns error when file does not exist", func(t *testing.T) {
mock := newMockFS()
saver := persistence.NewFileSaverWithFS(mock)
_, err := saver.Load("nonexistent.json")
if err == nil {
t.Error("Expected error for missing file, got nil")
}
if !errors.Is(err, os.ErrNotExist) {
t.Errorf("Expected os.ErrNotExist, got %v", err)
}
})
t.Run("Returns error on invalid JSON", func(t *testing.T) {
mock := newMockFS()
mock.files["bad.json"] = []byte(`{ broken_json: `)
saver := persistence.NewFileSaverWithFS(mock)
_, err := saver.Load("bad.json")
if err == nil {
t.Error("Expected JSON unmarshal error, got nil")
}
})
}
type mockFS struct {
files map[string][]byte
writeErr error
readErr error
}
func newMockFS() *mockFS {
return &mockFS{
files: make(map[string][]byte),
}
}
func (m *mockFS) WriteFile(name string, data []byte, perm os.FileMode) error {
if m.writeErr != nil {
return m.writeErr
}
m.files[name] = data
return nil
}
func (m *mockFS) ReadFile(name string) ([]byte, error) {
if m.readErr != nil {
return nil, m.readErr
}
data, exists := m.files[name]
if !exists {
return nil, os.ErrNotExist
}
return data, nil
}