Files
go-unifi/codegen/generator_test.go
Mateusz Filipowicz fadc5ada8b feat: add client customization option (#20)
* feat: add client customization

* chore: fix linting

* feat: allow excluding client function by resource name
2025-02-16 23:00:05 +01:00

213 lines
4.9 KiB
Go

package main
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestGenerateCodeFromTemplate(t *testing.T) {
t.Parallel()
tests := []struct {
name string
templateName string
template string
data interface{}
expectedCode string
expectedError bool
errorContains string
}{
{
name: "valid template",
templateName: "simple",
template: `package main
const greeting = "{{.Greeting}}"`,
data: struct{ Greeting string }{Greeting: "hello"},
expectedCode: "const greeting = \"hello\"",
},
{
name: "invalid go code output",
templateName: "invalid_code",
template: `not valid {{ .Value }} go code`,
data: struct{ Value string }{Value: "test"},
expectedError: true,
errorContains: "failed to format source",
},
{
name: "no data",
templateName: "nil_data",
template: `package main`,
data: nil,
expectedCode: "package main",
},
{
name: "complex template",
templateName: "complex",
template: `package main
type {{.TypeName}} struct {
{{range .Fields}}
{{.Name}} {{.Type}}
{{end}}
}`,
data: struct {
TypeName string
Fields []struct{ Name, Type string }
}{
TypeName: "Person",
Fields: []struct{ Name, Type string }{
{Name: "Name", Type: "string"},
{Name: "Age", Type: "int"},
},
},
expectedCode: "type Person struct",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
a := assert.New(t)
code, err := generateCodeFromTemplate(tt.templateName, tt.template, tt.data)
if tt.expectedError {
require.ErrorContains(t, err, tt.errorContains)
} else {
require.NoError(t, err)
}
a.Contains(code, tt.expectedCode)
})
}
}
func TestWriteGeneratedFile(t *testing.T) {
t.Parallel()
tests := []struct {
name string
fileName string
content string
expectedFileName string
expectError bool
}{
{
name: "valid file",
fileName: "TestFile",
content: "package main\n\n// Code content",
expectedFileName: "test_file.generated.go",
expectError: false,
},
{
name: "empty content",
fileName: "EmptyFile",
content: "",
expectedFileName: "empty_file.generated.go",
expectError: true,
},
{
name: "file with spaces",
fileName: "Test File",
content: "package main",
expectedFileName: "test_file.generated.go",
expectError: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
a := assert.New(t)
tempDir := t.TempDir()
fileName, err := writeGeneratedFile(tempDir, tt.fileName, tt.content)
require.NoError(t, err)
a.Equal(tt.expectedFileName, fileName)
expectedFile := filepath.Join(tempDir, tt.expectedFileName)
dataBytes, err := os.ReadFile(expectedFile)
require.NoError(t, err)
a.Equal(tt.content, string(dataBytes))
})
}
}
func TestWriteGeneratedFile_OverrideExistingFile(t *testing.T) {
t.Parallel()
a := assert.New(t)
tempDir := t.TempDir()
fileName := "test"
_, err := writeGeneratedFile(tempDir, fileName, "starting content")
require.NoError(t, err)
_, err = writeGeneratedFile(tempDir, fileName, "updated content")
require.NoError(t, err)
expectedFile := filepath.Join(tempDir, "test.generated.go")
dataBytes, err := os.ReadFile(expectedFile)
require.NoError(t, err)
a.Equal("updated content", string(dataBytes))
}
func TestWriteGeneratedFile_InvalidPath(t *testing.T) {
t.Parallel()
tempDir := t.TempDir()
invalidDir := filepath.Join(tempDir, "nonexistent")
_, err := writeGeneratedFile(invalidDir, "test", "content")
require.Error(t, err)
require.Contains(t, err.Error(), "failed to write file")
}
func TestGenerateCodeFromFields(t *testing.T) {
t.Parallel()
tests := []struct {
name string
fieldsDir string
outDir string
expectedError bool
errorContains string
setupMockFiles func(string)
}{
{
name: "invalid fields directory",
fieldsDir: "nonexistent",
outDir: t.TempDir(),
expectedError: true,
errorContains: "failed to build resources from downloaded fields",
},
{
name: "valid empty fields directory",
fieldsDir: t.TempDir(),
outDir: t.TempDir(),
setupMockFiles: func(dir string) {
// Create empty directory structure
_ = os.MkdirAll(dir, 0o755)
},
expectedError: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if tt.setupMockFiles != nil {
tt.setupMockFiles(tt.fieldsDir)
}
err := generateCode(tt.fieldsDir, tt.outDir, CodeCustomizer{})
if tt.expectedError {
require.Error(t, err)
require.ErrorContains(t, err, tt.errorContains)
} else {
require.NoError(t, err)
}
})
}
}