package action

import (
	"errors"
	"testing"

	"github.com/stretchr/testify/mock"
	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/cluster-service-ng/domain/workflow"
	clusterconfigmocks "github.com/tidbcloud/cluster-service-ng/pkg/clusterconfig/mocks"
	"github.com/tidbcloud/cluster-service-ng/pkg/runtime/actions"
)

func TestDeleteSharedPoolMetaAction(t *testing.T) {
	t.Run("success", func(t *testing.T) {
		clusterConfigClient := clusterconfigmocks.NewClient(t)
		clusterConfigClient.EXPECT().
			DeleteClusterMeta(mock.Anything, "sp-1").
			Return(nil)

		action := NewDeleteSharedPoolMetaAction(clusterConfigClient)
		err := action.Invoke(actions.ActionArgs{
			workflow.SharedPoolIdKey: actions.ActionArgString("sp-1"),
		})

		require.NoError(t, err)
	})

	t.Run("missing shared pool id", func(t *testing.T) {
		clusterConfigClient := clusterconfigmocks.NewClient(t)
		action := NewDeleteSharedPoolMetaAction(clusterConfigClient)

		err := action.Invoke(actions.ActionArgs{})

		require.Error(t, err)
		require.Contains(t, err.Error(), "failed to get shared pool id")
	})

	t.Run("delete shared pool meta failed", func(t *testing.T) {
		clusterConfigClient := clusterconfigmocks.NewClient(t)
		clusterConfigClient.EXPECT().
			DeleteClusterMeta(mock.Anything, "sp-1").
			Return(errors.New("config center error"))

		action := NewDeleteSharedPoolMetaAction(clusterConfigClient)
		err := action.Invoke(actions.ActionArgs{
			workflow.SharedPoolIdKey: actions.ActionArgString("sp-1"),
		})

		require.Error(t, err)
		require.Contains(t, err.Error(), "failed to delete shared pool meta")
	})
}
