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 })