Files
zeekayandHanzo Dev 1ab6e799c1 cd: the module is github.com/hanzoai/cd, where it is actually hosted
go.mod still declared `module github.com/hanzoai/deploy` after the repo was
renamed. A Go module path is not cosmetic — it is the resolvable location. So
`go get github.com/hanzoai/cd` could not work, and anything importing this
module had to spell a name that no longer exists at that address. The build log
of v3.6.0 is where it surfaced: the compiler was still emitting
github.com/hanzoai/deploy/cmd/cd/commands.

3541 import paths across 690 .go, 19 .proto, 4 .yaml, 3 .sh, 2 .mod, Procfile
and Makefile. Plus the 62 ghcr.io/hanzoai/deploy image references, moved to
ghcr.io/hanzoai/cd to match hanzo.yml's build target — a distinct string from
the module path, replaced separately so neither could clobber the other.

go mod tidy clean, CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ./... clean.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 21:16:24 -07:00

234 lines
9.4 KiB
Go

package diff_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/hanzoai/cd/pkg/apis/application/v1alpha1"
"github.com/hanzoai/cd/util/cd/diff"
)
func TestIgnoreDiffConfig_HasIgnoreDifference(t *testing.T) {
t.Parallel()
getOverride := func(gk string) map[string]v1alpha1.ResourceOverride {
return map[string]v1alpha1.ResourceOverride{
gk: {
IgnoreDifferences: v1alpha1.OverrideIgnoreDiff{
ManagedFieldsManagers: []string{"manager1", "manager2"},
JQPathExpressions: []string{"some.jq.path.expr"},
JSONPointers: []string{"some.json.pointer"},
},
},
}
}
getIgnoreDiff := func(group, kind, name, namespace string) v1alpha1.ResourceIgnoreDifferences {
return v1alpha1.ResourceIgnoreDifferences{
Group: group,
Kind: kind,
Name: name,
Namespace: namespace,
JSONPointers: []string{"ignore.diff.json.pointer"},
JQPathExpressions: []string{"ignore.diff.jq.path"},
ManagedFieldsManagers: []string{"ignoreDiffManager1", "ignoreDiffManager2"},
}
}
t.Run("will return ignore diffs from resource override", func(t *testing.T) {
// given
t.Parallel()
gk := "apps/Deployment"
override := getOverride(gk)
ignoreDiff := getIgnoreDiff("apps", "Deployment", "", "")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, override)
expectedManagedFields := append(override[gk].IgnoreDifferences.ManagedFieldsManagers, ignoreDiff.ManagedFieldsManagers...)
expectedJSONPointers := append(override[gk].IgnoreDifferences.JSONPointers, ignoreDiff.JSONPointers...)
expectedJQExpression := append(override[gk].IgnoreDifferences.JQPathExpressions, ignoreDiff.JQPathExpressions...)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "app-name", "default")
// then
assert.True(t, ok)
assert.NotNil(t, actual)
assert.Equal(t, expectedManagedFields, actual.ManagedFieldsManagers)
assert.Equal(t, expectedJSONPointers, actual.JSONPointers)
assert.Equal(t, expectedJQExpression, actual.JQPathExpressions)
})
t.Run("will return ignore diffs from resource override with wildcard", func(t *testing.T) {
// given
t.Parallel()
gk := "*/*"
override := getOverride(gk)
ignoreDiff := getIgnoreDiff("apps", "Deployment", "", "")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, override)
expectedManagedFields := append(override[gk].IgnoreDifferences.ManagedFieldsManagers, ignoreDiff.ManagedFieldsManagers...)
expectedJSONPointers := append(override[gk].IgnoreDifferences.JSONPointers, ignoreDiff.JSONPointers...)
expectedJQExpression := append(override[gk].IgnoreDifferences.JQPathExpressions, ignoreDiff.JQPathExpressions...)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "app-name", "default")
// then
assert.True(t, ok)
assert.NotNil(t, actual)
assert.Equal(t, expectedManagedFields, actual.ManagedFieldsManagers)
assert.Equal(t, expectedJSONPointers, actual.JSONPointers)
assert.Equal(t, expectedJQExpression, actual.JQPathExpressions)
})
t.Run("will return ignore diffs from application resource", func(t *testing.T) {
// given
t.Parallel()
ignoreDiff := getIgnoreDiff("apps", "Deployment", "app-name", "default")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, nil)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "app-name", "default")
// then
assert.True(t, ok)
assert.NotNil(t, actual)
assert.Equal(t, ignoreDiff.ManagedFieldsManagers, actual.ManagedFieldsManagers)
assert.Equal(t, ignoreDiff.JSONPointers, actual.JSONPointers)
assert.Equal(t, ignoreDiff.JQPathExpressions, actual.JQPathExpressions)
})
t.Run("will return ignore diffs from application resource with no app name and namespace configured", func(t *testing.T) {
// given
t.Parallel()
ignoreDiff := getIgnoreDiff("apps", "Deployment", "", "")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, nil)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "app-name", "default")
// then
assert.True(t, ok)
assert.NotNil(t, actual)
assert.Equal(t, ignoreDiff.ManagedFieldsManagers, actual.ManagedFieldsManagers)
assert.Equal(t, ignoreDiff.JSONPointers, actual.JSONPointers)
assert.Equal(t, ignoreDiff.JQPathExpressions, actual.JQPathExpressions)
})
t.Run("will return ignore diffs for all resources from group", func(t *testing.T) {
// given
t.Parallel()
ignoreDiff := getIgnoreDiff("apps", "*", "", "")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, nil)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "app-name", "default")
// then
assert.True(t, ok)
require.NotNil(t, actual)
assert.Equal(t, ignoreDiff.ManagedFieldsManagers, actual.ManagedFieldsManagers)
assert.Equal(t, ignoreDiff.JSONPointers, actual.JSONPointers)
assert.Equal(t, ignoreDiff.JQPathExpressions, actual.JQPathExpressions)
})
t.Run("will return ignore diffs for all resources", func(t *testing.T) {
// given
t.Parallel()
ignoreDiff := getIgnoreDiff("*", "*", "", "")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, nil)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "app-name", "default")
// then
assert.True(t, ok)
require.NotNil(t, actual)
assert.Equal(t, ignoreDiff.ManagedFieldsManagers, actual.ManagedFieldsManagers)
assert.Equal(t, ignoreDiff.JSONPointers, actual.JSONPointers)
assert.Equal(t, ignoreDiff.JQPathExpressions, actual.JQPathExpressions)
})
t.Run("no ignore diffs if namespace do not match", func(t *testing.T) {
// given
t.Parallel()
ignoreDiff := getIgnoreDiff("apps", "Deployment", "app-name", "default")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, nil)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "app-name", "another-namespace")
// then
assert.False(t, ok)
require.Nil(t, actual)
})
t.Run("no ignore diffs if name do not match", func(t *testing.T) {
// given
t.Parallel()
ignoreDiff := getIgnoreDiff("apps", "Deployment", "app-name", "default")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, nil)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "another-app", "default")
// then
assert.False(t, ok)
require.Nil(t, actual)
})
t.Run("no ignore diffs if resource do not match", func(t *testing.T) {
// given
t.Parallel()
ignoreDiff := getIgnoreDiff("apps", "Deployment", "app-name", "default")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, nil)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Service", "app-name", "default")
// then
assert.False(t, ok)
require.Nil(t, actual)
})
t.Run("no ignore diffs if group do not match", func(t *testing.T) {
// given
t.Parallel()
ignoreDiff := getIgnoreDiff("apps", "Deployment", "app-name", "default")
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, nil)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("another-group", "Deployment", "app-name", "default")
// then
assert.False(t, ok)
require.Nil(t, actual)
})
t.Run("will merge ignore differences correctly removing duplicated configs", func(t *testing.T) {
// given
t.Parallel()
gk := "*/*"
override := getOverride(gk)
ignoreDiff := getIgnoreDiff("*", "*", "", "")
expectedManagers := append(ignoreDiff.ManagedFieldsManagers, "repeated-manager")
expectedManagers = append(expectedManagers, override[gk].IgnoreDifferences.ManagedFieldsManagers...)
expectedJSONPointers := append(ignoreDiff.JSONPointers, "repeated-jsonpointer")
expectedJSONPointers = append(expectedJSONPointers, override[gk].IgnoreDifferences.JSONPointers...)
expectedJQPath := append(ignoreDiff.JQPathExpressions, "repeated-jqpath")
expectedJQPath = append(expectedJQPath, override[gk].IgnoreDifferences.JQPathExpressions...)
ignoreDiff.ManagedFieldsManagers = append(ignoreDiff.ManagedFieldsManagers, []string{"repeated-manager", "repeated-manager"}...)
ignoreDiff.JSONPointers = append(ignoreDiff.JSONPointers, []string{"repeated-jsonpointer", "repeated-jsonpointer"}...)
ignoreDiff.JQPathExpressions = append(ignoreDiff.JQPathExpressions, []string{"repeated-jqpath", "repeated-jqpath"}...)
ignoreDiffs := []v1alpha1.ResourceIgnoreDifferences{ignoreDiff}
ignoreConfig := diff.NewIgnoreDiffConfig(ignoreDiffs, override)
// when
ok, actual := ignoreConfig.HasIgnoreDifference("apps", "Deployment", "app-name", "default")
// then
assert.True(t, ok)
require.NotNil(t, actual)
assert.ElementsMatch(t, expectedManagers, actual.ManagedFieldsManagers)
assert.ElementsMatch(t, expectedJSONPointers, actual.JSONPointers)
assert.ElementsMatch(t, expectedJQPath, actual.JQPathExpressions)
})
}