/*
Copyright (c) Edgeless Systems GmbH

SPDX-License-Identifier: AGPL-3.0-only
*/

package patch

import (
	"testing"

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

var labelsTestObject = corev1.Node{
	TypeMeta: v1.TypeMeta{
		Kind:       "Node",
		APIVersion: "v1",
	},
	ObjectMeta: v1.ObjectMeta{
		ResourceVersion: "0",
	},
}

func TestSetLabels(t *testing.T) {
	testCases := map[string]struct {
		oldLabels map[string]string
		newLabels map[string]string
		wantPatch []byte
	}{
		"empty patch only contains resource version": {
			wantPatch: []byte(`{"metadata":{"resourceVersion":"0"}}`),
		},
		"patch on node without existing labels": {
			newLabels: map[string]string{"key": "value"},
			wantPatch: []byte(`{"metadata":{"labels":{"key":"value"},"resourceVersion":"0"}}`),
		},
		"patch on node with same existing labels": {
			oldLabels: map[string]string{"key": "value"},
			newLabels: map[string]string{"key": "value"},
			wantPatch: []byte(`{"metadata":{"resourceVersion":"0"}}`),
		},
		"patch on node with same key but different value": {
			oldLabels: map[string]string{"key": "oldvalue"},
			newLabels: map[string]string{"key": "newvalue"},
			wantPatch: []byte(`{"metadata":{"labels":{"key":"newvalue"},"resourceVersion":"0"}}`),
		},
	}

	for name, tc := range testCases {
		t.Run(name, func(t *testing.T) {
			assert := assert.New(t)

			original := labelsTestObject.DeepCopy()
			original.SetLabels(tc.oldLabels)
			patched := original.DeepCopy()
			patch := SetLabels(original, patched, tc.newLabels)
			data, err := patch.Data(patched)
			assert.NoError(err)
			assert.Equal(tc.wantPatch, data)
		})
	}
}