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  }