builder/build/cnb/build_params_test.go
Rama main · réplica de lectura del repositorio original.
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])
}
})
}