package cluster

import (
	"fmt"
	"testing"

	prometheusv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
	"github.com/tidbcloud/observability/pkg/common/utils"
	k8sapiv1 "k8s.io/api/core/v1"
	apiequality "k8s.io/apimachinery/pkg/api/equality"

	"github.com/stretchr/testify/assert"
	"k8s.io/apimachinery/pkg/api/resource"
)

func Test_overSellFloat(t *testing.T) {
	t.Run("cpu 0.25", func(t *testing.T) {
		request, _ := resource.ParseQuantity("0.25")
		limit := overSellFloat(request, 1)
		assert.Equal(t, 0.25+0.25*1, limit.AsApproximateFloat64())
	})
	t.Run("cpu 1", func(t *testing.T) {
		request, _ := resource.ParseQuantity("1")
		limit := overSellFloat(request, 0.5)
		assert.Equal(t, 1+1*0.5, limit.AsApproximateFloat64())
	})
	t.Run("cpu 1.5", func(t *testing.T) {
		request, _ := resource.ParseQuantity("1.5")
		limit := overSellFloat(request, 0.25)
		assert.Equal(t, 1.5+1.5*0.25, limit.AsApproximateFloat64())
	})
	t.Run("memory 512Mi", func(t *testing.T) {
		request, _ := resource.ParseQuantity("512Mi")
		limit := overSellFloat(request, 1)
		assert.Equal(t, request.AsApproximateFloat64()+request.AsApproximateFloat64()*1, limit.AsApproximateFloat64())
	})
	t.Run("memory 2Gi", func(t *testing.T) {
		request, _ := resource.ParseQuantity("2Gi")
		limit := overSellFloat(request, 0.5)
		assert.Equal(t, request.AsApproximateFloat64()+request.AsApproximateFloat64()*0.5, limit.AsApproximateFloat64())
	})
	t.Run("memory 4Gi", func(t *testing.T) {
		request, _ := resource.ParseQuantity("4Gi")
		limit := overSellFloat(request, 0.25)
		assert.Equal(t, request.AsApproximateFloat64()+request.AsApproximateFloat64()*0.25, limit.AsApproximateFloat64())
	})
}

func Test_equalPrometheusImages(t *testing.T) {
	t.Run("nil expectedSpec", func(t *testing.T) {
		var expectedSpec, actualSpec *prometheusv1.PrometheusSpec
		assert.True(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("nil images in expected Spec", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		actualSpec := &prometheusv1.PrometheusSpec{}
		assert.True(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("different init-config-loader 1", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.58.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.False(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("different init-config-loader 2", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.58.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.False(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("same init-config-loader 1", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.True(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("same init-config-loader 2", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.56.3")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.56.3")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.56.3")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.True(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("different prometheus", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.6"))
		expectedSpec.Version = "v2.33.6"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.False(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("different config-loader 1", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.58.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.False(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("different config-loader 2", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.58.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.False(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("same config-loader 1", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.True(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("same config-loader 2", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.56.3")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.56.3")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.56.3")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.True(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("different thanos", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.1"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.1"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.False(t, equalPrometheusImages(expectedSpec, actualSpec))
	})
	t.Run("same all for image tags but diff baseImage", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.True(t, equalPrometheusImages(expectedSpec, actualSpec))
		assert.True(t, apiequality.Semantic.DeepDerivative(expectedSpec, actualSpec))
	})
	t.Run("same all for image tags but diff baseImage, diff in other prome spec", func(t *testing.T) {
		expectedSpec := &prometheusv1.PrometheusSpec{}
		initContainer := overrideContainer("init-config-reloader")
		container := overrideContainer("config-reloader")
		initContainer.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		container.Image = fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus-config-reloader:v0.57.0")
		expectedSpec.InitContainers = append(expectedSpec.InitContainers, initContainer)
		expectedSpec.Containers = append(expectedSpec.Containers, container)
		expectedSpec.Image = utils.StringPtr(fmt.Sprintf("test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"))
		expectedSpec.Version = "v2.33.5"
		expectedSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("test1.dkr.ecr.us-west-2.amazonaws.com/observability/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos2.yaml",
			},
		}

		actualSpec := &prometheusv1.PrometheusSpec{}
		initContainer2 := overrideContainer("init-config-reloader")
		container2 := overrideContainer("config-reloader")
		initContainer2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		container2.Image = fmt.Sprintf("quay.io/prometheus-operator/prometheus-config-reloader:v0.57.0")
		actualSpec.InitContainers = append(actualSpec.InitContainers, initContainer2)
		actualSpec.Containers = append(actualSpec.Containers, container2)
		actualSpec.Image = utils.StringPtr(fmt.Sprintf("quay.io/prometheus/prometheus:v2.33.5"))
		actualSpec.Version = "v2.33.5"
		actualSpec.Thanos = &prometheusv1.ThanosSpec{
			Version: utils.StringPtr("v0.27.0"),
			Image:   utils.StringPtr("quay.io/thanos/thanos:v0.27.0"),
			ObjectStorageConfig: &k8sapiv1.SecretKeySelector{
				Key: "thanos.yaml",
			},
		}
		assert.True(t, equalPrometheusImages(expectedSpec, actualSpec))
		assert.False(t, apiequality.Semantic.DeepDerivative(expectedSpec, actualSpec))
	})
}

func Test_equalImageTag(t *testing.T) {
	t.Run("empty image", func(t *testing.T) {
		image1 := ""
		image2 := ""
		assert.True(t, equalImageTag(image1, image2))
	})
	t.Run("normal image", func(t *testing.T) {
		image1 := "quay.io/prometheus/prometheus:v2.33.5"
		image2 := "test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"
		assert.True(t, equalImageTag(image1, image2))
	})
	t.Run("no tag image 1", func(t *testing.T) {
		image1 := "quay.io/prometheus/prometheus"
		image2 := "test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus:v2.33.5"
		assert.False(t, equalImageTag(image1, image2))
	})
	t.Run("no tag image 2", func(t *testing.T) {
		image1 := "quay.io/prometheus/prometheus"
		image2 := "test1.dkr.ecr.us-west-2.amazonaws.com/observability/prometheus"
		assert.True(t, equalImageTag(image1, image2))
	})
}
