package container_test

import (
	"testing"

	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/container"
	containertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/container/test"
	"github.com/stretchr/testify/require"
)

func TestContainer_HomomorphicHashingDisabled(t *testing.T) {
	cnr := containertest.GenerateContainer(false)

	t.Run("defaults", func(t *testing.T) {
		require.True(t, cnr.HomomorphicHashingState())
	})

	t.Run("disabled", func(t *testing.T) {
		attr := container.Attribute{}
		attr.SetKey(container.SysAttributeHomomorphicHashing)
		attr.SetValue("NOT_true")

		cnr.SetAttributes(append(cnr.GetAttributes(), attr))
		require.True(t, cnr.HomomorphicHashingState())

		attr.SetValue("true")

		cnr.SetAttributes([]container.Attribute{attr})
		require.False(t, cnr.HomomorphicHashingState())
	})
}

func TestContainer_SetHomomorphicHashingState(t *testing.T) {
	cnr := containertest.GenerateContainer(false)
	attrs := cnr.GetAttributes()
	attrLen := len(attrs)

	cnr.SetHomomorphicHashingState(true)

	// enabling hashing should not add any new attributes
	require.Equal(t, attrLen, len(cnr.GetAttributes()))
	require.True(t, cnr.HomomorphicHashingState())

	cnr.SetHomomorphicHashingState(false)

	// disabling hashing should add exactly one attribute
	require.Equal(t, attrLen+1, len(cnr.GetAttributes()))
	require.False(t, cnr.HomomorphicHashingState())

	cnr.SetHomomorphicHashingState(true)

	// enabling hashing should remove 1 attribute if
	// hashing was disabled before
	require.Equal(t, attrLen, len(cnr.GetAttributes()))
	require.True(t, cnr.HomomorphicHashingState())

	// hashing operations should not change any other attributes
	require.ElementsMatch(t, attrs, cnr.GetAttributes())
}