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 }