vault/tools/pipeline/internal/pkg/github/templates_test.go
Vault Automation 51f56b8536
[VAULT-39158, VAULT-39159]pipeline: add support for building HVD images (#9012) (#9130)
* [VAULT-39159]: pipeline: add support for querying HCP image service

In order to facilitate testing Vault Enterprise directly in HCP we need
tools to both request an image be built from a candidate build and to
also wait for the image to be available in order to execute test
scenarios with it. This PR adds a few new `pipeline` sub-commands that
can will be used for this purpose.

`pipeline github find workflow-artifact` can be used to find the path of
an artifact that matches the given filter criteria. You'll need to
provide a pull request number, workflow name, and either an exact
artifact name or a pattern. When providing a pattern only the first
match will be returned so make sure your regular expression is robust.

`pipeline hcp get image` will return the image information for an HCP
image. You will need to supply auth via the `HCP_USERNAME` and
`HCP_PASSWORD` environment variables in order to query the image
service. It also takes an enviroment flag so you can query the image
service in different environments.

`pipeline hcp wait image` is like `pipeline hcp get image` except that
it will continue to retry for a given timeout and with a given delay
between requests. In this way it can be used to wait for an image to be
available.

As part of this we also update our Go modules to the latest versions
that are compatible.



* [VAULT-39158]: actions(build-hcp-image): add workflow for building HCP images



* copywrite: add missing headers



* remove unused output



* address feedback



* allow prerelease artifacts



---------

Signed-off-by: Ryan Cragun <me@ryan.ec>
Co-authored-by: Ryan Cragun <me@ryan.ec>
2025-09-04 23:20:25 +00:00

169 lines
4.8 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package github
import (
"errors"
"io"
"testing"
libgithub "github.com/google/go-github/v74/github"
"github.com/stretchr/testify/require"
)
func Test_renderEmbeddedTemplate_backportPRMessage(t *testing.T) {
t.Parallel()
for name, test := range map[string]struct {
expectContains []string
expectNotContains []string
origin *libgithub.PullRequest
attempt *CreateBackportAttempt
}{
"no error": {
expectContains: []string{"original body"},
expectNotContains: []string{"error body"},
origin: &libgithub.PullRequest{
Body: libgithub.Ptr("original body"),
Number: libgithub.Ptr(1234),
HTMLURL: libgithub.Ptr("https://github.com/hashicorp/vault-enterprise/pull/1234"),
MergedBy: &libgithub.User{Login: libgithub.Ptr("my-login")},
},
attempt: &CreateBackportAttempt{
TargetRef: "release/1.19.x",
},
},
"error": {
expectContains: []string{"original body", "error body"},
origin: &libgithub.PullRequest{
Body: libgithub.Ptr("original body"),
Number: libgithub.Ptr(1234),
HTMLURL: libgithub.Ptr("https://github.com/hashicorp/vault-enterprise/pull/1234"),
MergedBy: &libgithub.User{Login: libgithub.Ptr("my-login")},
},
attempt: &CreateBackportAttempt{
TargetRef: "release/1.19.x",
Error: errors.New("error body"),
},
},
} {
t.Run(name, func(t *testing.T) {
t.Parallel()
got, err := renderEmbeddedTemplate("backport-pr-message.tmpl", struct {
OriginPullRequest *libgithub.PullRequest
Attempt *CreateBackportAttempt
}{test.origin, test.attempt})
require.NoError(t, err)
for _, c := range test.expectContains {
require.Containsf(t, got, c, got)
}
for _, nc := range test.expectNotContains {
require.NotContainsf(t, got, nc, got)
}
})
}
}
func Test_renderEmbeddedTemplate_copyPRMessage(t *testing.T) {
t.Parallel()
for name, test := range map[string]struct {
expectContains []string
expectNotContains []string
origin *libgithub.PullRequest
error error
targetRef string
}{
"no error": {
expectContains: []string{"original body"},
expectNotContains: []string{"error body"},
origin: &libgithub.PullRequest{
Body: libgithub.Ptr("original body"),
Number: libgithub.Ptr(1234),
HTMLURL: libgithub.Ptr("https://github.com/hashicorp/vault-enterprise/pull/1234"),
MergedBy: &libgithub.User{Login: libgithub.Ptr("my-login")},
},
targetRef: "release/1.19.x",
error: nil,
},
"error": {
expectContains: []string{"original body", "error body"},
origin: &libgithub.PullRequest{
Body: libgithub.Ptr("original body"),
Number: libgithub.Ptr(1234),
HTMLURL: libgithub.Ptr("https://github.com/hashicorp/vault-enterprise/pull/1234"),
MergedBy: &libgithub.User{Login: libgithub.Ptr("my-login")},
},
targetRef: "release/1.19.x",
error: errors.New("error body"),
},
} {
t.Run(name, func(t *testing.T) {
t.Parallel()
got, err := renderEmbeddedTemplate("copy-pr-message.tmpl", struct {
OriginPullRequest *libgithub.PullRequest
TargetRef string
Error error
}{
test.origin,
test.targetRef,
test.error,
})
require.NoError(t, err)
for _, c := range test.expectContains {
require.Containsf(t, got, c, got)
}
for _, nc := range test.expectNotContains {
require.NotContainsf(t, got, nc, got)
}
})
}
}
func Test_renderEmbeddedTemplateToTmpFile_copyPRComment(t *testing.T) {
t.Parallel()
for name, test := range map[string]struct {
coAuthoredByTrailers []string
originPullRequest *libgithub.PullRequest
targetRef string
}{
"Co-Authored-By": {
coAuthoredByTrailers: []string{
"Co-Authored-By: Jane Doe <jane@example.com>",
"Co-Authored-By: John Doe <john@example.com>",
},
originPullRequest: &libgithub.PullRequest{
Body: libgithub.Ptr("original body"),
Number: libgithub.Ptr(1234),
HTMLURL: libgithub.Ptr("https://github.com/hashicorp/vault-enterprise/pull/1234"),
MergedBy: &libgithub.User{Login: libgithub.Ptr("my-login")},
},
targetRef: "release/1.19.x+ent",
},
} {
t.Run(name, func(t *testing.T) {
t.Parallel()
file, err := renderEmbeddedTemplateToTmpFile("copy-pr-commit-message.tmpl", struct {
CoAuthoredByTrailers []string
OriginPullRequest *libgithub.PullRequest
TargetRef string
}{
test.coAuthoredByTrailers,
test.originPullRequest,
test.targetRef,
})
require.NoError(t, err)
defer file.Close()
bytes, err := io.ReadAll(file)
require.NoError(t, err)
require.NotEmpty(t, bytes)
for _, c := range test.coAuthoredByTrailers {
require.Contains(t, string(bytes), c)
}
})
}
}