217 lines
5.0 KiB
Go
217 lines
5.0 KiB
Go
package e2e
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestE2E_DockerDeployment(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("Skipping Docker deployment tests in short mode")
|
|
}
|
|
|
|
wd, err := os.Getwd()
|
|
if err != nil {
|
|
t.Fatalf("Failed to get working directory: %v", err)
|
|
}
|
|
|
|
workspaceRoot := wd
|
|
for {
|
|
if _, err := os.Stat(filepath.Join(workspaceRoot, "go.mod")); err == nil {
|
|
break
|
|
}
|
|
parent := filepath.Dir(workspaceRoot)
|
|
if parent == workspaceRoot {
|
|
t.Skip("Could not find workspace root")
|
|
return
|
|
}
|
|
workspaceRoot = parent
|
|
}
|
|
|
|
t.Run("dockerfile_exists", func(t *testing.T) {
|
|
dockerfilePath := filepath.Join(workspaceRoot, "Dockerfile")
|
|
if _, err := os.Stat(dockerfilePath); os.IsNotExist(err) {
|
|
t.Skipf("Dockerfile not found at %s", dockerfilePath)
|
|
}
|
|
})
|
|
|
|
t.Run("dockerfile_valid", func(t *testing.T) {
|
|
dockerfilePath := filepath.Join(workspaceRoot, "Dockerfile")
|
|
content, err := os.ReadFile(dockerfilePath)
|
|
if err != nil {
|
|
t.Skipf("Failed to read Dockerfile: %v", err)
|
|
return
|
|
}
|
|
|
|
contentStr := string(content)
|
|
required := []string{
|
|
"FROM",
|
|
"WORKDIR",
|
|
"COPY",
|
|
"RUN",
|
|
"EXPOSE",
|
|
}
|
|
|
|
for _, req := range required {
|
|
if !strings.Contains(contentStr, req) {
|
|
t.Errorf("Dockerfile missing required directive: %s", req)
|
|
}
|
|
}
|
|
})
|
|
|
|
t.Run("service_file_exists", func(t *testing.T) {
|
|
servicePath := filepath.Join(workspaceRoot, "services/goyco.service")
|
|
if _, err := os.Stat(servicePath); os.IsNotExist(err) {
|
|
t.Skipf("Service file not found at %s", servicePath)
|
|
}
|
|
})
|
|
|
|
t.Run("service_file_valid", func(t *testing.T) {
|
|
servicePath := filepath.Join(workspaceRoot, "services/goyco.service")
|
|
content, err := os.ReadFile(servicePath)
|
|
if err != nil {
|
|
t.Skipf("Failed to read service file: %v", err)
|
|
return
|
|
}
|
|
|
|
contentStr := string(content)
|
|
required := []string{
|
|
"[Unit]",
|
|
"[Service]",
|
|
"ExecStart",
|
|
"Restart",
|
|
}
|
|
|
|
for _, req := range required {
|
|
if !strings.Contains(contentStr, req) {
|
|
t.Errorf("Service file missing required section: %s", req)
|
|
}
|
|
}
|
|
})
|
|
|
|
t.Run("static_files_exist", func(t *testing.T) {
|
|
staticDir := filepath.Join(workspaceRoot, "internal/static")
|
|
if _, err := os.Stat(staticDir); os.IsNotExist(err) {
|
|
t.Skipf("Static directory not found at %s", staticDir)
|
|
return
|
|
}
|
|
|
|
requiredFiles := []string{
|
|
"robots.txt",
|
|
}
|
|
|
|
for _, file := range requiredFiles {
|
|
filePath := filepath.Join(staticDir, file)
|
|
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
|
t.Errorf("Required static file not found: %s", filePath)
|
|
}
|
|
}
|
|
})
|
|
|
|
t.Run("templates_exist", func(t *testing.T) {
|
|
templatesDir := filepath.Join(workspaceRoot, "internal/templates")
|
|
if _, err := os.Stat(templatesDir); os.IsNotExist(err) {
|
|
t.Skipf("Templates directory not found at %s", templatesDir)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestE2E_EnvironmentVariables(t *testing.T) {
|
|
t.Run("config_loading", func(t *testing.T) {
|
|
envVars := []string{
|
|
"SERVER_HOST",
|
|
"SERVER_PORT",
|
|
"DATABASE_HOST",
|
|
"DATABASE_PORT",
|
|
"DATABASE_USER",
|
|
"DATABASE_PASSWORD",
|
|
"DATABASE_NAME",
|
|
"JWT_SECRET",
|
|
}
|
|
|
|
for _, envVar := range envVars {
|
|
if os.Getenv(envVar) == "" {
|
|
t.Logf("Environment variable %s not set (this is expected in test environment)", envVar)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestE2E_BinaryExists(t *testing.T) {
|
|
t.Run("binary_builds", func(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("Skipping binary build test in short mode")
|
|
}
|
|
|
|
wd, err := os.Getwd()
|
|
if err != nil {
|
|
t.Skipf("Failed to get working directory: %v", err)
|
|
return
|
|
}
|
|
|
|
workspaceRoot := wd
|
|
for {
|
|
if _, err := os.Stat(filepath.Join(workspaceRoot, "go.mod")); err == nil {
|
|
break
|
|
}
|
|
parent := filepath.Dir(workspaceRoot)
|
|
if parent == workspaceRoot {
|
|
t.Skip("Could not find workspace root")
|
|
return
|
|
}
|
|
workspaceRoot = parent
|
|
}
|
|
|
|
cmd := exec.Command("go", "build", "-o", "/tmp/goyco-test", "./cmd/goyco")
|
|
cmd.Dir = workspaceRoot
|
|
if err := cmd.Run(); err != nil {
|
|
t.Skipf("Failed to build binary: %v", err)
|
|
return
|
|
}
|
|
|
|
if _, err := os.Stat("/tmp/goyco-test"); os.IsNotExist(err) {
|
|
t.Error("Binary was not created")
|
|
} else {
|
|
os.Remove("/tmp/goyco-test")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestE2E_ConfigurationValidation(t *testing.T) {
|
|
t.Run("required_paths", func(t *testing.T) {
|
|
wd, err := os.Getwd()
|
|
if err != nil {
|
|
t.Fatalf("Failed to get working directory: %v", err)
|
|
}
|
|
|
|
workspaceRoot := wd
|
|
for {
|
|
if _, err := os.Stat(filepath.Join(workspaceRoot, "go.mod")); err == nil {
|
|
break
|
|
}
|
|
parent := filepath.Dir(workspaceRoot)
|
|
if parent == workspaceRoot {
|
|
t.Fatalf("Could not find workspace root (go.mod) starting from %s", wd)
|
|
}
|
|
workspaceRoot = parent
|
|
}
|
|
|
|
requiredPaths := []string{
|
|
"cmd/goyco",
|
|
"internal",
|
|
"go.mod",
|
|
"go.sum",
|
|
}
|
|
|
|
for _, path := range requiredPaths {
|
|
fullPath := filepath.Join(workspaceRoot, path)
|
|
if _, err := os.Stat(fullPath); os.IsNotExist(err) {
|
|
t.Errorf("Required path not found: %s (workspace root: %s)", path, workspaceRoot)
|
|
}
|
|
}
|
|
})
|
|
}
|