To gitea and beyond, let's go(-yco)
This commit is contained in:
216
internal/e2e/deployment_test.go
Normal file
216
internal/e2e/deployment_test.go
Normal file
@@ -0,0 +1,216 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user