github.com/crossplane/upjet@v1.3.0/pkg/terraform/finalizer_test.go (about)

     1  // SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
     2  //
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package terraform
     6  
     7  import (
     8  	"context"
     9  	"testing"
    10  
    11  	"github.com/crossplane/crossplane-runtime/pkg/logging"
    12  	xpresource "github.com/crossplane/crossplane-runtime/pkg/resource"
    13  	"github.com/crossplane/crossplane-runtime/pkg/test"
    14  	"github.com/google/go-cmp/cmp"
    15  	"github.com/pkg/errors"
    16  
    17  	"github.com/crossplane/upjet/pkg/resource"
    18  )
    19  
    20  var (
    21  	errBoom = errors.New("errboom")
    22  )
    23  
    24  type StoreFns struct {
    25  	WorkspaceFn func(ctx context.Context, tr resource.Terraformed, ts Setup, l logging.Logger) (*Workspace, error)
    26  	RemoveFn    func(obj xpresource.Object) error
    27  }
    28  
    29  func (sf *StoreFns) Workspace(ctx context.Context, tr resource.Terraformed, ts Setup, l logging.Logger) (*Workspace, error) {
    30  	return sf.WorkspaceFn(ctx, tr, ts, l)
    31  }
    32  
    33  func (sf *StoreFns) Remove(obj xpresource.Object) error {
    34  	return sf.RemoveFn(obj)
    35  }
    36  
    37  func TestAddFinalizer(t *testing.T) {
    38  	type args struct {
    39  		finalizer xpresource.Finalizer
    40  		store     StoreCleaner
    41  		obj       xpresource.Object
    42  	}
    43  	type want struct {
    44  		err error
    45  	}
    46  	cases := map[string]struct {
    47  		reason string
    48  		args
    49  		want
    50  	}{
    51  		"Success": {
    52  			args: args{
    53  				finalizer: xpresource.FinalizerFns{
    54  					AddFinalizerFn: func(_ context.Context, _ xpresource.Object) error {
    55  						return nil
    56  					},
    57  				},
    58  			},
    59  		},
    60  		"Failure": {
    61  			args: args{
    62  				finalizer: xpresource.FinalizerFns{
    63  					AddFinalizerFn: func(_ context.Context, _ xpresource.Object) error {
    64  						return errBoom
    65  					},
    66  				},
    67  			},
    68  			want: want{
    69  				err: errBoom,
    70  			},
    71  		},
    72  	}
    73  	for name, tc := range cases {
    74  		t.Run(name, func(t *testing.T) {
    75  			f := NewWorkspaceFinalizer(tc.args.store, tc.args.finalizer)
    76  			err := f.AddFinalizer(context.TODO(), tc.args.obj)
    77  			if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" {
    78  				t.Errorf("\n%s\nAddFinalizer(...): -want error, +got error:\n%s", tc.reason, diff)
    79  			}
    80  		})
    81  	}
    82  }
    83  
    84  func TestRemoveFinalizer(t *testing.T) {
    85  	type args struct {
    86  		finalizer xpresource.Finalizer
    87  		store     StoreCleaner
    88  		obj       xpresource.Object
    89  	}
    90  	type want struct {
    91  		err error
    92  	}
    93  	cases := map[string]struct {
    94  		reason string
    95  		args
    96  		want
    97  	}{
    98  		"Success": {
    99  			args: args{
   100  				store: &StoreFns{
   101  					RemoveFn: func(_ xpresource.Object) error {
   102  						return nil
   103  					},
   104  				},
   105  				finalizer: xpresource.FinalizerFns{
   106  					RemoveFinalizerFn: func(_ context.Context, _ xpresource.Object) error {
   107  						return nil
   108  					},
   109  				},
   110  			},
   111  		},
   112  		"StoreRemovalFails": {
   113  			args: args{
   114  				store: &StoreFns{
   115  					RemoveFn: func(_ xpresource.Object) error {
   116  						return errBoom
   117  					},
   118  				},
   119  			},
   120  			want: want{
   121  				err: errors.Wrap(errBoom, errRemoveWorkspace),
   122  			},
   123  		},
   124  		"FinalizerFails": {
   125  			args: args{
   126  				store: &StoreFns{
   127  					RemoveFn: func(_ xpresource.Object) error {
   128  						return nil
   129  					},
   130  				},
   131  				finalizer: xpresource.FinalizerFns{
   132  					RemoveFinalizerFn: func(_ context.Context, _ xpresource.Object) error {
   133  						return errBoom
   134  					},
   135  				},
   136  			},
   137  			want: want{
   138  				err: errBoom,
   139  			},
   140  		},
   141  	}
   142  	for name, tc := range cases {
   143  		t.Run(name, func(t *testing.T) {
   144  			f := NewWorkspaceFinalizer(tc.args.store, tc.args.finalizer)
   145  			err := f.RemoveFinalizer(context.TODO(), tc.args.obj)
   146  			if diff := cmp.Diff(tc.want.err, err, test.EquateErrors()); diff != "" {
   147  				t.Errorf("\n%s\nRemoveFinalizer(...): -want error, +got error:\n%s", tc.reason, diff)
   148  			}
   149  		})
   150  	}
   151  }