Skip to content

Commit 3eeb537

Browse files
committed
improve tf config generation
1 parent 723553f commit 3eeb537

File tree

2 files changed

+51
-26
lines changed

2 files changed

+51
-26
lines changed

internal/provider/cached_image_resource_test.go

+4-26
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import (
1414
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
1515
)
1616

17-
// TODO: change this to only test for a non-existent image.
18-
// Move the heavy lifting to integration.
1917
func TestAccCachedImageDataSource(t *testing.T) {
2018
t.Run("Found", func(t *testing.T) {
2119
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
@@ -28,23 +26,13 @@ func TestAccCachedImageDataSource(t *testing.T) {
2826

2927
deps := setup(ctx, t, files)
3028
seedCache(ctx, t, deps)
31-
tfCfg := fmt.Sprintf(`resource "envbuilder_cached_image" "test" {
32-
builder_image = %q
33-
workspace_folder = %q
34-
git_url = %q
35-
git_ssh_private_key_path = %q
36-
extra_env = {
37-
"FOO" : "bar"
38-
}
39-
cache_repo = %q
40-
verbose = true
41-
}`, deps.BuilderImage, deps.Repo.Dir, deps.Repo.URL, deps.Repo.Key, deps.CacheRepo)
29+
deps.ExtraEnv["FOO"] = "bar"
4230
resource.Test(t, resource.TestCase{
4331
PreCheck: func() { testAccPreCheck(t) },
4432
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
4533
Steps: []resource.TestStep{
4634
{
47-
Config: tfCfg,
35+
Config: deps.Config(t),
4836
Check: resource.ComposeAggregateTestCheckFunc(
4937
// Inputs should still be present.
5038
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "cache_repo", deps.CacheRepo),
@@ -89,24 +77,14 @@ func TestAccCachedImageDataSource(t *testing.T) {
8977
RUN date > /date.txt`,
9078
}
9179
deps := setup(ctx, t, files)
80+
deps.ExtraEnv["FOO"] = "bar"
9281
// We do not seed the cache.
93-
tfCfg := fmt.Sprintf(`resource "envbuilder_cached_image" "test" {
94-
builder_image = %q
95-
workspace_folder = %q
96-
git_url = %q
97-
git_ssh_private_key_path = %q
98-
extra_env = {
99-
"FOO" : "bar"
100-
}
101-
cache_repo = %q
102-
verbose = true
103-
}`, deps.BuilderImage, deps.Repo.Dir, deps.Repo.URL, deps.Repo.Key, deps.CacheRepo)
10482
resource.Test(t, resource.TestCase{
10583
PreCheck: func() { testAccPreCheck(t) },
10684
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
10785
Steps: []resource.TestStep{
10886
{
109-
Config: tfCfg,
87+
Config: deps.Config(t),
11088
Check: resource.ComposeAggregateTestCheckFunc(
11189
// Computed values MUST be present.
11290
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "id", uuid.Nil.String()),

internal/provider/provider_test.go

+47
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ package provider
66
import (
77
"bufio"
88
"context"
9+
"fmt"
910
"io"
1011
"os"
1112
"slices"
1213
"strings"
1314
"testing"
15+
"text/template"
1416

1517
"github.com/coder/terraform-provider-envbuilder/testutil/registrytest"
1618
"github.com/hashicorp/terraform-plugin-framework/providerserver"
@@ -40,12 +42,56 @@ func testAccPreCheck(t *testing.T) {
4042
// function.
4143
}
4244

45+
// testDependencies contain information about stuff the test depends on.
4346
type testDependencies struct {
4447
BuilderImage string
4548
CacheRepo string
49+
ExtraEnv map[string]string
4650
Repo testGitRepoSSH
4751
}
4852

53+
// Config generates a valid Terraform config file from the dependencies.
54+
func (d *testDependencies) Config(t testing.TB) string {
55+
t.Helper()
56+
57+
tpl := `provider envbuilder {}
58+
resource "envbuilder_cached_image" "test" {
59+
builder_image = {{ quote .BuilderImage }}
60+
cache_repo = {{ quote .CacheRepo }}
61+
extra_env = {{ tfMap .ExtraEnv }}
62+
git_url = {{ quote .Repo.URL }}
63+
git_ssh_private_key_path = {{ quote .Repo.Key }}
64+
verbose = true
65+
workspace_folder = {{ quote .Repo.Dir }}
66+
}`
67+
68+
fm := template.FuncMap{"tfMap": tfMap, "quote": quote}
69+
var sb strings.Builder
70+
tmpl, err := template.New("envbuilder_cached_image").Funcs(fm).Parse(tpl)
71+
require.NoError(t, err)
72+
require.NoError(t, tmpl.Execute(&sb, d))
73+
return sb.String()
74+
}
75+
76+
func tfMap(m map[string]string) string {
77+
var sb strings.Builder
78+
_, _ = sb.WriteRune('{')
79+
_, _ = sb.WriteRune('\n')
80+
for k, v := range m {
81+
_, _ = sb.WriteString(fmt.Sprintf("%q", k))
82+
_, _ = sb.WriteRune(':')
83+
_, _ = sb.WriteRune(' ')
84+
_, _ = sb.WriteString(fmt.Sprintf("%q", v))
85+
_, _ = sb.WriteRune('\n')
86+
}
87+
_, _ = sb.WriteRune('}')
88+
return sb.String()
89+
}
90+
91+
func quote(s string) string {
92+
return fmt.Sprintf("%q", s)
93+
}
94+
4995
func setup(ctx context.Context, t testing.TB, files map[string]string) testDependencies {
5096
t.Helper()
5197

@@ -64,6 +110,7 @@ func setup(ctx context.Context, t testing.TB, files map[string]string) testDepen
64110
return testDependencies{
65111
BuilderImage: envbuilderImageRef,
66112
CacheRepo: reg + "/test",
113+
ExtraEnv: make(map[string]string),
67114
Repo: gitRepo,
68115
}
69116
}

0 commit comments

Comments
 (0)