package configchange

import (
	"reflect"
	"testing"

	"github.com/tidbcloud/infra-provider/util/config"
)

func Test_compareConfBaseDesired(t *testing.T) {
	type args struct {
		desired map[string]interface{}
		curr    map[string]interface{}
	}
	tests := []struct {
		name string
		args args
		want []string
	}{
		{
			name: "only exists in desired",
			args: args{
				desired: map[string]interface{}{"a": "b"},
				curr:    nil,
			},
			want: []string{"a"},
		},
		{
			name: "only exists in curr",
			args: args{
				desired: nil,
				curr:    map[string]interface{}{"a": "b"},
			},
			want: nil,
		},
		{
			name: "value changed",
			args: args{
				desired: map[string]interface{}{"a": "a", "c": "c"},
				curr:    map[string]interface{}{"a": "xxx", "c": "c"},
			},
			want: []string{"a"},
		},
		{
			name: "nested value changed",
			args: args{
				desired: map[string]interface{}{
					"a": map[string]interface{}{
						"aa": "aa",
					},
				},
				curr: map[string]interface{}{
					"a": map[string]interface{}{
						"aa": "changed",
					},
				},
			},
			want: []string{"a.aa"},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			desired := config.New(tt.args.desired)
			curr := config.New(tt.args.curr)
			if got := compareConfBaseDesired(desired, curr); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("compareConfBaseDesired() = %v, want %v", got, tt.want)
			}
		})
	}
}
