//go:build unit || all
// +build unit all

package autoops

import (
	"context"
	"testing"

	ec2v1alpha1 "github.com/crossplane-contrib/provider-aws/apis/ec2/v1alpha1"
	"github.com/crossplane-contrib/provider-aws/apis/eks/manualv1alpha1"
	. "github.com/onsi/gomega"
	apierrors "k8s.io/apimachinery/pkg/api/errors"

	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/client-go/kubernetes/scheme"
	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
	"sigs.k8s.io/controller-runtime/pkg/log"
)

func TestDeleteNodeGroupsIfIAMThrottled(t *testing.T) {
	cases := map[string]struct {
		obj           *manualv1alpha1.NodeGroup
		expectDeleted bool
	}{
		"iam throtted should be delete": {
			obj: &manualv1alpha1.NodeGroup{
				ObjectMeta: v1.ObjectMeta{
					Name: "a",
				},
				Status: manualv1alpha1.NodeGroupStatus{
					AtProvider: manualv1alpha1.NodeGroupObservation{
						Health: manualv1alpha1.NodeGroupHealth{
							Issues: []manualv1alpha1.Issue{
								{
									Code: IssueCodeIamThrottling,
								},
							},
						},
					},
				},
			},
			expectDeleted: true,
		},
		"node group health should no ops": {
			obj: &manualv1alpha1.NodeGroup{
				ObjectMeta: v1.ObjectMeta{
					Name: "b",
				},
			},
			expectDeleted: false,
		},
	}
	for name, tc := range cases {
		t.Run(name, func(t *testing.T) {
			g := NewGomegaWithT(t)
			s := runtime.NewScheme()
			g.Expect(scheme.AddToScheme(s)).To(Succeed())
			g.Expect(manualv1alpha1.SchemeBuilder.AddToScheme(s)).To(Succeed())
			g.Expect(ec2v1alpha1.SchemeBuilder.AddToScheme(s)).To(Succeed())
			cli := fake.NewClientBuilder().WithScheme(s).WithObjects(tc.obj).Build()

			err := DeleteNodeGroupsIfIAMThrottled(context.TODO(), log.Log, cli, tc.obj)
			g.Expect(err).To(Succeed())
			if tc.expectDeleted {
				i := new(manualv1alpha1.NodeGroup)
				err := cli.Get(context.TODO(), client.ObjectKeyFromObject(tc.obj), i)
				g.Expect(apierrors.IsNotFound(err)).To(BeTrue())
			}
		})
	}
}
