github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/command/translatableerror/convert_to_translatable_error_test.go (about)

     1  package translatableerror_test
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/cli/actor/actionerror"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    10  	"code.cloudfoundry.org/cli/api/plugin/pluginerror"
    11  	"code.cloudfoundry.org/cli/api/uaa"
    12  	. "code.cloudfoundry.org/cli/command/translatableerror"
    13  	"code.cloudfoundry.org/cli/util/clissh/ssherror"
    14  	"code.cloudfoundry.org/cli/util/download"
    15  	"code.cloudfoundry.org/cli/util/manifest"
    16  	"code.cloudfoundry.org/cli/util/v6manifestparser"
    17  	. "github.com/onsi/ginkgo"
    18  	. "github.com/onsi/ginkgo/extensions/table"
    19  	. "github.com/onsi/gomega"
    20  )
    21  
    22  var _ = Describe("ConvertToTranslatableError", func() {
    23  	err := errors.New("some-error")
    24  	genericErr := errors.New("some-generic-error")
    25  	jsonErr := new(json.SyntaxError)
    26  	unprocessableEntityError := ccerror.UnprocessableEntityError{Message: "another message"}
    27  
    28  	DescribeTable("error translations",
    29  		func(passedInErr error, expectedErr error) {
    30  			actualErr := ConvertToTranslatableError(passedInErr)
    31  			Expect(actualErr).To(MatchError(expectedErr))
    32  		},
    33  
    34  		// Action Errors
    35  		Entry("actionerror.AddPluginRepositoryError -> AddPluginRepositoryError",
    36  			actionerror.AddPluginRepositoryError{Name: "some-repo", URL: "some-URL", Message: "404"},
    37  			AddPluginRepositoryError{Name: "some-repo", URL: "some-URL", Message: "404"}),
    38  
    39  		Entry("actionerror.ApplicationNotFoundError -> ApplicationNotFoundError",
    40  			actionerror.ApplicationNotFoundError{Name: "some-app"},
    41  			ApplicationNotFoundError{Name: "some-app"}),
    42  
    43  		Entry("actionerror.ApplicationNotStartedError -> ApplicationNotStartedError",
    44  			actionerror.ApplicationNotStartedError{Name: "some-app"},
    45  			ApplicationNotStartedError{Name: "some-app"}),
    46  
    47  		Entry("actionerror.AppNotFoundInManifestError -> AppNotFoundInManifestError",
    48  			actionerror.AppNotFoundInManifestError{Name: "some-app"},
    49  			AppNotFoundInManifestError{Name: "some-app"}),
    50  
    51  		Entry("manifestparse.AppNotInManifestError -> AppNotFoundInManifestError",
    52  			v6manifestparser.AppNotInManifestError{Name: "some-app"},
    53  			AppNotFoundInManifestError{Name: "some-app"}),
    54  
    55  		Entry("actionerror.AssignDropletError -> AssignDropletError",
    56  			actionerror.AssignDropletError{Message: "some-message"},
    57  			AssignDropletError{Message: "some-message"}),
    58  
    59  		Entry("actionerror.ServicePlanNotFoundError -> ServicePlanNotFoundError",
    60  			actionerror.ServicePlanNotFoundError{PlanName: "some-plan", ServiceName: "some-service"},
    61  			ServicePlanNotFoundError{PlanName: "some-plan", ServiceName: "some-service"}),
    62  
    63  		Entry("actionerror.BuildpackNotFoundError -> BuildpackNotFoundError",
    64  			actionerror.BuildpackNotFoundError{},
    65  			BuildpackNotFoundError{}),
    66  
    67  		Entry("actionerror.BuildpackStackChangeError-> BuildpackStackChangeError",
    68  			actionerror.BuildpackStackChangeError{},
    69  			BuildpackStackChangeError{}),
    70  
    71  		Entry("actionerror.CommandLineOptionsWithMultipleAppsError -> CommandLineArgsWithMultipleAppsError",
    72  			actionerror.CommandLineOptionsWithMultipleAppsError{},
    73  			CommandLineArgsWithMultipleAppsError{}),
    74  
    75  		Entry("actionerror.DockerPasswordNotSetError -> DockerPasswordNotSetError",
    76  			actionerror.DockerPasswordNotSetError{},
    77  			DockerPasswordNotSetError{}),
    78  
    79  		Entry("actionerror.DomainNotFoundError -> DomainNotFoundError",
    80  			actionerror.DomainNotFoundError{Name: "some-domain-name", GUID: "some-domain-guid"},
    81  			DomainNotFoundError{Name: "some-domain-name", GUID: "some-domain-guid"}),
    82  
    83  		Entry("actionerror.EmptyBuildpacksError -> EmptyBuildpacksError",
    84  			manifest.EmptyBuildpacksError{},
    85  			EmptyBuildpacksError{},
    86  		),
    87  
    88  		Entry("actionerror.EmptyArchiveError -> EmptyDirectoryError",
    89  			actionerror.EmptyArchiveError{Path: "some-filename"},
    90  			EmptyDirectoryError{Path: "some-filename"}),
    91  
    92  		Entry("actionerror.EmptyDirectoryError -> EmptyDirectoryError",
    93  			actionerror.EmptyDirectoryError{Path: "some-filename"},
    94  			EmptyDirectoryError{Path: "some-filename"}),
    95  
    96  		Entry("actionerror.EmptyBuildpackDirectoryError -> EmptyBuildpackDirectoryError",
    97  			actionerror.EmptyBuildpackDirectoryError{Path: "some-path"},
    98  			EmptyBuildpackDirectoryError{Path: "some-path"}),
    99  
   100  		Entry("actionerror.FileChangedError -> FileChangedError",
   101  			actionerror.FileChangedError{Filename: "some-filename"},
   102  			FileChangedError{Filename: "some-filename"}),
   103  
   104  		Entry("actionerror.GettingPluginRepositoryError -> GettingPluginRepositoryError",
   105  			actionerror.GettingPluginRepositoryError{Name: "some-repo", Message: "404"},
   106  			GettingPluginRepositoryError{Name: "some-repo", Message: "404"}),
   107  
   108  		Entry("actionerror.HostnameWithTCPDomainError -> HostnameWithTCPDomainError",
   109  			actionerror.HostnameWithTCPDomainError{},
   110  			HostnameWithTCPDomainError{}),
   111  
   112  		Entry("actionerror.HTTPHealthCheckInvalidError -> HTTPHealthCheckInvalidError",
   113  			actionerror.HTTPHealthCheckInvalidError{},
   114  			HTTPHealthCheckInvalidError{}),
   115  
   116  		Entry("actionerror.InvalidBuildpacksError -> InvalidBuildpacksError",
   117  			actionerror.InvalidBuildpacksError{},
   118  			InvalidBuildpacksError{}),
   119  
   120  		Entry("actionerror.InvalidHTTPRouteSettings -> PortNotAllowedWithHTTPDomainError",
   121  			actionerror.InvalidHTTPRouteSettings{Domain: "some-domain"},
   122  			PortNotAllowedWithHTTPDomainError{Domain: "some-domain"}),
   123  
   124  		Entry("actionerror.InvalidRouteError -> InvalidRouteError",
   125  			actionerror.InvalidRouteError{Route: "some-invalid-route"},
   126  			InvalidRouteError{Route: "some-invalid-route"}),
   127  
   128  		Entry("actionerror.InvalidTCPRouteSettings -> HostAndPathNotAllowedWithTCPDomainError",
   129  			actionerror.InvalidTCPRouteSettings{Domain: "some-domain"},
   130  			HostAndPathNotAllowedWithTCPDomainError{Domain: "some-domain"}),
   131  
   132  		Entry("actionerror.MissingNameError -> AppNameOrManifestRequiredError",
   133  			actionerror.MissingNameError{},
   134  			AppNameOrManifestRequiredError{}),
   135  
   136  		Entry("actionerror.MultipleBuildpacksFoundError -> MultipleBuildpacksFoundError",
   137  			actionerror.MultipleBuildpacksFoundError{BuildpackName: "some-bp-name"},
   138  			MultipleBuildpacksFoundError{BuildpackName: "some-bp-name"}),
   139  
   140  		Entry("actionerror.NoCompatibleBinaryError -> NoCompatibleBinaryError",
   141  			actionerror.NoCompatibleBinaryError{},
   142  			NoCompatibleBinaryError{}),
   143  
   144  		Entry("actionerror.NoDomainsFoundError -> NoDomainsFoundError",
   145  			actionerror.NoDomainsFoundError{OrganizationGUID: "some-guid"},
   146  			NoDomainsFoundError{}),
   147  
   148  		Entry("actionerror.NoHostnameAndSharedDomainError -> NoHostnameAndSharedDomainError",
   149  			actionerror.NoHostnameAndSharedDomainError{},
   150  			NoHostnameAndSharedDomainError{}),
   151  
   152  		Entry("actionerror.NoMatchingDomainError -> NoMatchingDomainError",
   153  			actionerror.NoMatchingDomainError{Route: "some-route.com"},
   154  			NoMatchingDomainError{Route: "some-route.com"}),
   155  
   156  		Entry("actionerror.NonexistentAppPathError -> FileNotFoundError",
   157  			actionerror.NonexistentAppPathError{Path: "some-path"},
   158  			FileNotFoundError{Path: "some-path"}),
   159  
   160  		Entry("v6manifestparser.InvalidManifestApplicationPathError -> FileNotFoundError",
   161  			v6manifestparser.InvalidManifestApplicationPathError{Path: "some-path"},
   162  			FileNotFoundError{Path: "some-path"}),
   163  
   164  		Entry("actionerror.NoOrganizationTargetedError -> NoOrganizationTargetedError",
   165  			actionerror.NoOrganizationTargetedError{BinaryName: "faceman"},
   166  			NoOrganizationTargetedError{BinaryName: "faceman"}),
   167  
   168  		Entry("actionerror.NoSpaceTargetedError -> NoSpaceTargetedError",
   169  			actionerror.NoSpaceTargetedError{BinaryName: "faceman"},
   170  			NoSpaceTargetedError{BinaryName: "faceman"}),
   171  
   172  		Entry("actionerror.NotLoggedInError -> NotLoggedInError",
   173  			actionerror.NotLoggedInError{BinaryName: "faceman"},
   174  			NotLoggedInError{BinaryName: "faceman"}),
   175  
   176  		Entry("actionerror.OrganizationNotFoundError -> OrgNotFoundError",
   177  			actionerror.OrganizationNotFoundError{Name: "some-org"},
   178  			OrganizationNotFoundError{Name: "some-org"}),
   179  
   180  		Entry("actionerror.OrganizationQuotaNotFoundForNameError -> OrganizationQuotaNotFoundForNameError",
   181  			actionerror.OrganizationQuotaNotFoundForNameError{Name: "some-quota"},
   182  			OrganizationQuotaNotFoundForNameError{Name: "some-quota"}),
   183  
   184  		Entry("actionerror.PasswordGrantTypeLogoutRequiredError -> PasswordGrantTypeLogoutRequiredError",
   185  			actionerror.PasswordGrantTypeLogoutRequiredError{},
   186  			PasswordGrantTypeLogoutRequiredError{}),
   187  
   188  		Entry("actionerror.PluginCommandConflictError -> PluginCommandConflictError",
   189  			actionerror.PluginCommandsConflictError{
   190  				PluginName:     "some-plugin",
   191  				PluginVersion:  "1.1.1",
   192  				CommandNames:   []string{"some-command", "some-other-command"},
   193  				CommandAliases: []string{"sc", "soc"},
   194  			},
   195  			PluginCommandsConflictError{
   196  				PluginName:     "some-plugin",
   197  				PluginVersion:  "1.1.1",
   198  				CommandNames:   []string{"some-command", "some-other-command"},
   199  				CommandAliases: []string{"sc", "soc"},
   200  			}),
   201  
   202  		Entry("actionerror.PluginInvalidError -> PluginInvalidError",
   203  			actionerror.PluginInvalidError{},
   204  			PluginInvalidError{}),
   205  
   206  		Entry("actionerror.PluginInvalidError -> PluginInvalidError",
   207  			actionerror.PluginInvalidError{Err: genericErr},
   208  			PluginInvalidError{Err: genericErr}),
   209  
   210  		Entry("actionerror.PluginNotFoundError -> PluginNotFoundError",
   211  			actionerror.PluginNotFoundError{PluginName: "some-plugin"},
   212  			PluginNotFoundError{PluginName: "some-plugin"}),
   213  
   214  		Entry("actionerror.ProcessInstanceNotFoundError -> ProcessInstanceNotFoundError",
   215  			actionerror.ProcessInstanceNotFoundError{ProcessType: "some-process-type", InstanceIndex: 42},
   216  			ProcessInstanceNotFoundError{ProcessType: "some-process-type", InstanceIndex: 42}),
   217  
   218  		Entry("actionerror.ProcessInstanceNotRunningError -> ProcessInstanceNotRunningError",
   219  			actionerror.ProcessInstanceNotRunningError{ProcessType: "some-process-type", InstanceIndex: 42},
   220  			ProcessInstanceNotRunningError{ProcessType: "some-process-type", InstanceIndex: 42}),
   221  
   222  		Entry("actionerror.ProcessNotFoundError -> ProcessNotFoundError",
   223  			actionerror.ProcessNotFoundError{ProcessType: "some-process-type"},
   224  			ProcessNotFoundError{ProcessType: "some-process-type"}),
   225  
   226  		Entry("actionerror.PropertyCombinationError -> PropertyCombinationError",
   227  			actionerror.PropertyCombinationError{Properties: []string{"property-1", "property-2"}},
   228  			PropertyCombinationError{Properties: []string{"property-1", "property-2"}}),
   229  
   230  		Entry("actionerror.RepositoryNameTakenError -> RepositoryNameTakenError",
   231  			actionerror.RepositoryNameTakenError{Name: "some-repo"},
   232  			RepositoryNameTakenError{Name: "some-repo"}),
   233  
   234  		Entry("actionerror.RepositoryNotRegisteredError -> RepositoryNotRegisteredError",
   235  			actionerror.RepositoryNotRegisteredError{Name: "some-repo"},
   236  			RepositoryNotRegisteredError{Name: "some-repo"}),
   237  
   238  		Entry("actionerror.RouteInDifferentSpaceError -> RouteInDifferentSpaceError",
   239  			actionerror.RouteInDifferentSpaceError{Route: "some-route"},
   240  			RouteInDifferentSpaceError{Route: "some-route"}),
   241  
   242  		Entry("actionerror.RoutePathWithTCPDomainError -> RoutePathWithTCPDomainError",
   243  			actionerror.RoutePathWithTCPDomainError{},
   244  			RoutePathWithTCPDomainError{}),
   245  
   246  		Entry("actionerror.RouterGroupNotFoundError -> RouterGroupNotFoundError",
   247  			actionerror.RouterGroupNotFoundError{Name: "some-group"},
   248  			RouterGroupNotFoundError{Name: "some-group"},
   249  		),
   250  
   251  		Entry("actionerror.SecurityGroupNotFoundError -> SecurityGroupNotFoundError",
   252  			actionerror.SecurityGroupNotFoundError{Name: "some-security-group"},
   253  			SecurityGroupNotFoundError{Name: "some-security-group"}),
   254  
   255  		Entry("actionerror.ServiceInstanceNotFoundError -> ServiceInstanceNotFoundError",
   256  			actionerror.ServiceInstanceNotFoundError{Name: "some-service-instance"},
   257  			ServiceInstanceNotFoundError{Name: "some-service-instance"}),
   258  
   259  		Entry("actionerror.ServiceInstanceNotShareableError -> ServiceInstanceNotShareableError",
   260  			actionerror.ServiceInstanceNotShareableError{
   261  				FeatureFlagEnabled:          true,
   262  				ServiceBrokerSharingEnabled: false},
   263  			ServiceInstanceNotShareableError{
   264  				FeatureFlagEnabled:          true,
   265  				ServiceBrokerSharingEnabled: false}),
   266  
   267  		Entry("actionerror.SharedServiceInstanceNotFoundError -> SharedServiceInstanceNotFoundError",
   268  			actionerror.SharedServiceInstanceNotFoundError{},
   269  			SharedServiceInstanceNotFoundError{}),
   270  
   271  		Entry("actionerror.SpaceNotFoundError -> SpaceNotFoundError",
   272  			actionerror.SpaceNotFoundError{Name: "some-space"},
   273  			SpaceNotFoundError{Name: "some-space"}),
   274  
   275  		Entry("actionerror.SpaceQuotaNotFoundByNameError -> SpaceQuotaNotFoundByNameError",
   276  			actionerror.SpaceQuotaNotFoundByNameError{Name: "some-space"},
   277  			SpaceQuotaNotFoundByNameError{Name: "some-space"}),
   278  
   279  		Entry("actionerror.StackNotFoundError -> StackNotFoundError",
   280  			actionerror.StackNotFoundError{Name: "some-stack-name", GUID: "some-stack-guid"},
   281  			StackNotFoundError{Name: "some-stack-name", GUID: "some-stack-guid"}),
   282  
   283  		Entry("actionerror.TaskWorkersUnavailableError -> RunTaskError",
   284  			actionerror.TaskWorkersUnavailableError{Message: "fooo: Banana Pants"},
   285  			RunTaskError{Message: "Task workers are unavailable."}),
   286  
   287  		Entry("actionerror.TCPRouteOptionsNotProvidedError-> TCPRouteOptionsNotProvidedError",
   288  			actionerror.TCPRouteOptionsNotProvidedError{},
   289  			TCPRouteOptionsNotProvidedError{}),
   290  
   291  		Entry("actionerror.TriggerLegacyPushError -> TriggerLegacyPushError",
   292  			actionerror.TriggerLegacyPushError{DomainHostRelated: []string{"domain", "host"}},
   293  			TriggerLegacyPushError{DomainHostRelated: []string{"domain", "host"}}),
   294  
   295  		Entry("actionerror.UploadFailedError -> UploadFailedError",
   296  			actionerror.UploadFailedError{Err: actionerror.NoDomainsFoundError{}},
   297  			UploadFailedError{Err: NoDomainsFoundError{}}),
   298  
   299  		Entry("v3action.StagingTimeoutError -> StagingTimeoutError",
   300  			actionerror.StagingTimeoutError{AppName: "some-app", Timeout: time.Nanosecond},
   301  			StagingTimeoutError{AppName: "some-app", Timeout: time.Nanosecond}),
   302  
   303  		Entry("actionerror.CommandLineOptionsAndManifestConflictError -> CommandLineOptionsAndManifestConflictError",
   304  			actionerror.CommandLineOptionsAndManifestConflictError{
   305  				ManifestAttribute:  "some-attribute",
   306  				CommandLineOptions: []string{"option-1", "option-2"},
   307  			},
   308  			CommandLineOptionsAndManifestConflictError{
   309  				ManifestAttribute:  "some-attribute",
   310  				CommandLineOptions: []string{"option-1", "option-2"},
   311  			}),
   312  
   313  		Entry("actionerror.ServiceInstanceNotSharedToSpaceError -> ServiceInstanceNotSharedToSpaceError",
   314  			actionerror.ServiceInstanceNotSharedToSpaceError{ServiceInstanceName: "some-service-instance-name"},
   315  			ServiceInstanceNotSharedToSpaceError{ServiceInstanceName: "some-service-instance-name"}),
   316  
   317  		Entry("TipDecoratorError calls translates error on base error",
   318  			TipDecoratorError{BaseError: ccerror.APINotFoundError{URL: "some-url"}},
   319  			TipDecoratorError{BaseError: APINotFoundError{URL: "some-url"}}),
   320  
   321  		// CC Errors
   322  		Entry("ccerror.APINotFoundError -> APINotFoundError",
   323  			ccerror.APINotFoundError{URL: "some-url"},
   324  			APINotFoundError{URL: "some-url"}),
   325  
   326  		Entry("ccerror.V2JobFailedError -> V2JobFailedError",
   327  			ccerror.V2JobFailedError{JobGUID: "some-job-guid", Message: "some-message"},
   328  			JobFailedError{JobGUID: "some-job-guid", Message: "some-message"}),
   329  
   330  		Entry("ccerror.V3JobFailedError -> V3JobFailedError",
   331  			ccerror.V3JobFailedError{JobGUID: "some-job-guid", Detail: "some-detail"},
   332  			JobFailedError{JobGUID: "some-job-guid", Message: "some-detail"}),
   333  
   334  		Entry("ccerror.JobTimeoutError -> JobTimeoutError",
   335  			ccerror.JobTimeoutError{JobGUID: "some-job-guid"},
   336  			JobTimeoutError{JobGUID: "some-job-guid"}),
   337  
   338  		Entry("ccerror.MultiError -> MultiError",
   339  			ccerror.MultiError{ResponseCode: 418, Errors: []ccerror.V3Error{
   340  				{
   341  					Code:   282010,
   342  					Detail: "detail 1",
   343  					Title:  "title-1",
   344  				},
   345  				{
   346  					Code:   10242013,
   347  					Detail: "detail 2",
   348  					Title:  "title-2",
   349  				},
   350  			}},
   351  			MultiError{Messages: []string{"detail 1", "detail 2"}},
   352  		),
   353  
   354  		Entry("ccerror.RequestError -> APIRequestError",
   355  			ccerror.RequestError{Err: err},
   356  			APIRequestError{Err: err}),
   357  
   358  		Entry("ccerror.SSLValidationHostnameError -> SSLCertErrorError",
   359  			ccerror.SSLValidationHostnameError{Message: "some-message"},
   360  			SSLCertError{Message: "some-message"}),
   361  
   362  		Entry("ccerror.UnverifiedServerError -> InvalidSSLCertError",
   363  			ccerror.UnverifiedServerError{URL: "some-url"},
   364  			InvalidSSLCertError{URL: "some-url", SuggestedCommand: "api"}),
   365  
   366  		Entry("ccerror.UnprocessableEntityError with droplet message -> RunTaskError",
   367  			ccerror.UnprocessableEntityError{Message: "The request is semantically invalid: Task must have a droplet. Specify droplet or assign current droplet to app."},
   368  			RunTaskError{Message: "App is not staged."}),
   369  
   370  		// This changed in CF254
   371  		Entry("ccerror.UnprocessableEntityError with droplet message -> RunTaskError",
   372  			ccerror.UnprocessableEntityError{Message: "Task must have a droplet. Specify droplet or assign current droplet to app."},
   373  			RunTaskError{Message: "App is not staged."}),
   374  
   375  		Entry("ccerror.UnprocessableEntityError without droplet message -> original error",
   376  			unprocessableEntityError,
   377  			unprocessableEntityError),
   378  
   379  		Entry("download.RawHTTPStatusError -> HTTPStatusError",
   380  			download.RawHTTPStatusError{Status: "some status"},
   381  			HTTPStatusError{Status: "some status"},
   382  		),
   383  
   384  		Entry("json.SyntaxError -> JSONSyntaxError",
   385  			jsonErr,
   386  			JSONSyntaxError{Err: jsonErr},
   387  		),
   388  
   389  		// Manifest Errors
   390  		Entry("manifest.ManifestCreationError -> ManifestCreationError",
   391  			manifest.ManifestCreationError{Err: errors.New("some-error")},
   392  			ManifestCreationError{Err: errors.New("some-error")}),
   393  
   394  		Entry("manifest.InheritanceFieldError -> TriggerLegacyPushError",
   395  			manifest.InheritanceFieldError{},
   396  			TriggerLegacyPushError{InheritanceRelated: true}),
   397  
   398  		Entry("manifest.GlobalFieldError -> TriggerLegacyPushError",
   399  			manifest.GlobalFieldsError{Fields: []string{"some-field"}},
   400  			TriggerLegacyPushError{GlobalRelated: []string{"some-field"}}),
   401  
   402  		Entry("manifest.InterpolationError -> InterpolationError",
   403  			manifest.InterpolationError{Err: errors.New("an-error")},
   404  			InterpolationError{Err: errors.New("an-error")}),
   405  
   406  		Entry("v6manifestparser.InterpolationError -> InterpolationError",
   407  			v6manifestparser.InterpolationError{Err: errors.New("an-error")},
   408  			InterpolationError{Err: errors.New("an-error")}),
   409  
   410  		Entry("v6manifestparser.InvalidYAMLError -> InvalidYAMLError",
   411  			v6manifestparser.InvalidYAMLError{Err: errors.New("an-error")},
   412  			InvalidYAMLError{Err: errors.New("an-error")}),
   413  
   414  		// Plugin Errors
   415  		Entry("pluginerror.RawHTTPStatusError -> DownloadPluginHTTPError",
   416  			pluginerror.RawHTTPStatusError{Status: "some status"},
   417  			DownloadPluginHTTPError{Message: "some status"},
   418  		),
   419  		Entry("pluginerror.SSLValidationHostnameError -> DownloadPluginHTTPError",
   420  			pluginerror.SSLValidationHostnameError{Message: "some message"},
   421  			DownloadPluginHTTPError{Message: "some message"},
   422  		),
   423  		Entry("pluginerror.UnverifiedServerError -> DownloadPluginHTTPError",
   424  			pluginerror.UnverifiedServerError{URL: "some URL"},
   425  			DownloadPluginHTTPError{Message: "x509: certificate signed by unknown authority"},
   426  		),
   427  
   428  		// SSH Error
   429  		Entry("ssherror.UnableToAuthenticateError -> UnableToAuthenticateError",
   430  			ssherror.UnableToAuthenticateError{},
   431  			SSHUnableToAuthenticateError{}),
   432  
   433  		// UAA Errors
   434  		Entry("uaa.BadCredentialsError -> BadCredentialsError",
   435  			uaa.UnauthorizedError{Message: "some message"},
   436  			UnauthorizedError{Message: "some message"}),
   437  
   438  		Entry("uaa.AccountLockedError -> AccountLockedError",
   439  			uaa.AccountLockedError{Message: "locked out"},
   440  			AccountLockedError{Message: "locked out"}),
   441  
   442  		Entry("uaa.InsufficientScopeError -> UnauthorizedToPerformActionError",
   443  			uaa.InsufficientScopeError{},
   444  			UnauthorizedToPerformActionError{}),
   445  
   446  		Entry("uaa.InvalidAuthTokenError -> InvalidRefreshTokenError",
   447  			uaa.InvalidAuthTokenError{},
   448  			InvalidRefreshTokenError{}),
   449  
   450  		Entry("default case -> original error",
   451  			err,
   452  			err),
   453  	)
   454  
   455  	It("returns nil for a nil error", func() {
   456  		nilErr := ConvertToTranslatableError(nil)
   457  		Expect(nilErr).To(BeNil())
   458  	})
   459  })