mirror of
https://github.com/helmfile/helmfile.git
synced 2026-09-30 13:27:18 +02:00
* build(deps): bump golangci/golangci-lint-action from 6 to 7 Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6 to 7. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v6...v7) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> * refactor(.github/workflows/ci.yaml): update golangci-lint version to v2.0.2 Signed-off-by: yxxhero <aiopsclub@163.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: yxxhero <aiopsclub@163.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: yxxhero <aiopsclub@163.com>
257 lines
6.8 KiB
Go
257 lines
6.8 KiB
Go
package policy
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestForbidEnvironmentsWithReleases(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
filePath string
|
|
content []byte
|
|
expectedErr bool
|
|
isStrict bool
|
|
}{
|
|
{
|
|
name: "no error when only releases",
|
|
filePath: "helmfile.yaml",
|
|
content: []byte("releases:\n"),
|
|
expectedErr: false,
|
|
isStrict: false,
|
|
},
|
|
{
|
|
name: "no error when only environments",
|
|
filePath: "helmfile.yaml",
|
|
content: []byte("environments:\n"),
|
|
expectedErr: false,
|
|
isStrict: false,
|
|
},
|
|
{
|
|
name: "no error when has --- between releases and environments",
|
|
filePath: "helmfile.yaml",
|
|
content: []byte("environments:\n---\nreleases:\n"),
|
|
expectedErr: false,
|
|
isStrict: false,
|
|
},
|
|
{
|
|
name: "no error when has --- between releases and environments, and --- on top of helmfile.yaml.gotmpl",
|
|
filePath: "helmfile.yaml",
|
|
content: []byte("---\nenvironments:\n---\nreleases:\n"),
|
|
expectedErr: false,
|
|
isStrict: false,
|
|
},
|
|
{
|
|
name: "error when both releases and environments",
|
|
filePath: "helmfile.yaml",
|
|
content: []byte("environments:\nreleases:\n"),
|
|
expectedErr: true,
|
|
isStrict: true,
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
isStrict, err := forbidEnvironmentsWithReleases(tc.filePath, tc.content)
|
|
require.Equal(t, tc.isStrict, isStrict, "expected isStrict=%v, got=%v", tc.isStrict, isStrict)
|
|
if tc.expectedErr {
|
|
require.ErrorIsf(t, err, ErrEnvironmentsAndReleasesWithinSameYamlPart, "expected error=%v, got=%v", ErrEnvironmentsAndReleasesWithinSameYamlPart, err)
|
|
} else {
|
|
require.NoError(t, err, "expected no error but got error: %v", err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsTopOrderKey(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
item string
|
|
want bool
|
|
}{
|
|
{
|
|
name: "is top order key[bases]",
|
|
item: "bases",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "is top order key[environments]",
|
|
item: "environments",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "is top order key[releases]",
|
|
item: "releases",
|
|
want: true,
|
|
},
|
|
{
|
|
name: "not top order key[helmDefaults]",
|
|
item: "helmDefaults",
|
|
want: false,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := isTopOrderKey(tt.item); got != tt.want {
|
|
t.Errorf("isTopOrderKey() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTopConfigKeysVerifier(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
helmfileContent []byte
|
|
wantErr bool
|
|
wantStrict bool
|
|
}{
|
|
{
|
|
name: "no error when correct order[full items]",
|
|
helmfileContent: []byte("bases:\nenvironments:\nreleases:\n"),
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "no error when correct order 00",
|
|
helmfileContent: []byte("bases:\nva:\nve:\nreleases:\n"),
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "no error when correct order 01",
|
|
helmfileContent: []byte("a:\ne:\n"),
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "no error when correct order 02",
|
|
helmfileContent: []byte("environments:\nbases:\nreleases:\n"),
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "error when not correct order 00",
|
|
helmfileContent: []byte("releases:\nbases:\n"),
|
|
wantErr: true,
|
|
wantStrict: true,
|
|
},
|
|
{
|
|
name: "error when not correct order 01",
|
|
helmfileContent: []byte("releases:\nhelmDefaults:\nbases:\n"),
|
|
wantErr: true,
|
|
wantStrict: true,
|
|
},
|
|
{
|
|
name: "error when not correct order 02",
|
|
helmfileContent: []byte("helmDefaults:\nreleases:\nbases:\n"),
|
|
wantErr: true,
|
|
wantStrict: true,
|
|
},
|
|
{
|
|
name: "error when not correct order 03",
|
|
helmfileContent: []byte("releases:\nva:\nve:\nbases:\n"),
|
|
wantErr: true,
|
|
wantStrict: true,
|
|
},
|
|
{
|
|
name: "error when not correct order 04",
|
|
helmfileContent: []byte("bases:\nreleases:\nenvironments:\n"),
|
|
wantErr: true,
|
|
wantStrict: true,
|
|
},
|
|
{
|
|
name: "no error when only has bases",
|
|
helmfileContent: []byte("bases:\n"),
|
|
},
|
|
{
|
|
name: "no error when only has environments",
|
|
helmfileContent: []byte("environments:\n"),
|
|
},
|
|
{
|
|
name: "no error when only has releases",
|
|
helmfileContent: []byte("releases:\n"),
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
isStrict, err := TopConfigKeysVerifier("helmfile.yaml", tt.helmfileContent)
|
|
require.Equal(t, tt.wantStrict, isStrict, "expected isStrict=%v, got=%v", tt.wantStrict, isStrict)
|
|
if tt.wantErr {
|
|
require.Error(t, err, "expected error, got=%v", err)
|
|
} else {
|
|
require.NoError(t, err, "expected no error but got error: %v", err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTopKeys(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
helmfileContent []byte
|
|
hasSeparator bool
|
|
want []string
|
|
}{
|
|
{
|
|
name: "get top keys",
|
|
helmfileContent: []byte("bases:\nenvironments:\nreleases:\n"),
|
|
want: []string{"bases", "environments", "releases"},
|
|
},
|
|
{
|
|
name: "get top keys with ---",
|
|
helmfileContent: []byte("bases:\n---\nreleases:\n"),
|
|
hasSeparator: true,
|
|
want: []string{"bases", "---", "releases"},
|
|
},
|
|
{
|
|
name: "get top keys with empty array",
|
|
helmfileContent: []byte("bases: []\n---\nreleases: []\n"),
|
|
hasSeparator: true,
|
|
want: []string{"bases", "---", "releases"},
|
|
},
|
|
{
|
|
name: "get empty keys",
|
|
helmfileContent: []byte(""),
|
|
want: nil,
|
|
},
|
|
{
|
|
name: "sub level contains top level key",
|
|
helmfileContent: []byte("bases:\n releases:\n - name: test\n namespace: test\n"),
|
|
want: []string{"bases"},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := TopKeys(tt.helmfileContent, tt.hasSeparator)
|
|
require.Equal(t, tt.want, got, "expected %v, got=%v", tt.want, got)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTopKeys_MalformedLines(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
helmfileContent []byte
|
|
hasSeparator bool
|
|
want []string
|
|
}{
|
|
{
|
|
name: "malformed lines with special characters",
|
|
helmfileContent: []byte("bas@es:\nenvironm*ents:\nrele#ases:\n"),
|
|
want: nil, // This test expects no valid top keys
|
|
},
|
|
{
|
|
name: "malformed lines with incomplete key",
|
|
helmfileContent: []byte("bases\nenvironments:\nreleases:\n"),
|
|
want: []string{"environments", "releases"}, // This test expects only valid top keys
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := TopKeys(tt.helmfileContent, tt.hasSeparator)
|
|
require.Equal(t, tt.want, got, "expected %v, got=%v", tt.want, got)
|
|
})
|
|
}
|
|
}
|