Files
Naeel 6d66e5b566 feat: multi-language support — PHP, Ruby, Perl, Go (binary-env)
- PHP: ghcr.io/fission/php-env, entrypoint main.php::handler
- Ruby: ghcr.io/fission/ruby-env, entrypoint handler (single-word)
- Perl: ghcr.io/fission/perl-env (version=1), sub {} return value
- Go: ghcr.io/fission/binary-env with pre-compiled binary (shell script placeholder)

Provider changes:
- package_resource: added main.php, main.rb, main.pl to source_dir candidates
- function_resource: relaxed entrypoint validation to allow PHP (::), Ruby, Perl (single-word)
- function_resource_test: updated BadFormat test to reflect new valid formats
2026-04-15 17:01:40 +03:00

82 lines
2.7 KiB
Go

package resources
import (
"encoding/base64"
"testing"
"github.com/hashicorp/terraform-plugin-framework/types"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)
func TestFunctionToUnstructuredAndBack(t *testing.T) {
input := functionResourceModel{
Name: types.StringValue("fn-a"),
Environment: types.StringValue("env-a"),
PackageName: types.StringValue("pkg-a"),
Entrypoint: types.StringValue("main.main"),
}
obj := functionToUnstructured(input, "default")
state := unstructuredToFunctionModel(obj, input)
if state.Name.ValueString() != "fn-a" {
t.Fatalf("unexpected name: %q", state.Name.ValueString())
}
if state.Environment.ValueString() != "env-a" {
t.Fatalf("unexpected environment: %q", state.Environment.ValueString())
}
if state.PackageName.ValueString() != "pkg-a" {
t.Fatalf("unexpected package_name: %q", state.PackageName.ValueString())
}
if state.Entrypoint.ValueString() != "main.main" {
t.Fatalf("unexpected entrypoint: %q", state.Entrypoint.ValueString())
}
invoke, found, err := unstructured.NestedMap(obj.Object, "spec", "InvokeStrategy")
if err != nil || !found || len(invoke) == 0 {
t.Fatalf("InvokeStrategy not set correctly")
}
}
func TestValidateEntrypointAgainstPackageSourcePythonOK(t *testing.T) {
source := "def main():\n return 'ok'\n"
pkg := &unstructured.Unstructured{Object: map[string]interface{}{
"spec": map[string]interface{}{
"deployment": map[string]interface{}{
"literal": base64.StdEncoding.EncodeToString([]byte(source)),
},
},
}}
if err := validateEntrypointAgainstPackageSource("main.main", pkg); err != nil {
t.Fatalf("expected valid entrypoint, got error: %v", err)
}
}
func TestValidateEntrypointAgainstPackageSourcePythonMissing(t *testing.T) {
source := "def another():\n return 'ok'\n"
pkg := &unstructured.Unstructured{Object: map[string]interface{}{
"spec": map[string]interface{}{
"deployment": map[string]interface{}{
"literal": base64.StdEncoding.EncodeToString([]byte(source)),
},
},
}}
if err := validateEntrypointAgainstPackageSource("main.main", pkg); err == nil {
t.Fatalf("expected validation error for missing python function")
}
}
func TestValidateEntrypointAgainstPackageSourceBadFormat(t *testing.T) {
pkg := &unstructured.Unstructured{}
// Пустой entrypoint должен быть ошибкой
if err := validateEntrypointAgainstPackageSource("", pkg); err == nil {
t.Fatalf("expected validation error for empty entrypoint")
}
// Одиночное слово допустимо (Ruby, Perl)
if err := validateEntrypointAgainstPackageSource("handler", pkg); err != nil {
t.Fatalf("unexpected error for single-word entrypoint: %v", err)
}
}