// Author: simon // Author: ynwdlxm@163.com // Date: 2025/1/26 16:53 // Desc: package main import ( "bytes" "fmt" "os" "path/filepath" "strings" "testing" ) func TestRun(t *testing.T) { testCases := []struct { name string root string cfg config expected string }{ {name: "NoFilter", root: "testdata", cfg: config{ext: "", size: 0, list: true}, expected: "testdata/dir.log\ntestdata/dir2/script.sh\n"}, {"FilterExtensionMatch", "testdata", config{ext: ".log", size: 0, list: true}, "testdata/dir.log\n"}, {"FilterExtensionSizeMatch", "testdata", config{ext: ".log", size: 10, list: true}, "testdata/dir.log\n"}, {"FilterExtensionSizeNoMatch", "testdata", config{ext: ".log", size: 20, list: true}, ""}, {"FilterExtensionNoMatch", "testdata", config{ext: ".gz", size: 0, list: true}, ""}} for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { var buffer bytes.Buffer if err := run(tc.root, &buffer, tc.cfg); err != nil { t.Fatal(err) } res := buffer.String() if tc.expected != res { t.Errorf("Expected %q, got %q instead\n", tc.expected, res) } }) } } func TestRunDelExtension(t *testing.T) { testCases := []struct { name string cfg config extNoDelete string nDelete int nNoDelete int expected string }{ {"DeleteExtensionNoMatch", config{ext: ".log", del: true}, ".gz", 10, 0, ""}, {"DeleteExtensionMatch", config{ext: ".log", del: true}, "", 10, 0, ""}, {"DeleteExtensionMixed", config{ext: ".log", del: true}, ".gz", 5, 5, ""}, } // Execute RunDel test cases for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { var buffer bytes.Buffer var logBuffer bytes.Buffer tc.cfg.wLog = &logBuffer tempDir, cleanup := createTempDir(t, map[string]int{ tc.cfg.ext: tc.nDelete, tc.extNoDelete: tc.nNoDelete, }) defer cleanup() if err := run(tempDir, &buffer, tc.cfg); err != nil { t.Fatal(err) } res := buffer.String() if tc.expected != res { t.Errorf("Expected %q, got %q instead\n", tc.expected, res) } filesLeft, err := os.ReadDir(tempDir) if err != nil { t.Error(err) } if len(filesLeft) != tc.nNoDelete { t.Errorf("Expected %d files left, got %d instead\n", tc.nNoDelete, len(filesLeft)) } expLogLines := tc.nDelete + 1 lines := bytes.Split(logBuffer.Bytes(), []byte("\n")) if len(lines) != expLogLines { t.Errorf("Expected %d log lines, got %d instead\n", expLogLines, len(lines)) } }) } } func TestRunArchive(t *testing.T) { // Archiving test cases testCases := []struct { name string cfg config extNoArchive string nArchive int nNoArchive int }{ {name: "ArchiveExtensionNoMatch", cfg: config{ext: ".log"}, extNoArchive: ".gz", nArchive: 0, nNoArchive: 10}, {name: "ArchiveExtensionMatch", cfg: config{ext: ".log"}, extNoArchive: "", nArchive: 10, nNoArchive: 0}, {name: "ArchiveExtensionMixed", cfg: config{ext: ".log"}, extNoArchive: ".gz", nArchive: 5, nNoArchive: 5}, } // Execute RunArchive test cases for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { var buffer bytes.Buffer // Create temp dirs for RunArchive test tempDir, cleanup := createTempDir(t, map[string]int{ tc.cfg.ext: tc.nArchive, tc.extNoArchive: tc.nNoArchive, }) defer cleanup() archiveDir, cleanupArchive := createTempDir(t, nil) defer cleanupArchive() tc.cfg.archive = archiveDir if err := run(tempDir, &buffer, tc.cfg); err != nil { t.Fatal(err) } pattern := filepath.Join(tempDir, fmt.Sprintf("*%s", tc.cfg.ext)) expFiles, err := filepath.Glob(pattern) if err != nil { t.Fatal(err) } expOut := strings.Join(expFiles, "\n") res := strings.TrimSpace(buffer.String()) if expOut != res { t.Errorf("Expected %q, got %q instead\n", expOut, res) } // Validate the number of files archived filesArchived, err := os.ReadDir(archiveDir) if err != nil { t.Fatal(err) } if len(filesArchived) != tc.nArchive { t.Errorf("Expected %d files archived, got %d instead\n", tc.nNoArchive, len(filesArchived)) } }) } } func createTempDir(t *testing.T, files map[string]int) (dirname string, cleanup func()) { tempDir, err := os.MkdirTemp("", "walktest") if err != nil { t.Fatal(err) } for k, n := range files { for j := 1; j <= n; j++ { fName := fmt.Sprintf("field%d%s", j, k) fPath := filepath.Join(tempDir, fName) if err := os.WriteFile(fPath, []byte("dummy"), 0644); err != nil { t.Fatal(err) } } } return tempDir, func() { _ = os.RemoveAll(tempDir) } }