@ -316,9 +316,7 @@ func TestCreate(t *testing.T) {
list , err := c . Build ( objBody ( & tc . Pods ) , false )
require . NoError ( t , err )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
result , err := c . Create (
list ,
@ -487,7 +485,7 @@ func TestUpdate(t *testing.T) {
data , err := io . ReadAll ( req . Body )
require . NoError ( t , err )
assert . Equal ( t , ` { } ` , string ( data ) )
assert . JSON Eq( t , ` { } ` , string ( data ) )
}
return newResponse ( http . StatusOK , & listTarget . Items [ 0 ] )
@ -622,15 +620,12 @@ func TestBuild(t *testing.T) {
t . Run ( tt . name , func ( t * testing . T ) {
// Test for an invalid manifest
infos , err := c . Build ( tt . reader , false )
if err != nil && ! tt . err {
t . Errorf ( "Got error message when no error should have occurred: %v" , err )
} else if err != nil && strings . Contains ( err . Error ( ) , "--validate=false" ) {
t . Error ( "error message was not scrubbed" )
}
if len ( infos ) != tt . count {
t . Errorf ( "expected %d result objects, got %d" , tt . count , len ( infos ) )
if tt . err {
require . ErrorContains ( t , err , "--validate=false" , "error message was not scrubbed" )
} else {
require . NoError ( t , err , "Got error message when no error should have occurred" )
}
assert . Len ( t , infos , tt . count , "expected %d result objects, got %d" , tt . count , len ( infos ) )
} )
}
}
@ -661,15 +656,12 @@ func TestBuildTable(t *testing.T) {
t . Run ( tt . name , func ( t * testing . T ) {
// Test for an invalid manifest
infos , err := c . BuildTable ( tt . reader , false )
if err != nil && ! tt . err {
t . Errorf ( "Got error message when no error should have occurred: %v" , err )
} else if err != nil && strings . Contains ( err . Error ( ) , "--validate=false" ) {
t . Error ( "error message was not scrubbed" )
}
if len ( infos ) != tt . count {
t . Errorf ( "expected %d result objects, got %d" , tt . count , len ( infos ) )
if tt . err {
require . ErrorContains ( t , err , "--validate=false" , "error message was not scrubbed" )
} else {
require . NoError ( t , err , "Got error message when no error should have occurred" )
}
assert . Len ( t , infos , tt . count , "expected %d result objects, got %d" , tt . count , len ( infos ) )
} )
}
}
@ -705,21 +697,17 @@ func TestPerform(t *testing.T) {
c := newTestClient ( t )
infos , err := c . Build ( tt . reader , false )
if err != nil && err . Error ( ) != tt . errMessage {
t. Errorf ( "Error while building manifests: %v" , err )
if err != nil {
require. EqualErrorf ( t , err , tt . errMessage , "Error while building manifests" )
}
err = perform ( infos , fn )
if ( err != nil ) != tt . err {
t . Errorf ( "expected error: %v, got %v" , tt . err , err )
}
if err != nil && err . Error ( ) != tt . errMessage {
t . Errorf ( "expected error message: %v, got %v" , tt . errMessage , err )
assert . Equal ( t , tt . err , ( err != nil ) , "expected error: %v" , tt . err )
if err != nil {
require . EqualErrorf ( t , err , tt . errMessage , "expected error message: %v, got %v" , tt . errMessage , err )
}
if len ( results ) != tt . count {
t . Errorf ( "expected %d result objects, got %d" , tt . count , len ( results ) )
}
assert . Len ( t , results , tt . count , "expected %d result objects, got %d" , tt . count , len ( results ) )
} )
}
}
@ -771,9 +759,7 @@ func TestWait(t *testing.T) {
return newResponse ( http . StatusOK , pod )
case p == "/namespaces/default/pods" && m == http . MethodPost :
resources , err := c . Build ( req . Body , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
now := time . Now ( )
created = & now
return newResponse ( http . StatusOK , resources [ 0 ] . Object )
@ -785,32 +771,19 @@ func TestWait(t *testing.T) {
}
var err error
c . Waiter , err = c . GetWaiterWithOptions ( LegacyStrategy )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
resources , err := c . Build ( objBody ( & podList ) , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
result , err := c . Create (
resources ,
ClientCreateOptionServerSideApply ( false , false ) )
if err != nil {
t . Fatal ( err )
}
if len ( result . Created ) != 3 {
t . Errorf ( "expected 3 resource created, got %d" , len ( result . Created ) )
}
if err := c . Wait ( resources , time . Second * 30 ) ; err != nil {
t . Errorf ( "expected wait without error, got %s" , err )
}
require . NoError ( t , err )
assert . Len ( t , result . Created , 3 , "expected 3 resource created, got %d" , len ( result . Created ) )
require . NoErrorf ( t , c . Wait ( resources , time . Second * 30 ) , "expected wait without error" )
if time . Since ( * created ) < time . Second * 5 {
t . Errorf ( "expected to wait at least 5 seconds before ready status was detected, but got %s" , time . Since ( * created ) )
}
assert . GreaterOrEqualf ( t , time . Since ( * created ) , time . Second * 5 , "expected to wait at least 5 seconds before ready status was detected, but got %s" , time . Since ( * created ) )
}
func TestWaitJob ( t * testing . T ) {
@ -832,9 +805,7 @@ func TestWaitJob(t *testing.T) {
return newResponse ( http . StatusOK , job )
case p == "/namespaces/default/jobs" && m == http . MethodPost :
resources , err := c . Build ( req . Body , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
now := time . Now ( )
created = & now
return newResponse ( http . StatusOK , resources [ 0 ] . Object )
@ -846,31 +817,17 @@ func TestWaitJob(t *testing.T) {
}
var err error
c . Waiter , err = c . GetWaiterWithOptions ( LegacyStrategy )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
resources , err := c . Build ( objBody ( job ) , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
result , err := c . Create (
resources ,
ClientCreateOptionServerSideApply ( false , false ) )
if err != nil {
t . Fatal ( err )
}
if len ( result . Created ) != 1 {
t . Errorf ( "expected 1 resource created, got %d" , len ( result . Created ) )
}
if err := c . WaitWithJobs ( resources , time . Second * 30 ) ; err != nil {
t . Errorf ( "expected wait without error, got %s" , err )
}
if time . Since ( * created ) < time . Second * 5 {
t . Errorf ( "expected to wait at least 5 seconds before ready status was detected, but got %s" , time . Since ( * created ) )
}
require . NoError ( t , err )
assert . Len ( t , result . Created , 1 , "expected 1 resource created, got %d" , len ( result . Created ) )
require . NoErrorf ( t , c . WaitWithJobs ( resources , time . Second * 30 ) , "expected wait without error" )
assert . GreaterOrEqualf ( t , time . Since ( * created ) , time . Second * 5 , "expected to wait at least 5 seconds before ready status was detected, but got %s" , time . Since ( * created ) )
}
func TestWaitDelete ( t * testing . T ) {
@ -896,9 +853,7 @@ func TestWaitDelete(t *testing.T) {
return newResponse ( http . StatusOK , & pod )
case p == "/namespaces/default/pods" && m == http . MethodPost :
resources , err := c . Build ( req . Body , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
return newResponse ( http . StatusOK , resources [ 0 ] . Object )
default :
t . Fatalf ( "unexpected request: %s %s" , req . Method , req . URL . Path )
@ -908,73 +863,46 @@ func TestWaitDelete(t *testing.T) {
}
var err error
c . Waiter , err = c . GetWaiterWithOptions ( LegacyStrategy )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
resources , err := c . Build ( objBody ( & pod ) , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
result , err := c . Create (
resources ,
ClientCreateOptionServerSideApply ( false , false ) )
if err != nil {
t . Fatal ( err )
}
if len ( result . Created ) != 1 {
t . Errorf ( "expected 1 resource created, got %d" , len ( result . Created ) )
}
if _ , err := c . Delete ( resources , metav1 . DeletePropagationBackground ) ; err != nil {
t . Fatal ( err )
}
if err := c . WaitForDelete ( resources , time . Second * 30 ) ; err != nil {
t . Errorf ( "expected wait without error, got %s" , err )
}
if time . Since ( * deleted ) < time . Second * 5 {
t . Errorf ( "expected to wait at least 5 seconds before ready status was detected, but got %s" , time . Since ( * deleted ) )
}
require . NoError ( t , err )
assert . Len ( t , result . Created , 1 , "expected 1 resource created, got %d" , len ( result . Created ) )
_ , errs := c . Delete ( resources , metav1 . DeletePropagationBackground )
require . Nil ( t , errs )
require . NoErrorf ( t , c . WaitForDelete ( resources , time . Second * 30 ) , "expected wait without error" )
assert . GreaterOrEqualf ( t , time . Since ( * deleted ) , time . Second * 5 , "expected to wait at least 5 seconds before ready status was detected, but got %s" , time . Since ( * deleted ) )
}
func TestReal ( t * testing . T ) {
t . Skip ( "This is a live test, comment this line to run" )
c := New ( nil )
resources , err := c . Build ( strings . NewReader ( guestbookManifest ) , false )
if err != nil {
t . Fatal ( err )
}
if _ , err := c . Create ( resources ) ; err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
_ , err = c . Create ( resources )
require . NoError ( t , err )
testSvcEndpointManifest := testServiceManifest + "\n---\n" + testEndpointManifest
c = New ( nil )
resources , err = c . Build ( strings . NewReader ( testSvcEndpointManifest ) , false )
if err != nil {
t . Fatal ( err )
}
if _ , err := c . Create ( resources ) ; err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
_ , err = c . Create ( resources )
require . NoError ( t , err )
resources , err = c . Build ( strings . NewReader ( testEndpointManifest ) , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
if _ , errs := c . Delete ( resources , metav1 . DeletePropagationBackground ) ; errs != nil {
t . Fatal ( errs )
}
_ , errs := c . Delete ( resources , metav1 . DeletePropagationBackground )
require . Nil ( t , errs )
resources , err = c . Build ( strings . NewReader ( testSvcEndpointManifest ) , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
// ensures that delete does not fail if a resource is not found
if _ , errs := c . Delete ( resources , metav1 . DeletePropagationBackground ) ; errs != nil {
t . Fatal ( errs )
}
_ , errs = c . Delete ( resources , metav1 . DeletePropagationBackground )
require . Nil ( t , errs )
}
func TestGetPodList ( t * testing . T ) {
@ -1004,10 +932,9 @@ func TestOutputContainerLogsForPodList(t *testing.T) {
c := Client { Namespace : namespace , kubeClient : kubeClient }
outBuffer := & bytes . Buffer { }
outBufferFunc := func ( _ , _ , _ string ) io . Writer { return outBuffer }
err := c . OutputContainerLogsForPodList ( & somePodList , namespace , outBufferFunc )
clientAssertions := assert . New ( t )
req := require . New ( t )
req . NoError ( err)
req . NoError ( c. OutputContain erLogsFo rPodList( & somePodList , namespace , outBufferFunc ) )
clientAssertions . Equal ( "fake logsfake logsfake logs" , outBuffer . String ( ) )
}
@ -1247,23 +1174,11 @@ func (c createPatchTestCase) run(t *testing.T) {
}
patch , patchType , err := createPatch ( c . original , targetInfo , c . threeWayMergeForUnstructured )
if err != nil {
t . Fatalf ( "Failed to create patch: %v" , err )
}
require . NoError ( t , err , "Failed to create patch" )
if c . expectedPatch != string ( patch ) {
t . Errorf ( "Unexpected patch.\nTarget:\n%s\nOriginal:\n%s\nActual:\n%s\n\nExpected:\n%s\nGot:\n%s" ,
c . target ,
c . original ,
c . actual ,
c . expectedPatch ,
string ( patch ) ,
)
}
assert . Equal ( t , c . expectedPatch , string ( patch ) , "Unexpected patch.\nTarget:\n%s\nOriginal:\n%s\nActual:\n%s\n\nExpected:\n%s\nGot:\n%s" , c . target , c . original , c . actual , c . expectedPatch , string ( patch ) )
if patchType != types . MergePatchType {
t . Errorf ( "Expected patch type %s, got %s" , types . MergePatchType , patchType )
}
assert . Equal ( t , types . MergePatchType , patchType , "Expected patch type %s, got %s" , types . MergePatchType , patchType )
}
func newTestCustomResourceData ( metadata map [ string ] string , spec map [ string ] any ) * unstructured . Unstructured {
@ -1438,12 +1353,8 @@ func TestIsReachableTwiceAfterClientCreationFailure(t *testing.T) {
assertReachableErr := func ( label string , err error ) {
t . Helper ( )
if err == nil {
t . Fatalf ( "%s: expected error, got nil" , label )
}
if ! errors . Is ( err , refusedErr ) {
t . Fatalf ( "%s: expected error wrapping %v, got %v" , label , refusedErr , err )
}
require . Error ( t , err , "%s: expected error, got nil" , label )
require . ErrorIs ( t , err , refusedErr )
}
assertReachableErr ( "first call" , client . IsReachable ( ) )
@ -1472,9 +1383,7 @@ func TestIsIncompatibleServerError(t *testing.T) {
for name , tc := range testCases {
t . Run ( name , func ( t * testing . T ) {
if got := isIncompatibleServerError ( tc . Err ) ; got != tc . Want {
t . Errorf ( "isIncompatibleServerError() = %v, want %v" , got , tc . Want )
}
assert . Equalf ( t , tc . Want , isIncompatibleServerError ( tc . Err ) , "isIncompatibleServerError()" )
} )
}
}
@ -1926,9 +1835,7 @@ func TestClientWaitContextCancellationLegacy(t *testing.T) {
return newResponse ( http . StatusOK , pod )
case p == "/namespaces/default/pods" && m == http . MethodPost :
resources , err := c . Build ( req . Body , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
return newResponse ( http . StatusOK , resources [ 0 ] . Object )
default :
t . Logf ( "unexpected request: %s %s" , req . Method , req . URL . Path )
@ -1949,10 +1856,7 @@ func TestClientWaitContextCancellationLegacy(t *testing.T) {
ClientCreateOptionServerSideApply ( false , false ) )
require . NoError ( t , err )
assert . Len ( t , result . Created , 2 , "expected 2 resources created, got %d" , len ( result . Created ) )
err = c . Wait ( resources , time . Second * 30 )
require . Error ( t , err )
assert . ErrorContains ( t , err , "context canceled" , "expected context canceled error, got: %v" , err )
assert . ErrorContains ( t , c . Wait ( resources , time . Second * 30 ) , "context canceled" )
}
func TestClientWaitWithJobsContextCancellationLegacy ( t * testing . T ) {
@ -1981,9 +1885,7 @@ func TestClientWaitWithJobsContextCancellationLegacy(t *testing.T) {
return newResponse ( http . StatusOK , job )
case p == "/namespaces/default/jobs" && m == http . MethodPost :
resources , err := c . Build ( req . Body , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
return newResponse ( http . StatusOK , resources [ 0 ] . Object )
default :
t . Logf ( "unexpected request: %s %s" , req . Method , req . URL . Path )
@ -2004,9 +1906,7 @@ func TestClientWaitWithJobsContextCancellationLegacy(t *testing.T) {
ClientCreateOptionServerSideApply ( false , false ) )
require . NoError ( t , err )
assert . Len ( t , result . Created , 1 , "expected 1 resource created, got %d" , len ( result . Created ) )
err = c . WaitWithJobs ( resources , time . Second * 30 )
assert . ErrorContains ( t , err , "context canceled" , "expected context canceled error, got: %v" , err )
assert . ErrorContains ( t , c . WaitWithJobs ( resources , time . Second * 30 ) , "context canceled" , "expected context canceled error" )
}
func TestClientWaitForDeleteContextCancellationLegacy ( t * testing . T ) {
@ -2041,9 +1941,7 @@ func TestClientWaitForDeleteContextCancellationLegacy(t *testing.T) {
return newResponse ( http . StatusOK , & pod )
case p == "/namespaces/default/pods" && m == http . MethodPost :
resources , err := c . Build ( req . Body , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
return newResponse ( http . StatusOK , resources [ 0 ] . Object )
default :
t . Logf ( "unexpected request: %s %s" , req . Method , req . URL . Path )
@ -2065,12 +1963,9 @@ func TestClientWaitForDeleteContextCancellationLegacy(t *testing.T) {
require . NoError ( t , err )
assert . Len ( t , result . Created , 1 , "expected 1 resource created, got %d" , len ( result . Created ) )
if _ , err := c . Delete ( resources , metav1 . DeletePropagationBackground ) ; err != nil {
t . Fatal ( err )
}
err = c . WaitForDelete ( resources , time . Second * 30 )
assert . ErrorContains ( t , err , "context canceled" , "expected context canceled error, got: %v" , err )
_ , errs := c . Delete ( resources , metav1 . DeletePropagationBackground )
require . Nil ( t , errs )
assert . ErrorContains ( t , c . WaitForDelete ( resources , time . Second * 30 ) , "context canceled" , "expected context canceled error" )
}
func TestClientWaitContextNilDoesNotPanic ( t * testing . T ) {
@ -2100,9 +1995,7 @@ func TestClientWaitContextNilDoesNotPanic(t *testing.T) {
return newResponse ( http . StatusOK , pod )
case p == "/namespaces/default/pods" && m == http . MethodPost :
resources , err := c . Build ( req . Body , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
now := time . Now ( )
created = & now
return newResponse ( http . StatusOK , resources [ 0 ] . Object )
@ -2125,10 +2018,7 @@ func TestClientWaitContextNilDoesNotPanic(t *testing.T) {
ClientCreateOptionServerSideApply ( false , false ) )
require . NoError ( t , err )
assert . Len ( t , result . Created , 1 , "expected 1 resource created, got %d" , len ( result . Created ) )
err = c . Wait ( resources , time . Second * 30 )
require . NoError ( t , err )
require . NoError ( t , c . Wait ( resources , time . Second * 30 ) )
assert . GreaterOrEqual ( t , time . Since ( * created ) , time . Second * 2 , "expected to wait at least 2 seconds" )
}
@ -2152,9 +2042,7 @@ func TestClientWaitContextPreCancelledLegacy(t *testing.T) {
return newResponse ( http . StatusOK , pod )
case p == "/namespaces/default/pods" && m == http . MethodPost :
resources , err := c . Build ( req . Body , false )
if err != nil {
t . Fatal ( err )
}
require . NoError ( t , err )
return newResponse ( http . StatusOK , resources [ 0 ] . Object )
default :
t . Fatalf ( "unexpected request: %s %s" , req . Method , req . URL . Path )
@ -2175,9 +2063,7 @@ func TestClientWaitContextPreCancelledLegacy(t *testing.T) {
ClientCreateOptionServerSideApply ( false , false ) )
require . NoError ( t , err )
assert . Len ( t , result . Created , 1 , "expected 1 resource created, got %d" , len ( result . Created ) )
err = c . Wait ( resources , time . Second * 30 )
assert . ErrorContains ( t , err , "context canceled" , "expected context canceled error, got: %v" , err )
assert . ErrorContains ( t , c . Wait ( resources , time . Second * 30 ) , "context canceled" )
}
func TestClientWaitContextCancellationStatusWatcher ( t * testing . T ) {
@ -2202,8 +2088,7 @@ metadata:
cancel ( )
err = c . Wait ( resources , time . Second * 30 )
assert . ErrorContains ( t , err , "context canceled" , "expected context canceled error, got: %v" , err )
assert . ErrorContains ( t , c . Wait ( resources , time . Second * 30 ) , "context canceled" , "expected context canceled error" )
}
func TestClientWaitWithJobsContextCancellationStatusWatcher ( t * testing . T ) {
@ -2228,8 +2113,7 @@ metadata:
cancel ( )
err = c . WaitWithJobs ( resources , time . Second * 30 )
assert . ErrorContains ( t , err , "context canceled" , "expected context canceled error, got: %v" , err )
assert . ErrorContains ( t , c . WaitWithJobs ( resources , time . Second * 30 ) , "context canceled" )
}
func TestClientWaitForDeleteContextCancellationStatusWatcher ( t * testing . T ) {
@ -2259,8 +2143,7 @@ status:
cancel ( )
err = c . WaitForDelete ( resources , time . Second * 30 )
assert . ErrorContains ( t , err , "context canceled" , "expected context canceled error, got: %v" , err )
assert . ErrorContains ( t , c . WaitForDelete ( resources , time . Second * 30 ) , "context canceled" )
}
// testStatusReader is a custom status reader for testing that returns a configurable status.
@ -2334,8 +2217,7 @@ metadata:
// The pod has no Ready condition, but our custom reader returns CurrentStatus,
// so the wait should succeed immediately without timeout.
err = c . Wait ( resources , time . Second * 3 )
require . NoError ( t , err )
require . NoError ( t , c . Wait ( resources , time . Second * 3 ) )
}
func TestClientStatusReadersWithWaitWithJobs ( t * testing . T ) {
@ -2376,8 +2258,7 @@ metadata:
// The job has no Complete condition, but our custom reader returns CurrentStatus,
// so the wait should succeed immediately without timeout.
err = c . WaitWithJobs ( resources , time . Second * 3 )
require . NoError ( t , err )
require . NoError ( t , c . WaitWithJobs ( resources , time . Second * 3 ) )
}
func createManifest ( t * testing . T , manifest string ,
@ -2385,12 +2266,10 @@ func createManifest(t *testing.T, manifest string,
t . Helper ( )
m := make ( map [ string ] any )
err := yaml . Unmarshal ( [ ] byte ( manifest ) , & m )
require . NoError ( t , err )
require . NoError ( t , yaml . Unmarshal ( [ ] byte ( manifest ) , & m ) )
obj := & unstructured . Unstructured { Object : m }
gvk := obj . GroupVersionKind ( )
mapping , err := fakeMapper . RESTMapping ( gvk . GroupKind ( ) , gvk . Version )
require . NoError ( t , err )
err = fakeClient . Tracker ( ) . Create ( mapping . Resource , obj , obj . GetNamespace ( ) )
require . NoError ( t , err )
require . NoError ( t , fakeClient . Tracker ( ) . Create ( mapping . Resource , obj , obj . GetNamespace ( ) ) )
}