github.com/jdolitsky/cnab-go@v0.7.1-beta1/action/install_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 Install implements Action interface 15 var _ Action = &Install{} 16 17 func TestInstall_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 inst := &Install{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 assert.NoError(t, inst.Run(c, mockSet, out)) 35 assert.Equal(t, claim.StatusSuccess, c.Result.Status) 36 assert.Equal(t, claim.ActionInstall, c.Result.Action) 37 assert.Equal(t, map[string]interface{}{"some-output": "SOME CONTENT"}, c.Outputs) 38 }) 39 40 t.Run("configure operation", func(t *testing.T) { 41 c := newClaim() 42 d := &mockDriver{ 43 shouldHandle: true, 44 Result: driver.OperationResult{ 45 Outputs: map[string]string{ 46 "/tmp/some/path": "SOME CONTENT", 47 }, 48 }, 49 Error: nil, 50 } 51 inst := &Install{Driver: d} 52 53 addFile := func(op *driver.Operation) error { 54 op.Files["/tmp/another/path"] = "ANOTHER FILE" 55 return nil 56 } 57 require.NoError(t, inst.Run(c, mockSet, out, addFile)) 58 assert.Contains(t, d.Operation.Files, "/tmp/another/path") 59 }) 60 61 t.Run("error case: configure operation", func(t *testing.T) { 62 c := newClaim() 63 d := &mockDriver{ 64 shouldHandle: true, 65 Result: driver.OperationResult{ 66 Outputs: map[string]string{ 67 "/tmp/some/path": "SOME CONTENT", 68 }, 69 }, 70 Error: nil, 71 } 72 inst := &Install{Driver: d} 73 sabotage := func(op *driver.Operation) error { 74 return errors.New("oops") 75 } 76 require.EqualError(t, inst.Run(c, mockSet, out, sabotage), "oops") 77 }) 78 79 t.Run("when the bundle has no outputs", func(t *testing.T) { 80 c := newClaim() 81 c.Bundle.Outputs = nil 82 inst := &Install{ 83 Driver: &mockDriver{ 84 shouldHandle: true, 85 Result: driver.OperationResult{}, 86 Error: nil, 87 }, 88 } 89 assert.NoError(t, inst.Run(c, mockSet, out)) 90 assert.Equal(t, claim.StatusSuccess, c.Result.Status) 91 assert.Equal(t, claim.ActionInstall, c.Result.Action) 92 assert.Empty(t, c.Outputs) 93 }) 94 95 t.Run("error case: driver can't handle image", func(t *testing.T) { 96 c := newClaim() 97 inst := &Install{ 98 Driver: &mockDriver{ 99 shouldHandle: false, 100 Error: errors.New("I always fail"), 101 }, 102 } 103 assert.Error(t, inst.Run(c, mockSet, out)) 104 }) 105 106 t.Run("error case: driver returns error", func(t *testing.T) { 107 c := newClaim() 108 inst := &Install{ 109 Driver: &mockDriver{ 110 shouldHandle: true, 111 Result: driver.OperationResult{ 112 Outputs: map[string]string{ 113 "/tmp/some/path": "SOME CONTENT", 114 }, 115 }, 116 Error: errors.New("I always fail"), 117 }, 118 } 119 assert.Error(t, inst.Run(c, mockSet, out)) 120 assert.Equal(t, claim.StatusFailure, c.Result.Status) 121 assert.Equal(t, claim.ActionInstall, c.Result.Action) 122 assert.Equal(t, map[string]interface{}{"some-output": "SOME CONTENT"}, c.Outputs) 123 }) 124 125 }