Skip to content

Commit d008cc0

Browse files
committed
chore: add integration tests for pushing image to cache repo
1 parent 3a99f94 commit d008cc0

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

integration/integration_test.go

+80
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import (
3434
"github.com/go-git/go-billy/v5/memfs"
3535
"github.com/google/go-containerregistry/pkg/authn"
3636
"github.com/google/go-containerregistry/pkg/name"
37+
"github.com/google/go-containerregistry/pkg/registry"
38+
"github.com/google/go-containerregistry/pkg/v1/remote"
3739
"github.com/google/go-containerregistry/pkg/v1/remote/transport"
3840
"github.com/stretchr/testify/assert"
3941
"github.com/stretchr/testify/require"
@@ -987,6 +989,84 @@ COPY %s .`, testImageAlpine, inclFile)
987989
}
988990
}
989991

992+
func TestPushImage(t *testing.T) {
993+
t.Parallel()
994+
995+
t.Run("Push", func(t *testing.T) {
996+
t.Parallel()
997+
998+
srv := createGitServer(t, gitServerOptions{
999+
files: map[string]string{
1000+
".devcontainer/Dockerfile": fmt.Sprintf("FROM %s\nRUN date --utc > /root/date.txt", testImageAlpine),
1001+
".devcontainer/devcontainer.json": `{
1002+
"name": "Test",
1003+
"build": {
1004+
"dockerfile": "Dockerfile"
1005+
},
1006+
}`,
1007+
},
1008+
})
1009+
1010+
// Given: an empty registry
1011+
testReg := setupInMemoryRegistry(t)
1012+
testRepo := testReg + "/test"
1013+
ref, err := name.ParseReference(testRepo + ":latest")
1014+
require.NoError(t, err)
1015+
_, err = remote.Image(ref)
1016+
require.ErrorContains(t, err, "NAME_UNKNOWN", "expected image to not be present before build + push")
1017+
1018+
// When: we run envbuilder with PUSH_IMAGE set
1019+
_, err = runEnvbuilder(t, options{env: []string{
1020+
envbuilderEnv("GIT_URL", srv.URL),
1021+
envbuilderEnv("CACHE_REPO", testRepo),
1022+
}})
1023+
require.NoError(t, err)
1024+
1025+
// Then: the image should be pushed
1026+
_, err = remote.Image(ref)
1027+
require.NoError(t, err, "expected image to be present after build + push")
1028+
})
1029+
1030+
t.Run("PushErr", func(t *testing.T) {
1031+
t.Parallel()
1032+
1033+
srv := createGitServer(t, gitServerOptions{
1034+
files: map[string]string{
1035+
".devcontainer/Dockerfile": fmt.Sprintf("FROM %s\nRUN date --utc > /root/date.txt", testImageAlpine),
1036+
".devcontainer/devcontainer.json": `{
1037+
"name": "Test",
1038+
"build": {
1039+
"dockerfile": "Dockerfile"
1040+
},
1041+
}`,
1042+
},
1043+
})
1044+
1045+
// Given: registry is not set up (in this case, not a registry)
1046+
notRegSrv := httptest.NewServer(http.NotFoundHandler())
1047+
notRegURL := strings.TrimPrefix(notRegSrv.URL, "http://") + "/test"
1048+
1049+
// When: we run envbuilder with PUSH_IMAGE set
1050+
_, err := runEnvbuilder(t, options{env: []string{
1051+
envbuilderEnv("GIT_URL", srv.URL),
1052+
envbuilderEnv("CACHE_REPO", notRegURL),
1053+
}})
1054+
// Then: should fail with a descriptive error
1055+
require.ErrorContains(t, err, "unexpected status code 404 Not Found")
1056+
})
1057+
}
1058+
1059+
func setupInMemoryRegistry(t *testing.T) string {
1060+
t.Helper()
1061+
tempDir := t.TempDir()
1062+
testReg := registry.New(registry.WithBlobHandler(registry.NewDiskBlobHandler(tempDir)))
1063+
regSrv := httptest.NewServer(testReg)
1064+
t.Cleanup(func() { regSrv.Close() })
1065+
regSrvURL, err := url.Parse(regSrv.URL)
1066+
require.NoError(t, err)
1067+
return fmt.Sprintf("localhost:%s", regSrvURL.Port())
1068+
}
1069+
9901070
// TestMain runs before all tests to build the envbuilder image.
9911071
func TestMain(m *testing.M) {
9921072
checkTestRegistry()

0 commit comments

Comments
 (0)