mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-07 15:10:01 +08:00
224 lines
6.3 KiB
Go
224 lines
6.3 KiB
Go
|
|
package golang
|
||
|
|
|
||
|
|
import (
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/assert"
|
||
|
|
"github.com/stretchr/testify/require"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestGetParentPackage(t *testing.T) {
|
||
|
|
// Create a temporary directory for testing
|
||
|
|
tempDir, err := os.MkdirTemp("", "goctl-test-*")
|
||
|
|
require.NoError(t, err)
|
||
|
|
defer os.RemoveAll(tempDir)
|
||
|
|
|
||
|
|
// Test with a directory (should create go.mod with directory name)
|
||
|
|
testDir := filepath.Join(tempDir, "testproject")
|
||
|
|
err = os.MkdirAll(testDir, 0755)
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
parentPkg, rootPkg, err := GetParentPackage(testDir)
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, "testproject", parentPkg)
|
||
|
|
assert.Equal(t, "testproject", rootPkg)
|
||
|
|
|
||
|
|
// Verify go.mod was created with directory name
|
||
|
|
goModPath := filepath.Join(testDir, "go.mod")
|
||
|
|
assert.FileExists(t, goModPath)
|
||
|
|
|
||
|
|
content, err := os.ReadFile(goModPath)
|
||
|
|
require.NoError(t, err)
|
||
|
|
assert.Contains(t, string(content), "module testproject")
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGetParentPackageWithModule(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
name string
|
||
|
|
moduleName string
|
||
|
|
expectedModule string
|
||
|
|
expectedPkg string
|
||
|
|
}{
|
||
|
|
{
|
||
|
|
name: "custom module name",
|
||
|
|
moduleName: "github.com/example/myproject",
|
||
|
|
expectedModule: "github.com/example/myproject",
|
||
|
|
expectedPkg: "github.com/example/myproject",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "simple module name",
|
||
|
|
moduleName: "myservice",
|
||
|
|
expectedModule: "myservice",
|
||
|
|
expectedPkg: "myservice",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "empty module name falls back to directory",
|
||
|
|
moduleName: "",
|
||
|
|
expectedModule: "fallback",
|
||
|
|
expectedPkg: "fallback",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
|
// Create a temporary directory for testing
|
||
|
|
tempDir, err := os.MkdirTemp("", "goctl-test-*")
|
||
|
|
require.NoError(t, err)
|
||
|
|
defer os.RemoveAll(tempDir)
|
||
|
|
|
||
|
|
// Create test directory - use "fallback" name for empty module test
|
||
|
|
testDirName := "fallback"
|
||
|
|
if tt.name != "empty module name falls back to directory" {
|
||
|
|
testDirName = "testdir"
|
||
|
|
}
|
||
|
|
|
||
|
|
testDir := filepath.Join(tempDir, testDirName)
|
||
|
|
err = os.MkdirAll(testDir, 0755)
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
parentPkg, rootPkg, err := GetParentPackageWithModule(testDir, tt.moduleName)
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, tt.expectedPkg, parentPkg)
|
||
|
|
assert.Equal(t, tt.expectedModule, rootPkg)
|
||
|
|
|
||
|
|
// Verify go.mod was created with correct module name
|
||
|
|
goModPath := filepath.Join(testDir, "go.mod")
|
||
|
|
assert.FileExists(t, goModPath)
|
||
|
|
|
||
|
|
content, err := os.ReadFile(goModPath)
|
||
|
|
require.NoError(t, err)
|
||
|
|
assert.Contains(t, string(content), "module "+tt.expectedModule)
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGetParentPackageWithModule_InvalidDir(t *testing.T) {
|
||
|
|
// Test with non-existent directory
|
||
|
|
_, _, err := GetParentPackageWithModule("/non/existent/path", "github.com/example/test")
|
||
|
|
assert.Error(t, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGetParentPackage_InvalidDir(t *testing.T) {
|
||
|
|
// Test with non-existent directory
|
||
|
|
_, _, err := GetParentPackage("/non/existent/path")
|
||
|
|
assert.Error(t, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGetParentPackage_UsesGetParentPackageWithModule(t *testing.T) {
|
||
|
|
// Create a temporary directory for testing
|
||
|
|
tempDir, err := os.MkdirTemp("", "goctl-test-*")
|
||
|
|
require.NoError(t, err)
|
||
|
|
defer os.RemoveAll(tempDir)
|
||
|
|
|
||
|
|
testDir := filepath.Join(tempDir, "testproject")
|
||
|
|
err = os.MkdirAll(testDir, 0755)
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
// Test that GetParentPackage calls GetParentPackageWithModule with empty string
|
||
|
|
parentPkg1, rootPkg1, err1 := GetParentPackage(testDir)
|
||
|
|
require.NoError(t, err1)
|
||
|
|
|
||
|
|
// Clean up go.mod to test again
|
||
|
|
os.Remove(filepath.Join(testDir, "go.mod"))
|
||
|
|
|
||
|
|
parentPkg2, rootPkg2, err2 := GetParentPackageWithModule(testDir, "")
|
||
|
|
require.NoError(t, err2)
|
||
|
|
|
||
|
|
// Should produce identical results
|
||
|
|
assert.Equal(t, parentPkg1, parentPkg2)
|
||
|
|
assert.Equal(t, rootPkg1, rootPkg2)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestBuildParentPackage(t *testing.T) {
|
||
|
|
// This tests the internal buildParentPackage function indirectly
|
||
|
|
// through the public API, as it's a private function
|
||
|
|
|
||
|
|
// Create a temporary directory with subdirectory structure
|
||
|
|
tempDir, err := os.MkdirTemp("", "goctl-test-*")
|
||
|
|
require.NoError(t, err)
|
||
|
|
defer os.RemoveAll(tempDir)
|
||
|
|
|
||
|
|
// Create a nested directory structure
|
||
|
|
projectDir := filepath.Join(tempDir, "myproject")
|
||
|
|
subDir := filepath.Join(projectDir, "internal", "logic")
|
||
|
|
err = os.MkdirAll(subDir, 0755)
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
// Test from root directory
|
||
|
|
parentPkg, rootPkg, err := GetParentPackageWithModule(projectDir, "github.com/example/myproject")
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, "github.com/example/myproject", parentPkg)
|
||
|
|
assert.Equal(t, "github.com/example/myproject", rootPkg)
|
||
|
|
|
||
|
|
// Test from subdirectory
|
||
|
|
parentPkg2, rootPkg2, err := GetParentPackageWithModule(subDir, "github.com/example/myproject")
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, "github.com/example/myproject/internal/logic", parentPkg2)
|
||
|
|
assert.Equal(t, "github.com/example/myproject", rootPkg2)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGetParentPackageWithModule_SpecialCharacters(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
name string
|
||
|
|
moduleName string
|
||
|
|
valid bool
|
||
|
|
}{
|
||
|
|
{
|
||
|
|
name: "domain with path",
|
||
|
|
moduleName: "github.com/user/repo",
|
||
|
|
valid: true,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "domain with version",
|
||
|
|
moduleName: "github.com/user/repo/v2",
|
||
|
|
valid: true,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "private repo",
|
||
|
|
moduleName: "private.example.com/team/project",
|
||
|
|
valid: true,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "simple name with underscore",
|
||
|
|
moduleName: "my_project",
|
||
|
|
valid: true,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "simple name with hyphen",
|
||
|
|
moduleName: "my-project",
|
||
|
|
valid: true,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
|
// Create a temporary directory for testing
|
||
|
|
tempDir, err := os.MkdirTemp("", "goctl-test-*")
|
||
|
|
require.NoError(t, err)
|
||
|
|
defer os.RemoveAll(tempDir)
|
||
|
|
|
||
|
|
testDir := filepath.Join(tempDir, "testdir")
|
||
|
|
err = os.MkdirAll(testDir, 0755)
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
parentPkg, rootPkg, err := GetParentPackageWithModule(testDir, tt.moduleName)
|
||
|
|
|
||
|
|
if tt.valid {
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, tt.moduleName, parentPkg)
|
||
|
|
assert.Equal(t, tt.moduleName, rootPkg)
|
||
|
|
|
||
|
|
// Verify go.mod contains the module name
|
||
|
|
goModPath := filepath.Join(testDir, "go.mod")
|
||
|
|
content, err := os.ReadFile(goModPath)
|
||
|
|
require.NoError(t, err)
|
||
|
|
assert.Contains(t, string(content), "module "+tt.moduleName)
|
||
|
|
} else {
|
||
|
|
assert.Error(t, err)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|