package throttler

import (
	"testing"

	"github.com/stretchr/testify/assert"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	"github.com/tidbcloud/shared-provider/pkg/types"
)

func TestIsPodReady(t *testing.T) {
	cases := []struct {
		name  string
		pod   *corev1.Pod
		ready bool
	}{
		{
			name: "no-condition",
			pod: &corev1.Pod{
				ObjectMeta: metav1.ObjectMeta{Name: "p1"},
				Status: corev1.PodStatus{
					Phase: corev1.PodRunning,
				},
			},
			ready: false,
		},
		{
			name: "no-pod-ready",
			pod: &corev1.Pod{
				ObjectMeta: metav1.ObjectMeta{Name: "p2"},
				Status: corev1.PodStatus{
					Conditions: []corev1.PodCondition{
						{
							Type:   corev1.PodInitialized,
							Status: corev1.ConditionTrue,
						},
					},
				},
			},
			ready: false,
		},
		{
			name: "no-not-ready",
			pod: &corev1.Pod{
				ObjectMeta: metav1.ObjectMeta{Name: "p3"},
				Status: corev1.PodStatus{
					Conditions: []corev1.PodCondition{
						{
							Type:   corev1.PodReady,
							Status: corev1.ConditionFalse,
						},
					},
				},
			},
			ready: false,
		},
		{
			name: "no-ready",
			pod: &corev1.Pod{
				ObjectMeta: metav1.ObjectMeta{Name: "p4"},
				Status: corev1.PodStatus{
					Conditions: []corev1.PodCondition{
						{
							Type:   corev1.PodReady,
							Status: corev1.ConditionTrue,
						},
					},
				},
			},
			ready: true,
		},
	}

	for _, c := range cases {
		t.Log("test", c.name)
		assert.Equal(t, c.ready, IsPodReady(c.pod))
	}
}

func TestIsThrottleAnnoChanged(t *testing.T) {
	cases := []struct {
		name    string
		oldAnno map[string]string
		newAnno map[string]string
		changed bool
	}{
		{
			name:    "both-nil",
			changed: false,
		},
		{
			name:    "both-empty",
			oldAnno: map[string]string{},
			newAnno: map[string]string{},
			changed: false,
		},
		{
			name:    "nil-vs-empty",
			oldAnno: nil,
			newAnno: map[string]string{},
			changed: false,
		},
		{
			name:    "empty-vs-nil",
			oldAnno: map[string]string{},
			newAnno: nil,
			changed: false,
		},
		{
			name:    "nil-vs-part",
			oldAnno: nil,
			newAnno: map[string]string{
				types.AnnoKeyIngress: "ingress",
			},
			changed: true,
		},
		{
			name: "part-vs-nil",
			oldAnno: map[string]string{
				types.AnnoKeyEgress: "egress",
			},
			newAnno: nil,
			changed: true,
		},
		{
			name: "equal",
			oldAnno: map[string]string{
				types.AnnoKeyIngress: "ingress",
			},
			newAnno: map[string]string{
				types.AnnoKeyIngress: "ingress",
			},
			changed: false,
		},
		{
			name: "not-equal",
			oldAnno: map[string]string{
				types.AnnoKeyIngress: "ingress-old",
			},
			newAnno: map[string]string{
				types.AnnoKeyIngress: "ingress-new",
			},
			changed: true,
		},
	}

	for _, c := range cases {
		t.Log("test", c.name)
		assert.Equal(t, c.changed, isThrottleAnnoChanged(c.oldAnno, c.newAnno))
	}
}
