Skip to content

Commit 71b4389

Browse files
committed
Add a test fixture
1 parent 7eabaa4 commit 71b4389

File tree

5 files changed

+90
-0
lines changed

5 files changed

+90
-0
lines changed

CLAUDE.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Envbuilder Development Guide
2+
3+
## Build/Test/Lint Commands
4+
- Build: `make build`
5+
- Run tests: `go test -count=1 ./...`
6+
- Run tests with race detection: `go test -race -count=3 ./...`
7+
- Run a single test: `go test -v -count=1 ./path/to/package -run TestName`
8+
- Lint Go code: `make lint/go`
9+
- Lint shell scripts: `make lint/shellcheck`
10+
11+
## Code Style Guidelines
12+
- Imports: Standard Go import grouping (stdlib, external, internal)
13+
- Error handling: Return errors with context using `fmt.Errorf("operation: %w", err)`
14+
- Logging: Use the provided logger (`options.Logger`) with appropriate log levels
15+
- Testing: Use testify for assertions and test setup
16+
- Types: Strong typing with proper interfaces, use Go 1.22+ features
17+
- Naming: Follow Go conventions (camelCase for unexported, PascalCase for exported)
18+
- Documentation: Write clear godoc comments for exported functions and types
19+
- File organization: Keep related functionality in the same package

devcontainer/devcontainer_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,26 @@ func TestParse(t *testing.T) {
4343
require.Equal(t, "Dockerfile", parsed.Build.Dockerfile)
4444
}
4545

46+
func TestParseDirectTarball(t *testing.T) {
47+
t.Parallel()
48+
raw := `{
49+
"build": {
50+
"dockerfile": "Dockerfile",
51+
"context": ".",
52+
},
53+
// Comments here!
54+
"image": "codercom/code-server:latest",
55+
"features": {
56+
"https://github.com/coder/envbuilder/raw/94e6c14f5252ae47fcaf0886e6f3f7db91a75ce8/devcontainer/features/testdata/feature-tarball/devcontainer-feature-hello.tgz": {
57+
"greeting": "Hello"
58+
}
59+
}
60+
}`
61+
parsed, err := devcontainer.Parse([]byte(raw))
62+
require.NoError(t, err)
63+
require.Equal(t, "Dockerfile", parsed.Build.Dockerfile)
64+
}
65+
4666
func TestCompileWithFeatures(t *testing.T) {
4767
t.Parallel()
4868
registry := registrytest.New(t)

devcontainer/features/features_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,25 @@ func TestExtract(t *testing.T) {
5151
_, err := features.Extract(fs, "", "/", ref)
5252
require.ErrorContains(t, err, "id is required")
5353
})
54+
55+
t.Run("LoadTarballArtifacts", func(t *testing.T) {
56+
t.Run("Success", func(t *testing.T) {
57+
t.Parallel()
58+
ref := "https://127.0.0.1:12345/devcontainer-feature-hello.tgz"
59+
fs := memfs.New()
60+
_, err := features.Extract(fs, "", "/", ref)
61+
require.NoError(t, err)
62+
})
63+
t.Run("InvalidName", func(t *testing.T) {
64+
t.Parallel()
65+
66+
ref := "https://127.0.0.1:12345/invalid-name-hello.tgz"
67+
68+
fs := memfs.New()
69+
_, err := features.Extract(fs, "", "/", ref)
70+
require.ErrorContains(t, err, "invalid name")
71+
})
72+
})
5473
t.Run("Success", func(t *testing.T) {
5574
t.Parallel()
5675
registry := registrytest.New(t)
@@ -117,4 +136,11 @@ func TestCompile(t *testing.T) {
117136
require.Equal(t, "FROM scratch AS envbuilder_feature_test\nCOPY --from=coder/test:latest / /", strings.TrimSpace(fromDirective))
118137
require.Equal(t, "WORKDIR /.envbuilder/features/test\nRUN --mount=type=bind,from=envbuilder_feature_test,target=/.envbuilder/features/test,rw _CONTAINER_USER=\"containerUser\" _REMOTE_USER=\"remoteUser\" ./install.sh", strings.TrimSpace(runDirective))
119138
})
139+
// t.Run("Tarball", func(t *testing.T) {
140+
// t.Parallel()
141+
// spec := &features.Spec{}
142+
// _, directive, err := spec.Compile("https://127.0.0.1:12345/devcontainer-feature-hello.tgz", "hello", "/", "containerUser", "remoteUser", false, nil)
143+
// require.NoError(t, err)
144+
// require.Equal(t, "WORKDIR /\nRUN _CONTAINER_USER=\"containerUser\" _REMOTE_USER=\"remoteUser\" ./install.sh", strings.TrimSpace(directive))
145+
// })
120146
}
Binary file not shown.

integration/integration_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,31 @@ func TestBuildFromDevcontainerWithFeatures(t *testing.T) {
574574
require.Equal(t, "hello from test 3!", strings.TrimSpace(test3Output))
575575
}
576576

577+
func TestDirectTarballFeaturePath(t *testing.T) {
578+
t.Parallel()
579+
feature3Spec, err := json.Marshal(features.Spec{
580+
ID: "test3",
581+
Name: "test3",
582+
Version: "1.0.0",
583+
Options: map[string]features.Option{
584+
"grape": {
585+
Type: "string",
586+
},
587+
},
588+
}
589+
spec := `{
590+
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
591+
"features": {
592+
"https://github.com/coder/envbuilder/raw/94e6c14f5252ae47fcaf0886e6f3f7db91a75ce8/devcontainer/features/testdata/feature-tarball/devcontainer-feature-hello.tgz": {
593+
"greeting": "Hello"
594+
}
595+
}
596+
}`
597+
spec := &features.Spec{}
598+
require.Equal(t, "/.envbuilder/feature/test-d8e8fc", spec.Compile()("test"))
599+
}
600+
601+
577602
func TestBuildFromDockerfileAndConfig(t *testing.T) {
578603
t.Parallel()
579604

0 commit comments

Comments
 (0)