Files
go-zero/tools/goctl/util/zipx/zipx_test.go
2026-03-15 13:55:27 +00:00

119 lines
2.7 KiB
Go

package zipx
import (
"archive/zip"
"os"
"path/filepath"
"runtime"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func createTestZip(t *testing.T, files map[string]struct {
content string
mode os.FileMode
}) string {
t.Helper()
zipPath := filepath.Join(t.TempDir(), "test.zip")
f, err := os.Create(zipPath)
require.NoError(t, err)
defer f.Close()
w := zip.NewWriter(f)
defer w.Close()
for name, file := range files {
header := &zip.FileHeader{
Name: name,
Method: zip.Deflate,
}
header.SetMode(file.mode)
writer, err := w.CreateHeader(header)
require.NoError(t, err)
_, err = writer.Write([]byte(file.content))
require.NoError(t, err)
}
return zipPath
}
func TestUnpacking(t *testing.T) {
dest := t.TempDir()
zipPath := createTestZip(t, map[string]struct {
content string
mode os.FileMode
}{
"hello.txt": {content: "hello world", mode: 0644},
"skip.txt": {content: "should be skipped", mode: 0644},
})
err := Unpacking(zipPath, dest, func(f *zip.File) bool {
return f.Name == "hello.txt"
})
require.NoError(t, err)
content, err := os.ReadFile(filepath.Join(dest, "hello.txt"))
assert.NoError(t, err)
assert.Equal(t, "hello world", string(content))
_, err = os.Stat(filepath.Join(dest, "skip.txt"))
assert.True(t, os.IsNotExist(err))
}
func TestUnpackingPreservesExecutablePermission(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("file permissions not applicable on Windows")
}
dest := t.TempDir()
zipPath := createTestZip(t, map[string]struct {
content string
mode os.FileMode
}{
"bin/mybinary": {content: "binary content", mode: 0755},
"readme.txt": {content: "readme", mode: 0644},
})
err := Unpacking(zipPath, dest, func(f *zip.File) bool {
return true
})
require.NoError(t, err)
info, err := os.Stat(filepath.Join(dest, "mybinary"))
require.NoError(t, err)
assert.NotZero(t, info.Mode()&0111, "executable bit should be set")
info, err = os.Stat(filepath.Join(dest, "readme.txt"))
require.NoError(t, err)
assert.Zero(t, info.Mode()&0111, "executable bit should not be set for regular files")
}
func TestUnpackingInvalidZip(t *testing.T) {
err := Unpacking("/nonexistent/path.zip", t.TempDir(), func(f *zip.File) bool {
return true
})
assert.Error(t, err)
}
func TestUnpackingAllFilesFiltered(t *testing.T) {
dest := t.TempDir()
zipPath := createTestZip(t, map[string]struct {
content string
mode os.FileMode
}{
"a.txt": {content: "a", mode: 0644},
})
err := Unpacking(zipPath, dest, func(f *zip.File) bool {
return false
})
require.NoError(t, err)
entries, err := os.ReadDir(dest)
assert.NoError(t, err)
assert.Empty(t, entries)
}