@ -635,6 +635,63 @@ func TestUpgradeRelease_DryRun(t *testing.T) {
req . Error ( err )
}
func TestUpgradeRelease_DryRunServerValidation ( t * testing . T ) {
// Test that server-side dry-run actually calls the Kubernetes API for validation
is := assert . New ( t )
req := require . New ( t )
// Use a fixture that returns dummy resources so our code path is exercised
config := actionConfigFixtureWithDummyResources ( t , createDummyResourceList ( true ) )
upAction := NewUpgrade ( config )
upAction . Namespace = "spaced"
// Create a previous release
rel := releaseStub ( )
rel . Name = "test-server-dry-run"
rel . Info . Status = common . StatusDeployed
req . NoError ( upAction . cfg . Releases . Create ( rel ) )
// Set up the fake client to return an error on Update
expectedErr := errors . New ( "validation error: unknown field in spec" )
config . KubeClient . ( * kubefake . FailingKubeClient ) . UpdateError = expectedErr
upAction . DryRunStrategy = DryRunServer
vals := map [ string ] interface { } { }
ctx , done := context . WithCancel ( t . Context ( ) )
_ , err := upAction . RunWithContext ( ctx , rel . Name , buildChart ( ) , vals )
done ( )
// The error from the API should be returned
is . Error ( err )
is . Contains ( err . Error ( ) , "validation error" )
// Reset and test that client-side dry-run does NOT call the API
config2 := actionConfigFixtureWithDummyResources ( t , createDummyResourceList ( true ) )
config2 . KubeClient . ( * kubefake . FailingKubeClient ) . UpdateError = expectedErr
upAction2 := NewUpgrade ( config2 )
upAction2 . Namespace = "spaced"
// Create a previous release
rel2 := releaseStub ( )
rel2 . Name = "test-client-dry-run"
rel2 . Info . Status = common . StatusDeployed
req . NoError ( upAction2 . cfg . Releases . Create ( rel2 ) )
upAction2 . DryRunStrategy = DryRunClient
ctx , done = context . WithCancel ( t . Context ( ) )
resi , err := upAction2 . RunWithContext ( ctx , rel2 . Name , buildChart ( ) , vals )
done ( )
// Client-side dry-run should succeed since it doesn't call the API
is . NoError ( err )
res , err := releaserToV1Release ( resi )
is . NoError ( err )
is . Equal ( res . Info . Description , "Dry run complete" )
}
func TestGetUpgradeServerSideValue ( t * testing . T ) {
tests := [ ] struct {
name string