edge-connect-client/internal/delete/v2/manager_test.go
Richard Robert Reitz 9363277532
All checks were successful
test / test (push) Successful in 48s
fix(sdk): correct delete payload structure for v2 API and add delete command
The v2 API requires a different JSON payload structure than what was being sent.
Both DeleteApp and DeleteAppInstance needed to wrap their parameters properly.

SDK Changes:
- Update DeleteAppInput to use {region, app: {key}} structure
- Update DeleteAppInstanceInput to use {region, appinst: {key}} structure
- Fix DeleteApp method to populate new payload structure
- Fix DeleteAppInstance method to populate new payload structure

CLI Changes:
- Add delete command with -f flag for config file specification
- Support --dry-run to preview deletions
- Support --auto-approve to skip confirmation
- Implement v1 and v2 API support following same pattern as apply
- Add deletion planner to discover resources matching config
- Add resource manager to execute deletions (instances first, then app)

Test Changes:
- Update example_test.go to use EdgeConnectConfig_v1.yaml
- All tests passing including comprehensive delete test coverage

Verified working with manual API testing against live endpoint.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-20 15:15:23 +02:00

200 lines
5.4 KiB
Go

// ABOUTME: Tests for EdgeConnect deletion manager with mock scenarios
// ABOUTME: Tests deletion execution and error handling with mock clients
package v2
import (
"context"
"fmt"
"testing"
"time"
v2 "edp.buildth.ing/DevFW-CICD/edge-connect-client/sdk/edgeconnect/v2"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
// MockResourceClient for testing deletion manager
type MockResourceClient struct {
mock.Mock
}
func (m *MockResourceClient) ShowApp(ctx context.Context, appKey v2.AppKey, region string) (v2.App, error) {
args := m.Called(ctx, appKey, region)
if args.Get(0) == nil {
return v2.App{}, args.Error(1)
}
return args.Get(0).(v2.App), args.Error(1)
}
func (m *MockResourceClient) ShowAppInstances(ctx context.Context, instanceKey v2.AppInstanceKey, region string) ([]v2.AppInstance, error) {
args := m.Called(ctx, instanceKey, region)
if args.Get(0) == nil {
return nil, args.Error(1)
}
return args.Get(0).([]v2.AppInstance), args.Error(1)
}
func (m *MockResourceClient) DeleteApp(ctx context.Context, appKey v2.AppKey, region string) error {
args := m.Called(ctx, appKey, region)
return args.Error(0)
}
func (m *MockResourceClient) DeleteAppInstance(ctx context.Context, instanceKey v2.AppInstanceKey, region string) error {
args := m.Called(ctx, instanceKey, region)
return args.Error(0)
}
// TestLogger implements Logger interface for testing
type TestLogger struct {
messages []string
}
func (l *TestLogger) Printf(format string, v ...interface{}) {
l.messages = append(l.messages, fmt.Sprintf(format, v...))
}
func TestNewResourceManager(t *testing.T) {
mockClient := &MockResourceClient{}
manager := NewResourceManager(mockClient)
assert.NotNil(t, manager)
}
func TestWithLogger(t *testing.T) {
mockClient := &MockResourceClient{}
logger := &TestLogger{}
manager := NewResourceManager(mockClient, WithLogger(logger))
// Cast to implementation to check logger was set
impl := manager.(*EdgeConnectResourceManager)
assert.Equal(t, logger, impl.logger)
}
func createTestDeletionPlan() *DeletionPlan {
return &DeletionPlan{
ConfigName: "test-deletion",
AppToDelete: &AppDeletion{
Name: "test-app",
Version: "1.0.0",
Organization: "testorg",
Region: "US",
},
InstancesToDelete: []InstanceDeletion{
{
Name: "test-app-1.0.0-instance",
Organization: "testorg",
Region: "US",
CloudletOrg: "cloudletorg",
CloudletName: "cloudlet1",
},
},
TotalActions: 2,
EstimatedDuration: 10 * time.Second,
}
}
func TestExecuteDeletion_Success(t *testing.T) {
mockClient := &MockResourceClient{}
logger := &TestLogger{}
manager := NewResourceManager(mockClient, WithLogger(logger))
plan := createTestDeletionPlan()
// Mock successful deletion operations
mockClient.On("DeleteAppInstance", mock.Anything, mock.AnythingOfType("v2.AppInstanceKey"), "US").
Return(nil)
mockClient.On("DeleteApp", mock.Anything, mock.AnythingOfType("v2.AppKey"), "US").
Return(nil)
ctx := context.Background()
result, err := manager.ExecuteDeletion(ctx, plan)
require.NoError(t, err)
require.NotNil(t, result)
assert.True(t, result.Success)
assert.Len(t, result.CompletedActions, 2) // 1 instance + 1 app
assert.Len(t, result.FailedActions, 0)
mockClient.AssertExpectations(t)
}
func TestExecuteDeletion_InstanceDeleteFails(t *testing.T) {
mockClient := &MockResourceClient{}
logger := &TestLogger{}
manager := NewResourceManager(mockClient, WithLogger(logger))
plan := createTestDeletionPlan()
// Mock instance deletion failure
mockClient.On("DeleteAppInstance", mock.Anything, mock.AnythingOfType("v2.AppInstanceKey"), "US").
Return(fmt.Errorf("instance deletion failed"))
ctx := context.Background()
result, err := manager.ExecuteDeletion(ctx, plan)
require.Error(t, err)
require.NotNil(t, result)
assert.False(t, result.Success)
assert.Len(t, result.FailedActions, 1)
mockClient.AssertExpectations(t)
}
func TestExecuteDeletion_OnlyInstances(t *testing.T) {
mockClient := &MockResourceClient{}
logger := &TestLogger{}
manager := NewResourceManager(mockClient, WithLogger(logger))
plan := &DeletionPlan{
ConfigName: "test-deletion",
AppToDelete: nil, // No app to delete
InstancesToDelete: []InstanceDeletion{
{
Name: "test-app-1.0.0-instance",
Organization: "testorg",
Region: "US",
CloudletOrg: "cloudletorg",
CloudletName: "cloudlet1",
},
},
TotalActions: 1,
EstimatedDuration: 5 * time.Second,
}
// Mock successful instance deletion
mockClient.On("DeleteAppInstance", mock.Anything, mock.AnythingOfType("v2.AppInstanceKey"), "US").
Return(nil)
ctx := context.Background()
result, err := manager.ExecuteDeletion(ctx, plan)
require.NoError(t, err)
require.NotNil(t, result)
assert.True(t, result.Success)
assert.Len(t, result.CompletedActions, 1)
mockClient.AssertExpectations(t)
}
func TestExecuteDeletion_EmptyPlan(t *testing.T) {
mockClient := &MockResourceClient{}
manager := NewResourceManager(mockClient)
plan := &DeletionPlan{
ConfigName: "test-deletion",
AppToDelete: nil,
InstancesToDelete: []InstanceDeletion{},
TotalActions: 0,
}
ctx := context.Background()
result, err := manager.ExecuteDeletion(ctx, plan)
require.NoError(t, err)
require.NotNil(t, result)
assert.True(t, result.Success)
assert.Len(t, result.CompletedActions, 0)
assert.Len(t, result.FailedActions, 0)
}