package gitopsv2

import (
	"testing"

	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
)

func Test(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "Main Suite")
}

var _ = Describe("Overlay", func() {

	It("native merge", func() {
		base := map[string]interface{}{
			"config": map[string]interface{}{
				"raftstore": map[string]interface{}{
					"apply-pool-size": 2,
					"store-pool-size": 2,
				},
			},
		}
		overlay := map[string]interface{}{
			"config": map[string]interface{}{
				"raftstore": map[string]interface{}{
					"apply-pool-size": 1,
					"store-pool-size": 1,
				},
				"rocksdb": map[string]interface{}{
					"defaultcf": map[string]interface{}{
						"soft-pending-compaction-bytes-limit": "1024GB",
					},
				},
			},
		}
		err := Merge(base, overlay)
		Expect(err).To(Succeed())
		raftstoreConfig, err := GetChild(base, "config", "raftstore")
		Expect(err).To(Succeed())
		Expect(raftstoreConfig["apply-pool-size"]).To(Equal(1))
		Expect(raftstoreConfig["store-pool-size"]).To(Equal(1))
		defaultcfConf, err := GetChild(base, "config", "rocksdb", "defaultcf")
		Expect(err).To(Succeed())
		Expect(defaultcfConf["soft-pending-compaction-bytes-limit"]).To(Equal("1024GB"))
	})

	It("merge will override whole slice", func() {
		base := map[string]interface{}{
			"replication": map[string]interface{}{
				"location-labels": []string{"a", "b"},
			},
		}
		overlay := map[string]interface{}{
			"replication": map[string]interface{}{
				"location-labels": []string{"failure-domain.beta.kubernetes.io/region", "failure-domain.beta.kubernetes.io/zone", "kubernetes.io/hostname"},
			},
		}
		err := Merge(base, overlay)
		Expect(err).To(Succeed())
		rep, err := GetChild(base, "replication")
		Expect(err).To(Succeed())
		Expect(rep["location-labels"]).To(ConsistOf("failure-domain.beta.kubernetes.io/region", "failure-domain.beta.kubernetes.io/zone", "kubernetes.io/hostname"))
	})
})
