Skip to content

Commit ee2dde5

Browse files
committed
restructure tests
1 parent e2e5826 commit ee2dde5

File tree

2 files changed

+95
-112
lines changed

2 files changed

+95
-112
lines changed

internal/provider/cached_image_resource.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -242,27 +242,29 @@ func (r *CachedImageResource) Read(ctx context.Context, req resource.ReadRequest
242242

243243
// Read Terraform configuration data into the model
244244
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
245-
246245
if resp.Diagnostics.HasError() {
247246
return
248247
}
249248

250-
data.Image = data.BuilderImage
249+
// If the computed attribute 'image' has not been set, then there is nothing
250+
// to read!
251251
if data.Image.IsUnknown() {
252252
return
253253
}
254254

255+
// Attempt to fetch the image manifest.
255256
img, err := getRemoteImage(data.Image.ValueString())
256257
if err != nil {
257-
if !strings.Contains(err.Error(), "NAME_UNKNOWN") {
258+
if !strings.Contains(err.Error(), "MANIFEST_UNKNOWN") {
258259
resp.Diagnostics.AddError("Error checking remote image", err.Error())
259260
return
260261
}
262+
tflog.Debug(ctx, "Remote image does not exist", map[string]any{"ref": data.Image.ValueString()})
261263
// Image does not exist
262264
return
263265
}
264266

265-
// Found image!
267+
// Found image! Get the digest.
266268
digest, err := img.Digest()
267269
if err != nil {
268270
resp.Diagnostics.AddError("Error fetching image digest", err.Error())
@@ -273,15 +275,22 @@ func (r *CachedImageResource) Read(ctx context.Context, req resource.ReadRequest
273275
data.Image = types.StringValue(fmt.Sprintf("%s@%s", data.CacheRepo.ValueString(), digest))
274276
data.Exists = types.BoolValue(true)
275277

278+
// Set the expected environment variables.
276279
for key, elem := range data.ExtraEnv.Elements() {
277280
data.Env = appendKnownEnvToList(data.Env, key, elem)
278281
}
279282

280283
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_CACHE_REPO", data.CacheRepo)
281-
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_CACHE_TTL_DAYS", data.CacheTTLDays)
282284
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_URL", data.GitURL)
283-
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_USERNAME", data.GitUsername)
284-
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_PASSWORD", data.GitPassword)
285+
if !data.CacheTTLDays.IsNull() {
286+
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_CACHE_TTL_DAYS", data.CacheTTLDays)
287+
}
288+
if !data.GitUsername.IsNull() {
289+
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_USERNAME", data.GitUsername)
290+
}
291+
if !data.GitPassword.IsNull() {
292+
data.Env = appendKnownEnvToList(data.Env, "ENVBUILDER_GIT_PASSWORD", data.GitPassword)
293+
}
285294

286295
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
287296
}

internal/provider/cached_image_resource_test.go

+79-105
Original file line numberDiff line numberDiff line change
@@ -15,115 +15,89 @@ import (
1515
)
1616

1717
func TestAccCachedImageDataSource(t *testing.T) {
18-
t.Run("Found", func(t *testing.T) {
19-
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
20-
defer cancel()
21-
files := map[string]string{
22-
".devcontainer/devcontainer.json": `{"build": { "dockerfile": "Dockerfile" }}`,
23-
".devcontainer/Dockerfile": `FROM localhost:5000/test-ubuntu:latest
18+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
19+
defer cancel()
20+
files := map[string]string{
21+
".devcontainer/devcontainer.json": `{"build": { "dockerfile": "Dockerfile" }}`,
22+
".devcontainer/Dockerfile": `FROM localhost:5000/test-ubuntu:latest
2423
RUN date > /date.txt`,
25-
}
24+
}
2625

27-
deps := setup(ctx, t, files)
28-
seedCache(ctx, t, deps)
29-
deps.ExtraEnv["FOO"] = "bar"
30-
resource.Test(t, resource.TestCase{
31-
PreCheck: func() { testAccPreCheck(t) },
32-
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
33-
Steps: []resource.TestStep{
34-
// Plan create only
35-
{
36-
Config: deps.Config(t),
37-
PlanOnly: true,
38-
ExpectNonEmptyPlan: true, // TODO: check plan
39-
},
40-
// Create
41-
{
42-
Config: deps.Config(t),
43-
Check: resource.ComposeAggregateTestCheckFunc(
44-
// Inputs should still be present.
45-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "cache_repo", deps.CacheRepo),
46-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "extra_env.FOO", "bar"),
47-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "git_url", deps.Repo.URL),
48-
// Should be empty
49-
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_username"),
50-
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_password"),
51-
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "cache_ttl_days"),
52-
// Computed
53-
resource.TestCheckResourceAttrWith("envbuilder_cached_image.test", "id", func(value string) error {
54-
// value is enclosed in quotes
55-
value = strings.Trim(value, `"`)
56-
if !strings.HasPrefix(value, "sha256:") {
57-
return fmt.Errorf("expected image %q to have prefix %q", value, deps.CacheRepo)
58-
}
59-
return nil
60-
}),
61-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "exists", "true"),
62-
resource.TestCheckResourceAttrSet("envbuilder_cached_image.test", "image"),
63-
resource.TestCheckResourceAttrWith("envbuilder_cached_image.test", "image", func(value string) error {
64-
// value is enclosed in quotes
65-
value = strings.Trim(value, `"`)
66-
if !strings.HasPrefix(value, deps.CacheRepo) {
67-
return fmt.Errorf("expected image %q to have prefix %q", value, deps.CacheRepo)
68-
}
69-
return nil
70-
}),
71-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.0", "FOO=\"bar\""),
72-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.1", fmt.Sprintf("ENVBUILDER_CACHE_REPO=%q", deps.CacheRepo)),
73-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.2", fmt.Sprintf("ENVBUILDER_GIT_URL=%q", deps.Repo.URL)),
74-
),
75-
},
76-
// Should produce an empty plan after apply
77-
{
78-
Config: deps.Config(t),
79-
PlanOnly: true,
80-
},
26+
deps := setup(ctx, t, files)
27+
deps.ExtraEnv["FOO"] = "bar"
28+
resource.Test(t, resource.TestCase{
29+
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
30+
Steps: []resource.TestStep{
31+
// Initial state: cache has not been seeded.
32+
{
33+
Config: deps.Config(t),
34+
PlanOnly: true,
35+
ExpectNonEmptyPlan: true,
8136
},
82-
})
83-
})
84-
85-
t.Run("NotFound", func(t *testing.T) {
86-
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
87-
defer cancel()
88-
files := map[string]string{
89-
".devcontainer/devcontainer.json": `{"build": { "dockerfile": "Dockerfile" }}`,
90-
".devcontainer/Dockerfile": `FROM localhost:5000/test-ubuntu:latest
91-
RUN date > /date.txt`,
92-
}
93-
deps := setup(ctx, t, files)
94-
deps.ExtraEnv["FOO"] = "bar"
95-
// We do not seed the cache.
96-
resource.Test(t, resource.TestCase{
97-
PreCheck: func() { testAccPreCheck(t) },
98-
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
99-
Steps: []resource.TestStep{
100-
// Should produce a non-empty plan.
101-
{
102-
Config: deps.Config(t),
103-
PlanOnly: true,
104-
ExpectNonEmptyPlan: true,
105-
},
106-
// Should detect that no cached image is present.
107-
{
108-
Config: deps.Config(t),
109-
Check: resource.ComposeAggregateTestCheckFunc(
110-
// Computed values MUST be present.
111-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "id", uuid.Nil.String()),
112-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "exists", "false"),
113-
resource.TestCheckResourceAttrSet("envbuilder_cached_image.test", "env.0"),
114-
// Cached image should be set to the builder image.
115-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "image", deps.BuilderImage),
116-
// Inputs should still be present.
117-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "cache_repo", deps.CacheRepo),
118-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "extra_env.FOO", "bar"),
119-
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "git_url", deps.Repo.URL),
120-
// Should be empty
121-
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_username"),
122-
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_password"),
123-
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "cache_ttl_days"),
124-
),
37+
// Should detect that no cached image is present.
38+
{
39+
Config: deps.Config(t),
40+
Check: resource.ComposeAggregateTestCheckFunc(
41+
// Computed values MUST be present.
42+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "id", uuid.Nil.String()),
43+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "exists", "false"),
44+
resource.TestCheckResourceAttrSet("envbuilder_cached_image.test", "env.0"),
45+
// Cached image should be set to the builder image.
46+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "image", deps.BuilderImage),
47+
// Inputs should still be present.
48+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "cache_repo", deps.CacheRepo),
49+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "extra_env.FOO", "bar"),
50+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "git_url", deps.Repo.URL),
51+
// Should be empty
52+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_username"),
53+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_password"),
54+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "cache_ttl_days"),
55+
),
56+
},
57+
// Now, seed the cache. We should detect the cached image resource.
58+
{
59+
PreConfig: func() {
60+
seedCache(ctx, t, deps)
12561
},
62+
Config: deps.Config(t),
63+
Check: resource.ComposeAggregateTestCheckFunc(
64+
// Inputs should still be present.
65+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "cache_repo", deps.CacheRepo),
66+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "extra_env.FOO", "bar"),
67+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "git_url", deps.Repo.URL),
68+
// Should be empty
69+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_username"),
70+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "git_password"),
71+
resource.TestCheckNoResourceAttr("envbuilder_cached_image.test", "cache_ttl_days"),
72+
// Computed
73+
resource.TestCheckResourceAttrWith("envbuilder_cached_image.test", "id", func(value string) error {
74+
// value is enclosed in quotes
75+
value = strings.Trim(value, `"`)
76+
if !strings.HasPrefix(value, "sha256:") {
77+
return fmt.Errorf("expected image %q to have prefix %q", value, deps.CacheRepo)
78+
}
79+
return nil
80+
}),
81+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "exists", "true"),
82+
resource.TestCheckResourceAttrSet("envbuilder_cached_image.test", "image"),
83+
resource.TestCheckResourceAttrWith("envbuilder_cached_image.test", "image", func(value string) error {
84+
// value is enclosed in quotes
85+
value = strings.Trim(value, `"`)
86+
if !strings.HasPrefix(value, deps.CacheRepo) {
87+
return fmt.Errorf("expected image %q to have prefix %q", value, deps.CacheRepo)
88+
}
89+
return nil
90+
}),
91+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.0", "FOO=\"bar\""),
92+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.1", fmt.Sprintf("ENVBUILDER_CACHE_REPO=%q", deps.CacheRepo)),
93+
resource.TestCheckResourceAttr("envbuilder_cached_image.test", "env.2", fmt.Sprintf("ENVBUILDER_GIT_URL=%q", deps.Repo.URL)),
94+
),
95+
},
96+
// Should produce an empty plan after apply
97+
{
98+
Config: deps.Config(t),
99+
PlanOnly: true,
126100
},
127-
})
101+
},
128102
})
129103
}

0 commit comments

Comments
 (0)