Ctrl K
ComunidadGuías…

builder/build/cnb/build_params_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package cnb

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/goodrain/rainbond/builder/build"
	"github.com/goodrain/rainbond/builder/parser/code"
)

func TestValidateSupportedBuildParamsPinsJavaMavenVersion(t *testing.T) {
	re := &build.Request{
		Lang:          code.JavaMaven,
		BuildStrategy: "cnb",
		BuildEnvs: map[string]string{
			"BUILD_RUNTIMES_MAVEN": "4",
			"BP_JAVA_APP_SERVER":   "tomcat-10",
		},
	}
	if err := validateSupportedBuildParams(re); err != nil {
		t.Fatalf("validateSupportedBuildParams returned error: %v", err)
	}
	if got := re.BuildEnvs["BUILD_RUNTIMES_MAVEN"]; got != "3.9.14" {
		t.Fatalf("expected BUILD_RUNTIMES_MAVEN to be pinned to 3.9.14, got %q", got)
	}
	if got := re.BuildEnvs["BP_JAVA_APP_SERVER"]; got != "tomcat" {
		t.Fatalf("expected BP_JAVA_APP_SERVER=tomcat, got %q", got)
	}
	if got := re.BuildEnvs["BUILD_RUNTIMES_SERVER"]; got != "tomcat" {
		t.Fatalf("expected BUILD_RUNTIMES_SERVER=tomcat, got %q", got)
	}
}

func TestValidateSupportedBuildParamsSetsDefaultJavaMavenVersion(t *testing.T) {
	re := &build.Request{
		Lang:          code.JavaMaven,
		BuildStrategy: "cnb",
		BuildEnvs:     map[string]string{},
	}
	if err := validateSupportedBuildParams(re); err != nil {
		t.Fatalf("validateSupportedBuildParams returned error: %v", err)
	}
	if got := re.BuildEnvs["BUILD_RUNTIMES_MAVEN"]; got != "3.9.14" {
		t.Fatalf("expected default BUILD_RUNTIMES_MAVEN=3.9.14, got %q", got)
	}
}

func TestValidateSupportedBuildParamsDefaultsJavaWarServer(t *testing.T) {
	re := &build.Request{
		Lang:          code.JaveWar,
		BuildStrategy: "cnb",
		BuildEnvs:     map[string]string{},
	}
	if err := validateSupportedBuildParams(re); err != nil {
		t.Fatalf("validateSupportedBuildParams returned error: %v", err)
	}
	if got := re.BuildEnvs["BP_JAVA_APP_SERVER"]; got != "tomcat" {
		t.Fatalf("expected default BP_JAVA_APP_SERVER=tomcat, got %q", got)
	}
}

func TestValidateSupportedBuildParamsRejectsUnknownPHPServer(t *testing.T) {
	re := &build.Request{
		Lang:          code.PHP,
		BuildStrategy: "cnb",
		BuildEnvs: map[string]string{
			"BUILD_RUNTIMES_SERVER": "iis",
		},
	}
	if err := validateSupportedBuildParams(re); err == nil {
		t.Fatal("expected unknown php server to fail validation")
	}
}

func TestValidateSupportedBuildParamsDefaultsPHPServerAndComposerVersion(t *testing.T) {
	re := &build.Request{
		Lang:          code.PHP,
		BuildStrategy: "cnb",
		BuildEnvs:     map[string]string{},
	}
	if err := validateSupportedBuildParams(re); err != nil {
		t.Fatalf("validateSupportedBuildParams returned error: %v", err)
	}
	if got := re.BuildEnvs["BUILD_RUNTIMES_SERVER"]; got != "nginx" {
		t.Fatalf("expected BUILD_RUNTIMES_SERVER=nginx, got %q", got)
	}
	if got := re.BuildEnvs["BP_COMPOSER_VERSION"]; got != "2.7.9" {
		t.Fatalf("expected BP_COMPOSER_VERSION=2.7.9, got %q", got)
	}
	if got := re.BuildEnvs["BUILD_COMPOSER_VERSION"]; got != "2.7.9" {
		t.Fatalf("expected BUILD_COMPOSER_VERSION=2.7.9, got %q", got)
	}
}

func TestValidateSupportedBuildParamsSynthesizesPHPBPKeys(t *testing.T) {
	re := &build.Request{
		Lang:          code.PHP,
		BuildStrategy: "cnb",
		BuildEnvs: map[string]string{
			"BUILD_COMPOSER_INSTALL_OPTIONS": "--no-dev",
			"BUILD_PHP_WEB_DIR":              "public",
		},
	}
	if err := validateSupportedBuildParams(re); err != nil {
		t.Fatalf("validateSupportedBuildParams returned error: %v", err)
	}
	if got := re.BuildEnvs["BP_COMPOSER_INSTALL_OPTIONS"]; got != "--no-dev" {
		t.Fatalf("expected BP_COMPOSER_INSTALL_OPTIONS=--no-dev, got %q", got)
	}
	if got := re.BuildEnvs["BP_PHP_WEB_DIR"]; got != "public" {
		t.Fatalf("expected BP_PHP_WEB_DIR=public, got %q", got)
	}
}

func TestValidateSupportedBuildParamsDetectsPythonManager(t *testing.T) {
	dir := t.TempDir()
	re := &build.Request{
		Lang:          code.Python,
		BuildStrategy: "cnb",
		SourceDir:     dir,
		BuildEnvs: map[string]string{
			"BUILD_PYTHON_PACKAGE_MANAGER":         "pipenv",
			"BUILD_PYTHON_PACKAGE_MANAGER_VERSION": "2024.4.1",
		},
	}
	if err := validateSupportedBuildParams(re); err != nil {
		t.Fatalf("validateSupportedBuildParams returned error: %v", err)
	}
	if got := re.BuildEnvs["BUILD_PYTHON_PACKAGE_MANAGER"]; got != "pipenv" {
		t.Fatalf("expected BUILD_PYTHON_PACKAGE_MANAGER=pipenv, got %q", got)
	}
	if got := re.BuildEnvs["BP_PIPENV_VERSION"]; got != "2024.4.1" {
		t.Fatalf("expected BP_PIPENV_VERSION to be synthesized, got %q", got)
	}
}

func TestValidateSupportedBuildParamsDetectsPythonManagerFromFiles(t *testing.T) {
	dir := t.TempDir()
	if err := os.WriteFile(filepath.Join(dir, "Pipfile"), []byte("[packages]\nflask='*'\n"), 0644); err != nil {
		t.Fatalf("write Pipfile: %v", err)
	}
	re := &build.Request{
		Lang:          code.Python,
		BuildStrategy: "cnb",
		SourceDir:     dir,
		BuildEnvs:     map[string]string{},
	}
	if err := validateSupportedBuildParams(re); err != nil {
		t.Fatalf("validateSupportedBuildParams returned error: %v", err)
	}
	if got := re.BuildEnvs["BUILD_PYTHON_PACKAGE_MANAGER"]; got != "pipenv" {
		t.Fatalf("expected auto-detected package manager pipenv, got %q", got)
	}
}

func TestValidateSupportedBuildParamsDefaultsCondaSolver(t *testing.T) {
	dir := t.TempDir()
	if err := os.WriteFile(filepath.Join(dir, "environment.yml"), []byte("name: demo\n"), 0644); err != nil {
		t.Fatalf("write environment.yml: %v", err)
	}
	re := &build.Request{
		Lang:          code.Python,
		BuildStrategy: "cnb",
		SourceDir:     dir,
		BuildEnvs:     map[string]string{},
	}
	if err := validateSupportedBuildParams(re); err != nil {
		t.Fatalf("validateSupportedBuildParams returned error: %v", err)
	}
	if got := re.BuildEnvs["BUILD_PYTHON_PACKAGE_MANAGER"]; got != "conda" {
		t.Fatalf("expected auto-detected package manager conda, got %q", got)
	}
	if got := re.BuildEnvs["BP_CONDA_SOLVER"]; got != "mamba" {
		t.Fatalf("expected default BP_CONDA_SOLVER=mamba, got %q", got)
	}
}

func TestResolvePlatformBindings(t *testing.T) {
	t.Run("uses explicit maven setting", func(t *testing.T) {
		ctrl := &mockJobCtrl{
			languageBuildSettings: map[string]string{
				"team-maven": "team-maven",
			},
		}
		builder := newTestBuilder(ctrl)
		re := &build.Request{
			Lang: code.JavaMaven,
			BuildEnvs: map[string]string{
				"BUILD_MAVEN_SETTING_NAME": "team-maven",
			},
		}
		bindings, err := builder.resolvePlatformBindings(re)
		if err != nil {
			t.Fatalf("resolvePlatformBindings returned error: %v", err)
		}
		if len(bindings) != 1 || bindings[0].ConfigMapName != "team-maven" {
			t.Fatalf("unexpected bindings: %+v", bindings)
		}
		if got := re.BuildEnvs["BP_MAVEN_SETTINGS_PATH"]; got != "/platform/bindings/team-maven/settings.xml" {
			t.Fatalf("expected BP_MAVEN_SETTINGS_PATH to match mounted binding path, got %q", got)
		}
	})

	t.Run("uses default maven setting when explicit value is empty", func(t *testing.T) {
		ctrl := &mockJobCtrl{
			defaultLanguageBuildSetting: "default-maven",
		}
		builder := newTestBuilder(ctrl)
		re := &build.Request{Lang: code.JavaMaven, BuildEnvs: map[string]string{}}
		bindings, err := builder.resolvePlatformBindings(re)
		if err != nil {
			t.Fatalf("resolvePlatformBindings returned error: %v", err)
		}
		if len(bindings) != 1 || bindings[0].ConfigMapName != "default-maven" {
			t.Fatalf("unexpected bindings: %+v", bindings)
		}
		if got := re.BuildEnvs["BP_MAVEN_SETTINGS_PATH"]; got != "/platform/bindings/default-maven/settings.xml" {
			t.Fatalf("expected BP_MAVEN_SETTINGS_PATH to match mounted binding path, got %q", got)
		}
	})

	t.Run("uses explicit nuget config for dotnet", func(t *testing.T) {
		ctrl := &mockJobCtrl{
			languageBuildSettings: map[string]string{
				"nuget-private": "nuget-private",
			},
		}
		builder := newTestBuilder(ctrl)
		re := &build.Request{
			Lang: code.NetCore,
			BuildEnvs: map[string]string{
				"BUILD_NUGET_CONFIG_NAME": "nuget-private",
			},
		}
		bindings, err := builder.resolvePlatformBindings(re)
		if err != nil {
			t.Fatalf("resolvePlatformBindings returned error: %v", err)
		}
		if len(bindings) != 1 || bindings[0].ConfigMapName != "nuget-private" {
			t.Fatalf("unexpected bindings: %+v", bindings)
		}
		if bindings[0].Type != "nugetconfig" {
			t.Fatalf("expected nugetconfig binding type, got %q", bindings[0].Type)
		}
		if bindings[0].ConfigMapKey != "nuget.config" || bindings[0].TargetFile != "nuget.config" {
			t.Fatalf("unexpected nuget binding files: %+v", bindings[0])
		}
	})
}