github.com/jdolitsky/cnab-go@v0.7.1-beta1/action/upgrade_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 Upgrade implements Action interface 15 var _ Action = &Upgrade{} 16 17 func TestUpgrade_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 upgr := &Upgrade{Driver: &mockDriver{ 26 shouldHandle: true, 27 Result: driver.OperationResult{ 28 Outputs: map[string]string{ 29 "/tmp/some/path": "SOME CONTENT", 30 }, 31 }, 32 Error: nil, 33 }} 34 err := upgr.Run(c, mockSet, out) 35 assert.NoError(t, err) 36 assert.NotEqual(t, c.Created, c.Modified, "Claim was not updated with modified time stamp during upgrade action") 37 assert.Equal(t, claim.ActionUpgrade, c.Result.Action) 38 assert.Equal(t, claim.StatusSuccess, c.Result.Status) 39 assert.Equal(t, map[string]interface{}{"some-output": "SOME CONTENT"}, c.Outputs) 40 }) 41 42 t.Run("configure operation", func(t *testing.T) { 43 c := newClaim() 44 d := &mockDriver{ 45 shouldHandle: true, 46 Result: driver.OperationResult{ 47 Outputs: map[string]string{ 48 "/tmp/some/path": "SOME CONTENT", 49 }, 50 }, 51 Error: nil, 52 } 53 inst := &Upgrade{Driver: d} 54 addFile := func(op *driver.Operation) error { 55 op.Files["/tmp/another/path"] = "ANOTHER FILE" 56 return nil 57 } 58 require.NoError(t, inst.Run(c, mockSet, out, addFile)) 59 assert.Contains(t, d.Operation.Files, "/tmp/another/path") 60 }) 61 62 t.Run("error case: configure operation", func(t *testing.T) { 63 c := newClaim() 64 d := &mockDriver{ 65 shouldHandle: true, 66 Result: driver.OperationResult{ 67 Outputs: map[string]string{ 68 "/tmp/some/path": "SOME CONTENT", 69 }, 70 }, 71 Error: nil, 72 } 73 inst := &Upgrade{Driver: d} 74 sabotage := func(op *driver.Operation) error { 75 return errors.New("oops") 76 } 77 require.EqualError(t, inst.Run(c, mockSet, out, sabotage), "oops") 78 }) 79 80 t.Run("when there are no outputs in the bundle", func(t *testing.T) { 81 c := newClaim() 82 c.Bundle.Outputs = nil 83 upgr := &Upgrade{Driver: &mockDriver{ 84 shouldHandle: true, 85 Result: driver.OperationResult{}, 86 Error: nil, 87 }} 88 err := upgr.Run(c, mockSet, out) 89 assert.NoError(t, err) 90 assert.NotEqual(t, c.Created, c.Modified, "Claim was not updated with modified time stamp during upgrade action") 91 assert.Equal(t, claim.ActionUpgrade, c.Result.Action) 92 assert.Equal(t, claim.StatusSuccess, c.Result.Status) 93 assert.Empty(t, c.Outputs) 94 }) 95 96 t.Run("error case: driver doesn't handle image", func(t *testing.T) { 97 c := newClaim() 98 upgr := &Upgrade{Driver: &mockDriver{ 99 Error: errors.New("I always fail"), 100 shouldHandle: false, 101 }} 102 err := upgr.Run(c, mockSet, out) 103 assert.Error(t, err) 104 assert.Empty(t, c.Outputs) 105 }) 106 107 t.Run("error case: driver does handle image", func(t *testing.T) { 108 c := newClaim() 109 upgr := &Upgrade{Driver: &mockDriver{ 110 Error: errors.New("I always fail"), 111 shouldHandle: true, 112 }} 113 err := upgr.Run(c, mockSet, out) 114 assert.Error(t, err) 115 assert.NotEmpty(t, c.Result.Message, "Expected error message in claim result message") 116 assert.Equal(t, claim.ActionUpgrade, c.Result.Action) 117 assert.Equal(t, claim.StatusFailure, c.Result.Status) 118 assert.Empty(t, c.Outputs) 119 }) 120 }