github.com/xeptore/docker-cli@v20.10.14+incompatible/cli/command/service/rollback_test.go (about) 1 package service 2 3 import ( 4 "context" 5 "fmt" 6 "io/ioutil" 7 "strings" 8 "testing" 9 10 "github.com/docker/cli/internal/test" 11 "github.com/docker/docker/api/types" 12 "github.com/docker/docker/api/types/swarm" 13 "gotest.tools/v3/assert" 14 is "gotest.tools/v3/assert/cmp" 15 ) 16 17 func TestRollback(t *testing.T) { 18 testCases := []struct { 19 name string 20 args []string 21 serviceUpdateFunc func(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) 22 expectedDockerCliErr string 23 }{ 24 { 25 name: "rollback-service", 26 args: []string{"service-id"}, 27 }, 28 { 29 name: "rollback-service-with-warnings", 30 args: []string{"service-id"}, 31 serviceUpdateFunc: func(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { 32 response := types.ServiceUpdateResponse{} 33 34 response.Warnings = []string{ 35 "- warning 1", 36 "- warning 2", 37 } 38 39 return response, nil 40 }, 41 expectedDockerCliErr: "- warning 1\n- warning 2", 42 }, 43 } 44 45 for _, tc := range testCases { 46 cli := test.NewFakeCli(&fakeClient{ 47 serviceUpdateFunc: tc.serviceUpdateFunc, 48 }) 49 cmd := newRollbackCommand(cli) 50 cmd.SetArgs(tc.args) 51 cmd.Flags().Set("quiet", "true") 52 cmd.SetOut(ioutil.Discard) 53 assert.NilError(t, cmd.Execute()) 54 assert.Check(t, is.Equal(strings.TrimSpace(cli.ErrBuffer().String()), tc.expectedDockerCliErr)) 55 } 56 } 57 58 func TestRollbackWithErrors(t *testing.T) { 59 testCases := []struct { 60 name string 61 args []string 62 serviceInspectWithRawFunc func(ctx context.Context, serviceID string, options types.ServiceInspectOptions) (swarm.Service, []byte, error) 63 serviceUpdateFunc func(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) 64 expectedError string 65 }{ 66 { 67 name: "not-enough-args", 68 expectedError: "requires exactly 1 argument", 69 }, 70 { 71 name: "too-many-args", 72 args: []string{"service-id-1", "service-id-2"}, 73 expectedError: "requires exactly 1 argument", 74 }, 75 { 76 name: "service-does-not-exists", 77 args: []string{"service-id"}, 78 serviceInspectWithRawFunc: func(ctx context.Context, serviceID string, options types.ServiceInspectOptions) (swarm.Service, []byte, error) { 79 return swarm.Service{}, []byte{}, fmt.Errorf("no such services: %s", serviceID) 80 }, 81 expectedError: "no such services: service-id", 82 }, 83 { 84 name: "service-update-failed", 85 args: []string{"service-id"}, 86 serviceUpdateFunc: func(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { 87 return types.ServiceUpdateResponse{}, fmt.Errorf("no such services: %s", serviceID) 88 }, 89 expectedError: "no such services: service-id", 90 }, 91 } 92 93 for _, tc := range testCases { 94 cmd := newRollbackCommand( 95 test.NewFakeCli(&fakeClient{ 96 serviceInspectWithRawFunc: tc.serviceInspectWithRawFunc, 97 serviceUpdateFunc: tc.serviceUpdateFunc, 98 })) 99 cmd.SetArgs(tc.args) 100 cmd.Flags().Set("quiet", "true") 101 cmd.SetOut(ioutil.Discard) 102 assert.ErrorContains(t, cmd.Execute(), tc.expectedError) 103 } 104 }