package utils import ( "os" "path/filepath" "testing" "github.com/stretchr/testify/assert" ) func TestLimitString(t *testing.T) { tests := []struct { name string input string maxLen int expected string }{ { name: "Short string", input: "hello", maxLen: 10, expected: "hello", }, { name: "Exact length", input: "hello", maxLen: 5, expected: "hello", }, { name: "Too long", input: "hello world", maxLen: 8, expected: "hello...", }, { name: "With newlines", input: "hello\nworld", maxLen: 20, expected: "hello\\nworld", }, { name: "With newlines truncated", input: "hello\nworld\nfoo\nbar", maxLen: 15, expected: "hello\\nworld...", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result := LimitString(tt.input, tt.maxLen) assert.Equal(t, tt.expected, result) }) } } func TestResetWhereNecessary(t *testing.T) { tmpDir, err := os.MkdirTemp("", "reset-test-*") assert.NoError(t, err) defer os.RemoveAll(tmpDir) // Create test files file1 := filepath.Join(tmpDir, "file1.txt") file2 := filepath.Join(tmpDir, "file2.txt") file3 := filepath.Join(tmpDir, "file3.txt") err = os.WriteFile(file1, []byte("original1"), 0644) assert.NoError(t, err) err = os.WriteFile(file2, []byte("original2"), 0644) assert.NoError(t, err) err = os.WriteFile(file3, []byte("original3"), 0644) assert.NoError(t, err) // Modify files err = os.WriteFile(file1, []byte("modified1"), 0644) assert.NoError(t, err) err = os.WriteFile(file2, []byte("modified2"), 0644) assert.NoError(t, err) // Create mock DB db, err := GetDB() assert.NoError(t, err) err = db.SaveFile(file1, []byte("original1")) assert.NoError(t, err) err = db.SaveFile(file2, []byte("original2")) assert.NoError(t, err) // file3 not in DB // Create associations with reset commands associations := map[string]FileCommandAssociation{ file1: { File: file1, Commands: []ModifyCommand{ {Name: "cmd1", Reset: true}, }, }, file2: { File: file2, IsolateCommands: []ModifyCommand{ {Name: "cmd2", Reset: true}, }, }, file3: { File: file3, Commands: []ModifyCommand{ {Name: "cmd3", Reset: false}, // No reset }, }, } // Run reset err = ResetWhereNecessary(associations, db) assert.NoError(t, err) // Verify file1 was reset data, _ := os.ReadFile(file1) assert.Equal(t, "original1", string(data)) // Verify file2 was reset data, _ = os.ReadFile(file2) assert.Equal(t, "original2", string(data)) // Verify file3 was NOT reset data, _ = os.ReadFile(file3) assert.Equal(t, "original3", string(data)) } func TestResetWhereNecessaryMissingFromDB(t *testing.T) { tmpDir, err := os.MkdirTemp("", "reset-missing-test-*") assert.NoError(t, err) defer os.RemoveAll(tmpDir) // Create a test file that's been modified file1 := filepath.Join(tmpDir, "file1.txt") err = os.WriteFile(file1, []byte("modified_content"), 0644) assert.NoError(t, err) // Create DB but DON'T save file to it db, err := GetDB() assert.NoError(t, err) // Create associations with reset command associations := map[string]FileCommandAssociation{ file1: { File: file1, Commands: []ModifyCommand{ {Name: "cmd1", Reset: true}, }, }, } // Run reset - should use current disk content as fallback err = ResetWhereNecessary(associations, db) assert.NoError(t, err) // Verify file was "reset" to current content (saved to DB for next time) data, _ := os.ReadFile(file1) assert.Equal(t, "modified_content", string(data)) // Verify it was saved to DB savedData, err := db.GetFile(file1) assert.NoError(t, err) assert.Equal(t, "modified_content", string(savedData)) } func TestResetAllFiles(t *testing.T) { tmpDir, err := os.MkdirTemp("", "reset-all-test-*") assert.NoError(t, err) defer os.RemoveAll(tmpDir) // Create test files file1 := filepath.Join(tmpDir, "file1.txt") file2 := filepath.Join(tmpDir, "file2.txt") err = os.WriteFile(file1, []byte("original1"), 0644) assert.NoError(t, err) err = os.WriteFile(file2, []byte("original2"), 0644) assert.NoError(t, err) // Create mock DB and save originals db, err := GetDB() assert.NoError(t, err) err = db.SaveFile(file1, []byte("original1")) assert.NoError(t, err) err = db.SaveFile(file2, []byte("original2")) assert.NoError(t, err) // Modify files err = os.WriteFile(file1, []byte("modified1"), 0644) assert.NoError(t, err) err = os.WriteFile(file2, []byte("modified2"), 0644) assert.NoError(t, err) // Verify they're modified data, _ := os.ReadFile(file1) assert.Equal(t, "modified1", string(data)) // Reset all err = ResetAllFiles(db) assert.NoError(t, err) // Verify both were reset data, _ = os.ReadFile(file1) assert.Equal(t, "original1", string(data)) data, _ = os.ReadFile(file2) assert.Equal(t, "original2", string(data)) }