github.com/Axway/agent-sdk@v1.1.101/pkg/agent/handler/managedapplication_test.go (about)

     1  package handler
     2  
     3  import (
     4  	"testing"
     5  
     6  	agentcache "github.com/Axway/agent-sdk/pkg/agent/cache"
     7  	apiv1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1"
     8  	management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1"
     9  	defs "github.com/Axway/agent-sdk/pkg/apic/definitions"
    10  	prov "github.com/Axway/agent-sdk/pkg/apic/provisioning"
    11  	"github.com/Axway/agent-sdk/pkg/apic/provisioning/mock"
    12  	"github.com/Axway/agent-sdk/pkg/config"
    13  	"github.com/Axway/agent-sdk/pkg/util"
    14  	"github.com/Axway/agent-sdk/pkg/watchmanager/proto"
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  func TestManagedApplicationHandler(t *testing.T) {
    19  	tests := []struct {
    20  		action           proto.Event_Type
    21  		createErr        error
    22  		getErr           error
    23  		hasError         bool
    24  		name             string
    25  		expectedProvType string
    26  		inboundStatus    string
    27  		subError         error
    28  		teamName         string
    29  		outboundStatus   string
    30  	}{
    31  		{
    32  			name:             "should handle a create event for a ManagedApplication when status is pending",
    33  			action:           proto.Event_CREATED,
    34  			teamName:         teamName,
    35  			expectedProvType: provision,
    36  			inboundStatus:    prov.Pending.String(),
    37  			outboundStatus:   prov.Success.String(),
    38  		},
    39  		{
    40  			name:             "should handle an update event for a ManagedApplication when status is pending",
    41  			action:           proto.Event_UPDATED,
    42  			expectedProvType: provision,
    43  			inboundStatus:    prov.Pending.String(),
    44  			outboundStatus:   prov.Success.String(),
    45  		},
    46  		{
    47  			name:   "should return nil when the event is for subresources",
    48  			action: proto.Event_SUBRESOURCEUPDATED,
    49  		},
    50  		{
    51  			name:   "should return nil when status field is empty",
    52  			action: proto.Event_CREATED,
    53  		},
    54  		{
    55  			name:          "should return nil when status field is Success",
    56  			action:        proto.Event_CREATED,
    57  			inboundStatus: prov.Success.String(),
    58  		},
    59  		{
    60  			name:          "should return nil when status field is Error",
    61  			action:        proto.Event_CREATED,
    62  			inboundStatus: prov.Error.String(),
    63  		},
    64  	}
    65  
    66  	for _, tc := range tests {
    67  		t.Run(tc.name, func(t *testing.T) {
    68  			app := managedAppForTest
    69  			app.Status.Level = tc.inboundStatus
    70  
    71  			status := mock.MockRequestStatus{
    72  				Status: prov.Success,
    73  				Msg:    "msg",
    74  				Properties: map[string]string{
    75  					"status_key": "status_val",
    76  				},
    77  			}
    78  
    79  			p := &mockManagedAppProv{
    80  				expectedManagedApp:     app.Name,
    81  				expectedManagedAppData: util.GetAgentDetails(&app),
    82  				expectedTeamName:       tc.teamName,
    83  				status:                 status,
    84  				t:                      t,
    85  			}
    86  
    87  			c := &mockClient{
    88  				subError:       tc.subError,
    89  				expectedStatus: tc.outboundStatus,
    90  				t:              t,
    91  			}
    92  
    93  			cm := agentcache.NewAgentCacheManager(&config.CentralConfiguration{}, false)
    94  			if tc.teamName != "" {
    95  				cm.AddTeam(team)
    96  			}
    97  			handler := NewManagedApplicationHandler(p, cm, c)
    98  
    99  			ri, _ := app.AsInstance()
   100  			err := handler.Handle(NewEventContext(tc.action, nil, ri.Kind, ri.Name), nil, ri)
   101  
   102  			assert.Equal(t, tc.expectedProvType, p.prov)
   103  			if tc.hasError {
   104  				assert.Error(t, err)
   105  			} else {
   106  				assert.Nil(t, err)
   107  			}
   108  
   109  			if tc.inboundStatus == prov.Pending.String() {
   110  				assert.True(t, c.createSubCalled)
   111  			} else {
   112  				assert.False(t, c.createSubCalled)
   113  			}
   114  		})
   115  	}
   116  }
   117  
   118  func TestManagedApplicationHandler_deleting(t *testing.T) {
   119  	tests := []struct {
   120  		name           string
   121  		outboundStatus prov.Status
   122  	}{
   123  		{
   124  			name:           "should deprovision with no error",
   125  			outboundStatus: prov.Success,
   126  		},
   127  		{
   128  			name:           "should fail to deprovision and set the status to error",
   129  			outboundStatus: prov.Error,
   130  		},
   131  	}
   132  
   133  	for _, tc := range tests {
   134  		t.Run(tc.name, func(t *testing.T) {
   135  			app := managedAppForTest
   136  			app.Status.Level = prov.Success.String()
   137  			app.Metadata.State = apiv1.ResourceDeleting
   138  			app.Finalizers = []apiv1.Finalizer{{Name: maFinalizer}}
   139  
   140  			status := mock.MockRequestStatus{
   141  				Status: tc.outboundStatus,
   142  				Msg:    "msg",
   143  				Properties: map[string]string{
   144  					"status_key": "status_val",
   145  				},
   146  			}
   147  
   148  			p := &mockManagedAppProv{
   149  				expectedManagedApp:     app.Name,
   150  				expectedManagedAppData: util.GetAgentDetails(&app),
   151  				expectedTeamName:       "",
   152  				status:                 status,
   153  				t:                      t,
   154  			}
   155  
   156  			c := &mockClient{
   157  				expectedStatus: tc.outboundStatus.String(),
   158  				isDeleting:     true,
   159  				t:              t,
   160  			}
   161  
   162  			cm := agentcache.NewAgentCacheManager(&config.CentralConfiguration{}, false)
   163  
   164  			handler := NewManagedApplicationHandler(p, cm, c)
   165  
   166  			ri, _ := app.AsInstance()
   167  			err := handler.Handle(NewEventContext(proto.Event_UPDATED, nil, ri.Kind, ri.Name), nil, ri)
   168  
   169  			assert.Equal(t, deprovision, p.prov)
   170  			assert.Nil(t, err)
   171  
   172  			if tc.outboundStatus.String() == prov.Success.String() {
   173  				assert.False(t, c.createSubCalled)
   174  			} else {
   175  				assert.True(t, c.createSubCalled)
   176  			}
   177  		})
   178  	}
   179  }
   180  
   181  func TestManagedApplicationHandler_wrong_kind(t *testing.T) {
   182  	cm := agentcache.NewAgentCacheManager(&config.CentralConfiguration{}, false)
   183  	c := &mockClient{
   184  		t: t,
   185  	}
   186  	p := &mockManagedAppProv{}
   187  	handler := NewManagedApplicationHandler(p, cm, c)
   188  	ri := &apiv1.ResourceInstance{
   189  		ResourceMeta: apiv1.ResourceMeta{
   190  			GroupVersionKind: management.EnvironmentGVK(),
   191  		},
   192  	}
   193  	err := handler.Handle(NewEventContext(proto.Event_CREATED, nil, ri.Kind, ri.Name), nil, ri)
   194  	assert.Nil(t, err)
   195  }
   196  
   197  func Test_managedApp(t *testing.T) {
   198  	m := provManagedApp{
   199  		managedAppName: "managed-app-name",
   200  		teamName:       "123",
   201  		data:           map[string]interface{}{"abc": "123"},
   202  		id:             "app-id",
   203  	}
   204  
   205  	assert.Equal(t, m.managedAppName, m.GetManagedApplicationName())
   206  	assert.Equal(t, m.teamName, m.GetTeamName())
   207  	assert.Equal(t, m.id, m.GetID())
   208  	assert.Equal(t, m.data["abc"].(string), m.GetApplicationDetailsValue("abc"))
   209  
   210  	m.data = nil
   211  	assert.Empty(t, m.GetApplicationDetailsValue("abc"))
   212  }
   213  
   214  type mockManagedAppProv struct {
   215  	t                      *testing.T
   216  	status                 mock.MockRequestStatus
   217  	expectedManagedApp     string
   218  	expectedManagedAppData map[string]interface{}
   219  	expectedTeamName       string
   220  	prov                   string
   221  }
   222  
   223  func (m *mockManagedAppProv) ApplicationRequestProvision(ma prov.ApplicationRequest) (status prov.RequestStatus) {
   224  	m.prov = provision
   225  	v := ma.(provManagedApp)
   226  	assert.Equal(m.t, m.expectedManagedApp, v.managedAppName)
   227  	assert.Equal(m.t, m.expectedManagedAppData, v.data)
   228  	assert.Equal(m.t, m.expectedTeamName, v.teamName)
   229  	return m.status
   230  }
   231  
   232  func (m *mockManagedAppProv) ApplicationRequestDeprovision(ma prov.ApplicationRequest) (status prov.RequestStatus) {
   233  	m.prov = deprovision
   234  	v := ma.(provManagedApp)
   235  	assert.Equal(m.t, m.expectedManagedApp, v.managedAppName)
   236  	assert.Equal(m.t, m.expectedManagedAppData, v.data)
   237  	assert.Equal(m.t, m.expectedTeamName, v.teamName)
   238  	return m.status
   239  }
   240  
   241  const teamName = "team-a"
   242  
   243  var team = &defs.PlatformTeam{
   244  	ID:      "1122",
   245  	Name:    teamName,
   246  	Default: true,
   247  }
   248  
   249  var managedAppForTest = management.ManagedApplication{
   250  	ResourceMeta: apiv1.ResourceMeta{
   251  		Name: "app-test",
   252  		Metadata: apiv1.Metadata{
   253  			ID: "11",
   254  			Scope: apiv1.MetadataScope{
   255  				Kind: management.EnvironmentGVK().Kind,
   256  				Name: "env-1",
   257  			},
   258  		},
   259  		SubResources: map[string]interface{}{
   260  			defs.XAgentDetails: map[string]interface{}{
   261  				"sub_manage_app_key": "sub_manage_app_val",
   262  			},
   263  		},
   264  	},
   265  	Owner: &apiv1.Owner{
   266  		Type: 0,
   267  		ID:   team.ID,
   268  	},
   269  	Spec: management.ManagedApplicationSpec{},
   270  	Status: &apiv1.ResourceStatus{
   271  		Level: prov.Pending.String(),
   272  	},
   273  }