Files
goyco/internal/e2e/deployment_test.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)
}
}
})
}