github.com/jdolitsky/cnab-go@v0.7.1-beta1/action/uninstall_test.go (about) 1 package action 2 3 import ( 4 "errors" 5 "io/ioutil" 6 "testing" 7 8 "github.com/deislabs/cnab-go/claim" 9 "github.com/deislabs/cnab-go/driver" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 // makes sure Uninstall implements Action interface 15 var _ Action = &Uninstall{} 16 17 func TestUninstall_Run(t *testing.T) { 18 out := func(op *driver.Operation) error { 19 op.Out = ioutil.Discard 20 return nil 21 } 22 23 t.Run("happy-path", func(t *testing.T) { 24 c := newClaim() 25 uninst := &Uninstall{ 26 Driver: &mockDriver{ 27 shouldHandle: true, 28 Result: driver.OperationResult{ 29 Outputs: map[string]string{ 30 "/tmp/some/path": "SOME CONTENT", 31 }, 32 }, 33 Error: nil, 34 }, 35 } 36 err := uninst.Run(c, mockSet, out) 37 assert.NoError(t, err) 38 assert.NotEqual(t, c.Created, c.Modified, "Claim was not updated with modified time stamp during uninstall after uninstall action") 39 assert.Equal(t, claim.ActionUninstall, c.Result.Action, "Claim result action not successfully updated.") 40 assert.Equal(t, claim.StatusSuccess, c.Result.Status, "Claim result status not successfully updated.") 41 assert.Equal(t, map[string]interface{}{"some-output": "SOME CONTENT"}, c.Outputs) 42 }) 43 44 t.Run("configure operation", func(t *testing.T) { 45 c := newClaim() 46 d := &mockDriver{ 47 shouldHandle: true, 48 Result: driver.OperationResult{ 49 Outputs: map[string]string{ 50 "/tmp/some/path": "SOME CONTENT", 51 }, 52 }, 53 Error: nil, 54 } 55 inst := &Uninstall{Driver: d} 56 addFile := func(op *driver.Operation) error { 57 op.Files["/tmp/another/path"] = "ANOTHER FILE" 58 return nil 59 } 60 require.NoError(t, inst.Run(c, mockSet, out, addFile)) 61 assert.Contains(t, d.Operation.Files, "/tmp/another/path") 62 }) 63 64 t.Run("error case: configure operation", func(t *testing.T) { 65 c := newClaim() 66 d := &mockDriver{ 67 shouldHandle: true, 68 Result: driver.OperationResult{ 69 Outputs: map[string]string{ 70 "/tmp/some/path": "SOME CONTENT", 71 }, 72 }, 73 Error: nil, 74 } 75 inst := &Uninstall{Driver: d} 76 sabotage := func(op *driver.Operation) error { 77 return errors.New("oops") 78 } 79 require.EqualError(t, inst.Run(c, mockSet, out, sabotage), "oops") 80 }) 81 82 t.Run("when there are no outputs in the bundle", func(t *testing.T) { 83 c := newClaim() 84 c.Bundle.Outputs = nil 85 uninst := &Uninstall{ 86 Driver: &mockDriver{ 87 shouldHandle: true, 88 Result: driver.OperationResult{}, 89 Error: nil, 90 }, 91 } 92 err := uninst.Run(c, mockSet, out) 93 assert.NoError(t, err) 94 assert.NotEqual(t, c.Created, c.Modified, "Claim was not updated with modified time stamp during uninstall after uninstall action") 95 assert.Equal(t, claim.ActionUninstall, c.Result.Action, "Claim result action not successfully updated.") 96 assert.Equal(t, claim.StatusSuccess, c.Result.Status, "Claim result status not successfully updated.") 97 assert.Empty(t, c.Outputs) 98 }) 99 100 t.Run("error case: driver doesn't handle image", func(t *testing.T) { 101 c := newClaim() 102 uninst := &Uninstall{Driver: &mockDriver{ 103 Error: errors.New("I always fail"), 104 shouldHandle: false, 105 }} 106 err := uninst.Run(c, mockSet, out) 107 assert.Error(t, err) 108 assert.Empty(t, c.Outputs) 109 }) 110 111 t.Run("error case: driver does handle image", func(t *testing.T) { 112 c := newClaim() 113 uninst := &Uninstall{Driver: &mockDriver{ 114 Result: driver.OperationResult{ 115 Outputs: map[string]string{ 116 "/tmp/some/path": "SOME CONTENT", 117 }, 118 }, 119 Error: errors.New("I always fail"), 120 shouldHandle: true, 121 }} 122 err := uninst.Run(c, mockSet, out) 123 assert.Error(t, err) 124 assert.NotEqual(t, "", c.Result.Message, "Expected error message in claim result message") 125 assert.Equal(t, claim.ActionUninstall, c.Result.Action) 126 assert.Equal(t, claim.StatusFailure, c.Result.Status) 127 assert.Equal(t, map[string]interface{}{"some-output": "SOME CONTENT"}, c.Outputs) 128 }) 129 }