github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/command/v3/shared/handle_error_test.go (about) 1 package shared_test 2 3 import ( 4 "errors" 5 "time" 6 7 "github.com/liamawhite/cli-with-i18n/actor/sharedaction" 8 "github.com/liamawhite/cli-with-i18n/actor/v3action" 9 "github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccerror" 10 "github.com/liamawhite/cli-with-i18n/command/translatableerror" 11 . "github.com/liamawhite/cli-with-i18n/command/v3/shared" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/ginkgo/extensions/table" 14 . "github.com/onsi/gomega" 15 ) 16 17 var _ = Describe("HandleError", func() { 18 err := errors.New("some-error") 19 unprocessableEntityError := ccerror.UnprocessableEntityError{Message: "another message"} 20 21 DescribeTable("error translations", 22 func(passedInErr error, expectedErr error) { 23 actualErr := HandleError(passedInErr) 24 Expect(actualErr).To(MatchError(expectedErr)) 25 }, 26 27 Entry("ccerror.RequestError -> APIRequestError", 28 ccerror.RequestError{Err: err}, 29 translatableerror.APIRequestError{Err: err}), 30 31 Entry("ccerror.UnverifiedServerError -> InvalidSSLCertError", 32 ccerror.UnverifiedServerError{URL: "some-url"}, 33 translatableerror.InvalidSSLCertError{API: "some-url"}), 34 35 Entry("ccerror.SSLValidationHostnameError -> SSLCertErrorError", 36 ccerror.SSLValidationHostnameError{Message: "some-message"}, 37 translatableerror.SSLCertError{Message: "some-message"}), 38 39 Entry("ccerror.UnprocessableEntityError with droplet message -> RunTaskError", 40 ccerror.UnprocessableEntityError{Message: "The request is semantically invalid: Task must have a droplet. Specify droplet or assign current droplet to app."}, 41 translatableerror.RunTaskError{Message: "App is not staged."}), 42 43 // This changed in CF254 44 Entry("ccerror.UnprocessableEntityError with droplet message -> RunTaskError", 45 ccerror.UnprocessableEntityError{Message: "Task must have a droplet. Specify droplet or assign current droplet to app."}, 46 translatableerror.RunTaskError{Message: "App is not staged."}), 47 48 Entry("ccerror.UnprocessableEntityError without droplet message -> original error", 49 unprocessableEntityError, 50 unprocessableEntityError), 51 52 Entry("ccerror.APINotFoundError -> APINotFoundError", 53 ccerror.APINotFoundError{URL: "some-url"}, 54 translatableerror.APINotFoundError{URL: "some-url"}), 55 56 Entry("v3action.ApplicationNotFoundError -> ApplicationNotFoundError", 57 v3action.ApplicationNotFoundError{Name: "some-app"}, 58 translatableerror.ApplicationNotFoundError{Name: "some-app"}), 59 60 Entry("v3action.TaskWorkersUnavailableError -> RunTaskError", 61 v3action.TaskWorkersUnavailableError{Message: "fooo: Banana Pants"}, 62 translatableerror.RunTaskError{Message: "Task workers are unavailable."}), 63 64 Entry("sharedaction.NotLoggedInError -> NotLoggedInError", 65 sharedaction.NotLoggedInError{BinaryName: "faceman"}, 66 translatableerror.NotLoggedInError{BinaryName: "faceman"}), 67 68 Entry("sharedaction.NoOrganizationTargetedError -> NoOrganizationTargetedError", 69 sharedaction.NoOrganizationTargetedError{BinaryName: "faceman"}, 70 translatableerror.NoOrganizationTargetedError{BinaryName: "faceman"}), 71 72 Entry("sharedaction.NoSpaceTargetedError -> NoSpaceTargetedError", 73 sharedaction.NoSpaceTargetedError{BinaryName: "faceman"}, 74 translatableerror.NoSpaceTargetedError{BinaryName: "faceman"}), 75 76 Entry("v3action.AssignDropletError -> AssignDropletError", 77 v3action.AssignDropletError{Message: "some-message"}, 78 translatableerror.AssignDropletError{Message: "some-message"}), 79 80 Entry("v3action.OrganizationNotFoundError -> OrgNotFoundError", 81 v3action.OrganizationNotFoundError{Name: "some-org"}, 82 translatableerror.OrganizationNotFoundError{Name: "some-org"}), 83 84 Entry("v3action.ProcessNotFoundError -> ProcessNotFoundError", 85 v3action.ProcessNotFoundError{ProcessType: "some-process-type"}, 86 translatableerror.ProcessNotFoundError{ProcessType: "some-process-type"}), 87 88 Entry("v3action.ProcessInstanceNotFoundError -> ProcessInstanceNotFoundError", 89 v3action.ProcessInstanceNotFoundError{ProcessType: "some-process-type", InstanceIndex: 42}, 90 translatableerror.ProcessInstanceNotFoundError{ProcessType: "some-process-type", InstanceIndex: 42}), 91 92 Entry("v3action.StagingTimeoutError -> StagingTimeoutError", 93 v3action.StagingTimeoutError{AppName: "some-app", Timeout: time.Nanosecond}, 94 translatableerror.StagingTimeoutError{AppName: "some-app", Timeout: time.Nanosecond}), 95 96 Entry("v3action.EmptyDirectoryError -> EmptyDirectoryError", 97 sharedaction.EmptyDirectoryError{Path: "some-path"}, 98 translatableerror.EmptyDirectoryError{Path: "some-path"}), 99 100 Entry("default case -> original error", 101 err, 102 err), 103 ) 104 })