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  }