1
0
Files
Skill/manager/internal/installer/transaction_test.go

101 lines
2.4 KiB
Go

package installer
import (
"os"
"path/filepath"
"testing"
)
func TestTransaction_StageAndCommit(t *testing.T) {
tmpDir, err := os.MkdirTemp("", "skillmgr-tx-test-*")
if err != nil {
t.Fatalf("创建临时目录失败: %v", err)
}
defer os.RemoveAll(tmpDir)
// 创建源文件
srcDir := filepath.Join(tmpDir, "src")
os.MkdirAll(srcDir, 0755)
os.WriteFile(filepath.Join(srcDir, "test.md"), []byte("test content"), 0644)
// 创建文件映射
targetDir := filepath.Join(tmpDir, "target")
fileMap := map[string]string{
filepath.Join(srcDir, "test.md"): filepath.Join(targetDir, "test.md"),
}
tx, err := NewTransaction(targetDir, fileMap)
if err != nil {
t.Fatalf("NewTransaction 失败: %v", err)
}
// Stage
if err := tx.Stage(); err != nil {
t.Fatalf("Stage 失败: %v", err)
}
// 验证 staging 目录存在
if _, err := os.Stat(tx.stagingDir); os.IsNotExist(err) {
t.Error("Staging 目录应该存在")
}
// Commit
if err := tx.Commit(); err != nil {
t.Fatalf("Commit 失败: %v", err)
}
// 验证目标文件存在
if _, err := os.Stat(filepath.Join(targetDir, "test.md")); os.IsNotExist(err) {
t.Error("目标文件应该存在")
}
// 验证 staging 目录已清理
if _, err := os.Stat(tx.stagingDir); !os.IsNotExist(err) {
t.Error("Staging 目录应该被清理")
}
}
func TestTransaction_Rollback(t *testing.T) {
tmpDir, err := os.MkdirTemp("", "skillmgr-tx-test-*")
if err != nil {
t.Fatalf("创建临时目录失败: %v", err)
}
defer os.RemoveAll(tmpDir)
// 创建源文件
srcDir := filepath.Join(tmpDir, "src")
os.MkdirAll(srcDir, 0755)
os.WriteFile(filepath.Join(srcDir, "test.md"), []byte("test content"), 0644)
// 创建文件映射
targetDir := filepath.Join(tmpDir, "target")
fileMap := map[string]string{
filepath.Join(srcDir, "test.md"): filepath.Join(targetDir, "test.md"),
}
tx, err := NewTransaction(targetDir, fileMap)
if err != nil {
t.Fatalf("NewTransaction 失败: %v", err)
}
// Stage
if err := tx.Stage(); err != nil {
t.Fatalf("Stage 失败: %v", err)
}
stagingDir := tx.stagingDir
// Rollback (no return value)
tx.Rollback()
// 验证 staging 目录已清理
if _, err := os.Stat(stagingDir); !os.IsNotExist(err) {
t.Error("Staging 目录应该被清理")
}
// 验证目标目录不存在
if _, err := os.Stat(targetDir); !os.IsNotExist(err) {
t.Error("目标目录不应该存在")
}
}