func/buildpacks/builder_test.go

104 lines
2.7 KiB
Go

package buildpacks
import (
"context"
"testing"
pack "github.com/buildpacks/pack/pkg/client"
fn "knative.dev/kn-plugin-func"
"knative.dev/kn-plugin-func/builders"
)
// Test_BuilderImageDefault ensures that a Function bing built which does not
// define a Builder Image will get the internally-defined default.
func Test_BuilderImageDefault(t *testing.T) {
var (
i = &mockImpl{}
b = NewBuilder(WithImpl(i))
f = fn.Function{Runtime: "node"}
)
i.BuildFn = func(ctx context.Context, opts pack.BuildOptions) error {
expected := DefaultBuilderImages["node"]
if opts.Builder != expected {
t.Fatalf("expected pack builder image '%v', got '%v'", expected, opts.Builder)
}
return nil
}
if err := b.Build(context.Background(), f); err != nil {
t.Fatal(err)
}
}
// Test_BuilderImageConfigurable ensures that the builder will use the builder
// image defined on the given Function if provided.
func Test_BuilderImageConfigurable(t *testing.T) {
var (
i = &mockImpl{} // mock underlying implementation
b = NewBuilder( // Func Builder logic
WithName(builders.Pack), WithImpl(i))
f = fn.Function{ // Function with a builder image set
Runtime: "node",
Build: fn.BuildSpec{
BuilderImages: map[string]string{
builders.Pack: "example.com/user/builder-image",
},
},
}
)
i.BuildFn = func(ctx context.Context, opts pack.BuildOptions) error {
expected := "example.com/user/builder-image"
if opts.Builder != expected {
t.Fatalf("expected builder image for node to be '%v', got '%v'", expected, opts.Builder)
}
return nil
}
if err := b.Build(context.Background(), f); err != nil {
t.Fatal(err)
}
}
// Test_BuildEnvs ensures that build environment variables are interpolated and
// provided in Build Options
func Test_BuildEnvs(t *testing.T) {
t.Setenv("INTERPOLATE_ME", "interpolated")
var (
envName = "NAME"
envValue = "{{ env:INTERPOLATE_ME }}"
f = fn.Function{
Runtime: "node",
Build: fn.BuildSpec{
BuildEnvs: []fn.Env{{Name: &envName, Value: &envValue}},
},
}
i = &mockImpl{}
b = NewBuilder(WithImpl(i))
)
i.BuildFn = func(ctx context.Context, opts pack.BuildOptions) error {
for k, v := range opts.Env {
if k == envName && v == "interpolated" {
return nil // success!
} else if k == envName && v == envValue {
t.Fatal("build env was not interpolated")
}
}
t.Fatal("build envs not added to builder options")
return nil
}
if err := b.Build(context.Background(), f); err != nil {
t.Fatal(err)
}
}
type mockImpl struct {
BuildFn func(context.Context, pack.BuildOptions) error
}
func (i mockImpl) Build(ctx context.Context, opts pack.BuildOptions) error {
return i.BuildFn(ctx, opts)
}