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  }