From 352b768958b47ceb704571e71063831c722239dd Mon Sep 17 00:00:00 2001 From: sakura <1927346336@qq.com> Date: Sun, 1 Jun 2025 17:09:09 +0800 Subject: [PATCH] fix(utils): Fix bug in writeToFile function --- internal/utils/files.go | 2 +- internal/utils/files_test.go | 107 +++++++++++++++++++++++++++++++++++ internal/utils/set_test.go | 36 ++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 internal/utils/files_test.go create mode 100644 internal/utils/set_test.go diff --git a/internal/utils/files.go b/internal/utils/files.go index 1cb849b0..6a9893a3 100644 --- a/internal/utils/files.go +++ b/internal/utils/files.go @@ -73,7 +73,7 @@ func WriteToFile(path string, data []byte) error { prevContent, err := FileReadAll(path) if err == nil { bakFile, err := os.Create(path + ".bak") - if err != nil { + if err == nil { _, err = bakFile.Write(prevContent) } if err != nil { diff --git a/internal/utils/files_test.go b/internal/utils/files_test.go new file mode 100644 index 00000000..25019af3 --- /dev/null +++ b/internal/utils/files_test.go @@ -0,0 +1,107 @@ +package utils + +import ( + "io" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFileReadAll_Success(t *testing.T) { + content := []byte("test content") + tmpfile, err := os.CreateTemp("", "example") + assert.Nil(t, err) + defer os.Remove(tmpfile.Name()) + + _, err = tmpfile.Write(content) + assert.Nil(t, err) + assert.Nil(t, tmpfile.Close()) + + data, err := FileReadAll(tmpfile.Name()) + + assert.Nil(t, err) + assert.Equal(t, content, data) +} + +func TestFileReadAll_FileNotExist(t *testing.T) { + data, err := FileReadAll("nonexistent_file") + + assert.NotNil(t, err) + assert.Nil(t, data) + assert.True(t, os.IsNotExist(err)) +} + +func TestFileReadAll_OpenError(t *testing.T) { + // create a directory which can't be opened as a file + tmpDir, err := os.MkdirTemp("", "testdir") + assert.Nil(t, err) + defer os.RemoveAll(tmpDir) + + data, err := FileReadAll(tmpDir) + + assert.NotNil(t, err) + assert.Nil(t, data) +} + +func TestEnsureDir_Success(t *testing.T) { + dir := "tmpdir" + + err := os.Mkdir(dir, 0755) + defer os.Remove(dir) + assert.Nil(t, err) + + err = ensureDir(dir) + assert.Nil(t, err) +} + +func TestEnsureDir_CreateIfNotExist(t *testing.T) { + dir := "tmpdir" + + err := ensureDir(dir) + defer os.Remove(dir) + + assert.Nil(t, err) + info, err := os.Stat(dir) + assert.Nil(t, err) + assert.True(t, info.IsDir()) +} + +func TestEnsureDir_Fail(t *testing.T) { + tmpFile, err := os.CreateTemp("", "testfile") + assert.Nil(t, err) + defer os.Remove(tmpFile.Name()) + + err = ensureDir(tmpFile.Name()) + assert.NotNil(t, err) +} + +func TestWriteToFile_FileExist(t *testing.T) { + var ( + existFileName string + oldContent = []byte("old content") + newContent = []byte("new content") + ) + // prepare a exist file with data + existFile, _ := os.CreateTemp("", "TestWriteToFile_FileExist") + existFileName = existFile.Name() + + existFile.Write(oldContent) + existFile.Close() + + err := WriteToFile(existFileName, newContent) + assert.Nil(t, err) + + check := func(t *testing.T, path string, expectedData []byte) { + f, err := os.Open(path) + defer os.Remove(path) + + assert.Nil(t, err) + data, err := io.ReadAll(f) + assert.Nil(t, err) + assert.Equal(t, expectedData, data) + } + + check(t, existFileName, newContent) + check(t, existFileName+".bak", oldContent) +} diff --git a/internal/utils/set_test.go b/internal/utils/set_test.go new file mode 100644 index 00000000..3a30d2cd --- /dev/null +++ b/internal/utils/set_test.go @@ -0,0 +1,36 @@ +package utils + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSet_NormalUsage(t *testing.T) { + set := NewSet() + set.AddKV("name", "xiaoming") + set.AddKV("age", "18") + set.Add(StringUnique("hello")) + + name, ok := set.Contains("name") + assert.True(t, ok) + assert.Equal(t, "xiaoming", name.UniqueID()) + + _, ok = set.Contains("gender") + assert.False(t, ok) + + assert.Equal(t, 3, set.Len()) +} + +func TestSet_MarshalJSON(t *testing.T) { + st := NewSet() + + st.AddKV("name", "xiaoming") + st.AddKV("age", "18") + st.Add(StringUnique("hello")) + + data, err := json.Marshal(&st) + assert.Nil(t, err) + t.Log(string(data)) +}