diff --git a/internal/command/e2etest/provider_functions_test.go b/internal/command/e2etest/provider_functions_test.go new file mode 100644 index 0000000000..038cd691a7 --- /dev/null +++ b/internal/command/e2etest/provider_functions_test.go @@ -0,0 +1,75 @@ +package e2etest + +import ( + "path/filepath" + "strings" + "testing" + + "github.com/opentofu/opentofu/internal/e2e" +) + +func TestFunction_Simple(t *testing.T) { + // This test reaches out to registry.opentofu.org to download the + // test functions provider, so it can only run if network access is allowed + skipIfCannotAccessNetwork(t) + + fixturePath := filepath.Join("testdata", "functions") + tf := e2e.NewBinary(t, tofuBin, fixturePath) + + // tofu init + _, stderr, err := tf.Run("init") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if stderr != "" { + t.Errorf("unexpected stderr output:\n%s", stderr) + } + + _, stderr, err = tf.Run("plan", "-out=fnplan") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if stderr != "" { + t.Errorf("unexpected stderr output:\n%s", stderr) + } + + plan, err := tf.Plan("fnplan") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + + if len(plan.Changes.Outputs) != 1 { + t.Fatalf("expected 1 outputs, got %d", len(plan.Changes.Outputs)) + } + for _, out := range plan.Changes.Outputs { + if !strings.Contains(string(out.After), "Hello Functions") { + t.Fatalf("unexpected plan output: %s", string(out.After)) + } + } +} + +func TestFunction_Error(t *testing.T) { + // This test reaches out to registry.opentofu.org to download the + // test functions provider, so it can only run if network access is allowed + skipIfCannotAccessNetwork(t) + fixturePath := filepath.Join("testdata", "functions-error") + tf := e2e.NewBinary(t, tofuBin, fixturePath) + + // tofu init + _, stderr, err := tf.Run("init") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if stderr != "" { + t.Errorf("unexpected stderr output:\n%s", stderr) + } + + // tofu plan -out=fnplan + _, stderr, err = tf.Run("plan", "-out=fnplan") + if err == nil { + t.Errorf("expected error: %s", err) + } + if !strings.Contains(stderr, "Call to function \"provider::example::error\" failed") { + t.Errorf("unexpected stderr output:\n%s", stderr) + } +} diff --git a/internal/command/e2etest/testdata/functions-error/main.tf b/internal/command/e2etest/testdata/functions-error/main.tf new file mode 100644 index 0000000000..edad8ecafd --- /dev/null +++ b/internal/command/e2etest/testdata/functions-error/main.tf @@ -0,0 +1,12 @@ +terraform { + required_providers { + example = { + source = "opentofu/testfunctions" + version = "1.0.0" + } + } +} + +output "dummy" { + value = provider::example::error() +} diff --git a/internal/command/e2etest/testdata/functions/main.tf b/internal/command/e2etest/testdata/functions/main.tf new file mode 100644 index 0000000000..73ffae356c --- /dev/null +++ b/internal/command/e2etest/testdata/functions/main.tf @@ -0,0 +1,12 @@ +terraform { + required_providers { + example = { + source = "opentofu/testfunctions" + version = "1.0.0" + } + } +} + +output "dummy" { + value = provider::example::echo("Hello Functions") +}