test: replace assert.Contains with assert.ErrorContains for better error handling

Signed-off-by: Matthieu MOREL <matthieu.morel35@gmail.com>
pull/32294/head
Matthieu MOREL 3 days ago
parent f34ad6c337
commit 4ade4a5495

@ -92,11 +92,7 @@ func TestValidateValuesFileSchemaFailure(t *testing.T) {
valfile := filepath.Join(tmpdir, "values.yaml")
err := validateValuesFile(valfile, map[string]any{}, false)
if err == nil {
t.Fatal("expected values file to fail parsing")
}
assert.Contains(t, err.Error(), "- at '/username': got number, want string")
assert.ErrorContains(t, err, "- at '/username': got number, want string")
}
func TestValidateValuesFileSchemaFailureButWithSkipSchemaValidation(t *testing.T) {
@ -167,7 +163,7 @@ func TestValidateValuesFile(t *testing.T) {
case err == nil && tt.errorMessage != "":
t.Error("expected values file to fail parsing")
case err != nil && tt.errorMessage != "":
assert.Contains(t, err.Error(), tt.errorMessage, "Failed with unexpected error")
assert.ErrorContains(t, err, tt.errorMessage, "Failed with unexpected error")
}
})
}

@ -49,8 +49,7 @@ func TestUnmarshaConfig(t *testing.T) {
config, err := unmarshalConfig("cli/v1", map[string]any{
"invalid field": "foo",
})
require.Error(t, err)
assert.Contains(t, err.Error(), "field not found")
require.ErrorContains(t, err, "field not found")
assert.Nil(t, config)
}
}

@ -295,8 +295,7 @@ command: echo test`,
m, err := loadMetadataLegacy([]byte(tc.yaml))
if tc.expectError {
require.Error(t, err)
assert.Contains(t, err.Error(), tc.errorContains)
require.ErrorContains(t, err, tc.errorContains)
t.Logf("Legacy error (validation catches empty name): %v", err)
if tc.logNote != "" {
t.Log(tc.logNote)
@ -342,8 +341,7 @@ runtime: subprocess
m, err := loadMetadataV1([]byte(tc.yaml))
if tc.expectError {
require.Error(t, err)
assert.Contains(t, err.Error(), tc.errorContains)
require.ErrorContains(t, err, tc.errorContains)
t.Logf("V1 error (strict unmarshalling): %v", err)
} else {
require.NoError(t, err)

@ -19,7 +19,6 @@ import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestMetadataV1ValidateVersion(t *testing.T) {
@ -79,8 +78,7 @@ func TestMetadataV1ValidateVersion(t *testing.T) {
m := base()
m.Version = tc.version
err := m.Validate()
require.Error(t, err)
assert.Contains(t, err.Error(), tc.errMsg)
assert.ErrorContains(t, err, tc.errMsg)
})
}
}

@ -358,8 +358,7 @@ func TestConfiguration_Init(t *testing.T) {
actualErr := cfg.Init(nil, "default", tt.helmDriver)
if tt.expectErr {
require.Error(t, actualErr)
assert.Contains(t, actualErr.Error(), tt.errMsg)
require.ErrorContains(t, actualErr, tt.errMsg)
} else {
require.NoError(t, actualErr)
assert.IsType(t, tt.expectedDriverType, cfg.Releases.Driver)
@ -1575,8 +1574,7 @@ data:
merged, err := annotateAndMerge(tt.files)
if tt.expectedError != "" {
require.Error(t, err)
assert.Contains(t, err.Error(), tt.expectedError)
assert.ErrorContains(t, err, tt.expectedError)
} else {
require.NoError(t, err)
assert.NotNil(t, merged)
@ -1738,8 +1736,7 @@ data:
files, err := splitAndDeannotate(tt.input, "test")
if tt.expectedError != "" {
require.Error(t, err)
assert.Contains(t, err.Error(), tt.expectedError)
require.ErrorContains(t, err, tt.expectedError)
} else {
require.NoError(t, err)
assert.Len(t, files, len(tt.expectedFiles))
@ -1874,8 +1871,7 @@ func TestRenderResources_PostRenderer_Error(t *testing.T) {
mockPR, false, false, false, PostRenderStrategyCombined,
)
require.Error(t, err)
assert.Contains(t, err.Error(), "error while running post render on files")
assert.ErrorContains(t, err, "error while running post render on files")
}
func TestRenderResources_PostRenderer_MergeError(t *testing.T) {
@ -1903,7 +1899,7 @@ func TestRenderResources_PostRenderer_MergeError(t *testing.T) {
)
require.Error(t, err)
assert.Contains(t, err.Error(), "error merging manifests")
assert.ErrorContains(t, err, "error merging manifests")
}
func TestRenderResources_PostRenderer_SplitError(t *testing.T) {
@ -1924,8 +1920,7 @@ func TestRenderResources_PostRenderer_SplitError(t *testing.T) {
mockPR, false, false, false, PostRenderStrategyCombined,
)
require.Error(t, err)
assert.Contains(t, err.Error(), "error while parsing post rendered output: error parsing YAML: MalformedYAMLError:")
assert.ErrorContains(t, err, "error while parsing post rendered output: error parsing YAML: MalformedYAMLError:")
}
func TestRenderResources_PostRenderer_Integration(t *testing.T) {
@ -2284,9 +2279,8 @@ metadata:
mockPR, false, false, false, PostRenderStrategy("bogus"),
)
require.Error(t, err)
assert.Contains(t, err.Error(), "unknown post-render strategy")
assert.Contains(t, err.Error(), "bogus")
require.ErrorContains(t, err, "unknown post-render strategy")
assert.ErrorContains(t, err, "bogus")
}
func TestDetermineReleaseSSAApplyMethod(t *testing.T) {

@ -443,8 +443,7 @@ func TestGetMetadata_Run_UnreachableKubeClient(t *testing.T) {
client := NewGetMetadata(cfg)
_, err := client.Run("test-release")
require.Error(t, err)
assert.Contains(t, err.Error(), "connection refused")
assert.ErrorContains(t, err, "connection refused")
}
func TestGetMetadata_Run_ReleaseNotFound(t *testing.T) {
@ -452,8 +451,7 @@ func TestGetMetadata_Run_ReleaseNotFound(t *testing.T) {
client := NewGetMetadata(cfg)
_, err := client.Run("non-existent-release")
require.Error(t, err)
assert.Contains(t, err.Error(), "not found")
assert.ErrorContains(t, err, "not found")
}
func TestGetMetadata_Run_EmptyAppVersion(t *testing.T) {

@ -177,8 +177,7 @@ func TestGetValues_Run_UnreachableKubeClient(t *testing.T) {
client := NewGetValues(cfg)
_, err := client.Run("test-release")
require.Error(t, err)
assert.Contains(t, err.Error(), "connection refused")
assert.ErrorContains(t, err, "connection refused")
}
func TestGetValues_Run_ReleaseNotFound(t *testing.T) {
@ -186,8 +185,7 @@ func TestGetValues_Run_ReleaseNotFound(t *testing.T) {
client := NewGetValues(cfg)
_, err := client.Run("non-existent-release")
require.Error(t, err)
assert.Contains(t, err.Error(), "not found")
assert.ErrorContains(t, err, "not found")
}
func TestGetValues_Run_NilConfig(t *testing.T) {

@ -334,10 +334,7 @@ func TestInstallRelease_NoName(t *testing.T) {
instAction.ReleaseName = ""
vals := map[string]any{}
_, err := instAction.Run(buildChart(), vals)
if err == nil {
t.Fatal("expected failure when no name is specified")
}
assert.Contains(t, err.Error(), "no name provided")
assert.ErrorContains(t, err, "no name provided")
}
func TestInstallRelease_WithNotes(t *testing.T) {

@ -231,8 +231,7 @@ func TestGetContainerLogs_PodNotFound(t *testing.T) {
var buf bytes.Buffer
err := rt.getContainerLogs(&buf, client, "nonexistent-pod")
require.Error(t, err)
assert.Contains(t, err.Error(), "unable to get pod nonexistent-pod")
assert.ErrorContains(t, err, "unable to get pod nonexistent-pod")
}
func TestGetContainerLogs_OutputHeaderFormat(t *testing.T) {

@ -331,8 +331,7 @@ func TestSetMetadataVisitor(t *testing.T) {
// Add a new resource that is missing ownership metadata and verify error
resources.Append(newDeploymentResource("baz", "default", ""))
err = resources.Visit(setMetadataVisitor("rel-b", "ns-a", false))
require.Error(t, err)
assert.Contains(t, err.Error(), `Deployment "baz" in namespace "" cannot be owned`)
assert.ErrorContains(t, err, `Deployment "baz" in namespace "" cannot be owned`)
}
func TestValidateNameAndGenerateName(t *testing.T) {
@ -369,8 +368,7 @@ func TestValidateNameAndGenerateName(t *testing.T) {
skip, err := validateNameAndGenerateName(tc.info)
if tc.wantErr {
require.Error(t, err)
assert.Contains(t, err.Error(), tc.errContains)
require.ErrorContains(t, err, tc.errContains)
} else {
require.NoError(t, err)
}

@ -92,11 +92,7 @@ func TestValidateValuesFileSchemaFailure(t *testing.T) {
valfile := filepath.Join(tmpdir, "values.yaml")
err := validateValuesFile(valfile, map[string]any{}, false)
if err == nil {
t.Fatal("expected values file to fail parsing")
}
assert.Contains(t, err.Error(), "- at '/username': got number, want string")
assert.ErrorContains(t, err, "- at '/username': got number, want string")
}
func TestValidateValuesFileSchemaFailureButWithSkipSchemaValidation(t *testing.T) {
@ -167,7 +163,7 @@ func TestValidateValuesFile(t *testing.T) {
case err == nil && tt.errorMessage != "":
t.Error("expected values file to fail parsing")
case err != nil && tt.errorMessage != "":
assert.Contains(t, err.Error(), tt.errorMessage, "Failed with unexpected error")
assert.ErrorContains(t, err, tt.errorMessage, "Failed with unexpected error")
}
})
}

@ -258,8 +258,7 @@ func TestReadFileErrorMessages(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
_, err := readFile(tt.filePath, tt.providers)
require.Error(t, err)
assert.Contains(t, err.Error(), tt.wantErr)
require.ErrorContains(t, err, tt.wantErr)
})
}
}

@ -755,8 +755,7 @@ func TestWriteLock(t *testing.T) {
require.NoError(t, os.Symlink(dummyFile, lockfilePath))
err = writeLock(dir, lock, false)
require.Error(t, err)
assert.Contains(t, err.Error(), "the Chart.lock file is a symlink to")
assert.ErrorContains(t, err, "the Chart.lock file is a symlink to")
})
t.Run("chart path is not a directory", func(t *testing.T) {

@ -539,8 +539,7 @@ func TestUpdate(t *testing.T) {
ClientUpdateOptionUpgradeClientSideFieldManager(true))
if tc.ExpectedError != "" {
require.Error(t, err)
require.Contains(t, err.Error(), tc.ExpectedError)
require.ErrorContains(t, err, tc.ExpectedError)
} else {
require.NoError(t, err)
}
@ -558,7 +557,7 @@ func TestUpdate(t *testing.T) {
if tc.ExpectedError != "" {
require.Error(t, err)
require.Contains(t, err.Error(), tc.ExpectedError)
require.ErrorContains(t, err, tc.ExpectedError)
} else {
require.NoError(t, err)
}
@ -1939,7 +1938,7 @@ func TestClientWaitContextCancellationLegacy(t *testing.T) {
err = c.Wait(resources, time.Second*30)
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled", "expected context canceled error, got: %v", err)
assert.ErrorContains(t, err, "context canceled", "expected context canceled error, got: %v", err)
}
func TestClientWaitWithJobsContextCancellationLegacy(t *testing.T) {
@ -1993,8 +1992,7 @@ func TestClientWaitWithJobsContextCancellationLegacy(t *testing.T) {
assert.Len(t, result.Created, 1, "expected 1 resource created, got %d", len(result.Created))
err = c.WaitWithJobs(resources, time.Second*30)
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled", "expected context canceled error, got: %v", err)
assert.ErrorContains(t, err, "context canceled", "expected context canceled error, got: %v", err)
}
func TestClientWaitForDeleteContextCancellationLegacy(t *testing.T) {
@ -2058,8 +2056,7 @@ func TestClientWaitForDeleteContextCancellationLegacy(t *testing.T) {
}
err = c.WaitForDelete(resources, time.Second*30)
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled", "expected context canceled error, got: %v", err)
assert.ErrorContains(t, err, "context canceled", "expected context canceled error, got: %v", err)
}
func TestClientWaitContextNilDoesNotPanic(t *testing.T) {
@ -2166,8 +2163,7 @@ func TestClientWaitContextPreCancelledLegacy(t *testing.T) {
assert.Len(t, result.Created, 1, "expected 1 resource created, got %d", len(result.Created))
err = c.Wait(resources, time.Second*30)
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled", "expected context canceled error, got: %v", err)
assert.ErrorContains(t, err, "context canceled", "expected context canceled error, got: %v", err)
}
func TestClientWaitContextCancellationStatusWatcher(t *testing.T) {
@ -2193,8 +2189,7 @@ metadata:
cancel()
err = c.Wait(resources, time.Second*30)
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled", "expected context canceled error, got: %v", err)
assert.ErrorContains(t, err, "context canceled", "expected context canceled error, got: %v", err)
}
func TestClientWaitWithJobsContextCancellationStatusWatcher(t *testing.T) {
@ -2220,8 +2215,7 @@ metadata:
cancel()
err = c.WaitWithJobs(resources, time.Second*30)
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled", "expected context canceled error, got: %v", err)
assert.ErrorContains(t, err, "context canceled", "expected context canceled error, got: %v", err)
}
func TestClientWaitForDeleteContextCancellationStatusWatcher(t *testing.T) {
@ -2252,8 +2246,7 @@ status:
cancel()
err = c.WaitForDelete(resources, time.Second*30)
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled", "expected context canceled error, got: %v", err)
assert.ErrorContains(t, err, "context canceled", "expected context canceled error, got: %v", err)
}
// testStatusReader is a custom status reader for testing that returns a configurable status.

@ -350,7 +350,7 @@ func TestStatusWaitForDelete(t *testing.T) {
if tt.expectErrs != nil {
require.Error(t, err)
for _, expectedErrStr := range tt.expectErrs {
assert.Contains(t, err.Error(), expectedErrStr)
require.ErrorContains(t, err, expectedErrStr)
}
return
}
@ -441,7 +441,7 @@ func TestStatusWait(t *testing.T) {
if tt.expectErrStrs != nil {
require.Error(t, err)
for _, expectedErrStr := range tt.expectErrStrs {
assert.Contains(t, err.Error(), expectedErrStr)
require.ErrorContains(t, err, expectedErrStr)
}
return
}
@ -498,7 +498,7 @@ func TestWaitForJobComplete(t *testing.T) {
if tt.expectErrStrs != nil {
require.Error(t, err)
for _, expectedErrStr := range tt.expectErrStrs {
assert.Contains(t, err.Error(), expectedErrStr)
require.ErrorContains(t, err, expectedErrStr)
}
return
}
@ -561,7 +561,7 @@ func TestWatchForReady(t *testing.T) {
if tt.expectErrStrs != nil {
require.Error(t, err)
for _, expectedErrStr := range tt.expectErrStrs {
assert.Contains(t, err.Error(), expectedErrStr)
require.ErrorContains(t, err, expectedErrStr)
}
return
}
@ -679,7 +679,7 @@ func TestStatusWaitMultipleNamespaces(t *testing.T) {
if tt.expectErrStrs != nil {
require.Error(t, err)
for _, expectedErrStr := range tt.expectErrStrs {
assert.Contains(t, err.Error(), expectedErrStr)
require.ErrorContains(t, err, expectedErrStr)
}
return
}
@ -861,7 +861,7 @@ func TestStatusWaitRestrictedRBAC(t *testing.T) {
if tt.expectErrs != nil {
require.Error(t, err)
for _, expectedErr := range tt.expectErrs {
assert.Contains(t, err.Error(), expectedErr.Error())
require.ErrorContains(t, err, expectedErr.Error())
}
return
}
@ -969,7 +969,7 @@ func TestStatusWaitMixedResources(t *testing.T) {
if tt.expectErrs != nil {
require.Error(t, err)
for _, expectedErr := range tt.expectErrs {
assert.Contains(t, err.Error(), expectedErr.Error())
require.ErrorContains(t, err, expectedErr.Error())
}
return
}
@ -1075,7 +1075,7 @@ func TestStatusWaitWithCustomReaders(t *testing.T) {
if tt.expectErrStrs != nil {
require.Error(t, err)
for _, expectedErrStr := range tt.expectErrStrs {
assert.Contains(t, err.Error(), expectedErrStr)
require.ErrorContains(t, err, expectedErrStr)
}
return
}
@ -1246,7 +1246,7 @@ func TestStatusWaitWithFailedResources(t *testing.T) {
if tt.expectErrStrs != nil {
require.Error(t, err)
for _, expectedErrStr := range tt.expectErrStrs {
assert.Contains(t, err.Error(), expectedErrStr)
require.ErrorContains(t, err, expectedErrStr)
}
return
}
@ -1328,8 +1328,7 @@ func TestMethodSpecificContextCancellation(t *testing.T) {
err := sw.WatchUntilReady(resourceList, time.Second*3)
// Should fail due to cancelled method context
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled")
assert.ErrorContains(t, err, "context canceled")
})
t.Run("Wait uses method-specific context", func(t *testing.T) {
@ -1362,8 +1361,7 @@ func TestMethodSpecificContextCancellation(t *testing.T) {
err := sw.Wait(resourceList, time.Second*3)
// Should fail due to cancelled method context
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled")
assert.ErrorContains(t, err, "context canceled")
})
t.Run("WaitWithJobs uses method-specific context", func(t *testing.T) {
@ -1396,8 +1394,7 @@ func TestMethodSpecificContextCancellation(t *testing.T) {
err := sw.WaitWithJobs(resourceList, time.Second*3)
// Should fail due to cancelled method context
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled")
assert.ErrorContains(t, err, "context canceled")
})
t.Run("WaitForDelete uses method-specific context", func(t *testing.T) {
@ -1430,8 +1427,7 @@ func TestMethodSpecificContextCancellation(t *testing.T) {
err := sw.WaitForDelete(resourceList, time.Second*3)
// Should fail due to cancelled method context
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled")
assert.ErrorContains(t, err, "context canceled")
})
}
@ -1468,8 +1464,7 @@ func TestMethodContextFallbackToGeneralContext(t *testing.T) {
err := sw.WatchUntilReady(resourceList, time.Second*3)
// Should fail due to cancelled general context
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled")
assert.ErrorContains(t, err, "context canceled")
})
t.Run("Wait falls back to general context when method context is nil", func(t *testing.T) {
@ -1502,8 +1497,7 @@ func TestMethodContextFallbackToGeneralContext(t *testing.T) {
err := sw.Wait(resourceList, time.Second*3)
// Should fail due to cancelled general context
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled")
assert.ErrorContains(t, err, "context canceled")
})
t.Run("WaitWithJobs falls back to general context when method context is nil", func(t *testing.T) {
@ -1536,8 +1530,7 @@ func TestMethodContextFallbackToGeneralContext(t *testing.T) {
err := sw.WaitWithJobs(resourceList, time.Second*3)
// Should fail due to cancelled general context
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled")
assert.ErrorContains(t, err, "context canceled")
})
t.Run("WaitForDelete falls back to general context when method context is nil", func(t *testing.T) {
@ -1570,8 +1563,7 @@ func TestMethodContextFallbackToGeneralContext(t *testing.T) {
err := sw.WaitForDelete(resourceList, time.Second*3)
// Should fail due to cancelled general context
require.Error(t, err)
assert.Contains(t, err.Error(), "context canceled")
assert.ErrorContains(t, err, "context canceled")
})
}
@ -1795,7 +1787,7 @@ func TestWatchUntilReadyWithCustomReaders(t *testing.T) {
if tt.expectErrStrs != nil {
require.Error(t, err)
for _, expectedErrStr := range tt.expectErrStrs {
assert.Contains(t, err.Error(), expectedErrStr)
require.ErrorContains(t, err, expectedErrStr)
}
return
}

@ -228,8 +228,7 @@ func TestSelectorsForObject(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
selector, err := SelectorsForObject(tt.object.(runtime.Object))
if tt.expectError {
require.Error(t, err)
assert.Contains(t, err.Error(), tt.errorContains)
require.ErrorContains(t, err, tt.errorContains)
} else {
require.NoError(t, err)
expected := labels.Set(tt.expectedLabels)

@ -19,6 +19,7 @@ package registry
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -61,15 +62,14 @@ func TestGetTagMatchingVersionOrConstraint_InvalidConstraint(t *testing.T) {
func TestGetTagMatchingVersionOrConstraint_NoMatches(t *testing.T) {
tags := []string{"0.1.0", "0.2.0"}
_, err := GetTagMatchingVersionOrConstraint(tags, ">=1.0.0")
require.Error(t, err, "expected error when no tags match")
require.Contains(t, err.Error(), ">=1.0.0", "expected error to contain version string")
assert.ErrorContains(t, err, ">=1.0.0", "expected error to contain version string")
}
func TestGetTagMatchingVersionOrConstraint_SkipsNonSemverTags(t *testing.T) {
tags := []string{"alpha", "1.0.0", "beta", "1.1.0"}
got, err := GetTagMatchingVersionOrConstraint(tags, ">=1.0.0 <2.0.0")
require.NoError(t, err)
require.Equal(t, "1.0.0", got)
assert.Equal(t, "1.0.0", got)
}
func TestGetTagMatchingVersionOrConstraint_OrderMatters_FirstMatchReturned(t *testing.T) {
@ -77,7 +77,7 @@ func TestGetTagMatchingVersionOrConstraint_OrderMatters_FirstMatchReturned(t *te
tags := []string{"1.3.0", "1.2.0"}
got, err := GetTagMatchingVersionOrConstraint(tags, ">=1.2.0 <2.0.0")
require.NoError(t, err)
require.Equal(t, "1.3.0", got, "first satisfying tag")
assert.Equal(t, "1.3.0", got, "first satisfying tag")
}
func TestGetTagMatchingVersionOrConstraint_ExactMatchHasPrecedence(t *testing.T) {
@ -85,5 +85,5 @@ func TestGetTagMatchingVersionOrConstraint_ExactMatchHasPrecedence(t *testing.T)
tags := []string{"1.3.0", "1.2.3"}
got, err := GetTagMatchingVersionOrConstraint(tags, "1.2.3")
require.NoError(t, err)
require.Equal(t, "1.2.3", got, "expected exact match")
assert.Equal(t, "1.2.3", got, "expected exact match")
}

Loading…
Cancel
Save