package cache

import (
	"testing"
	"time"

	"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data"
	oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
	objecttest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/test"
	"github.com/stretchr/testify/require"
	"go.uber.org/zap"
)

func getTestConfig() *Config {
	return &Config{
		Size:     10,
		Lifetime: 5 * time.Second,
		Logger:   zap.NewExample(),
	}
}

func TestCache(t *testing.T) {
	obj := objecttest.Object()
	objID, _ := obj.ID()
	cnrID, _ := obj.ContainerID()

	var addr oid.Address
	addr.SetContainer(cnrID)
	addr.SetObject(objID)

	extObjInfo := &data.ExtendedObjectInfo{
		ObjectInfo: &data.ObjectInfo{
			ID:  addr.Object(),
			CID: addr.Container(),
		},
		NodeVersion: &data.NodeVersion{
			BaseNodeVersion: data.BaseNodeVersion{
				FilePath: "obj",
				Size:     50,
			},
			IsUnversioned: true,
		},
		IsLatest: true,
	}

	t.Run("check get", func(t *testing.T) {
		cache := New(getTestConfig())
		err := cache.PutObject(extObjInfo)
		require.NoError(t, err)

		actual := cache.GetObject(addr)
		require.Equal(t, extObjInfo, actual)
	})

	t.Run("check delete", func(t *testing.T) {
		cache := New(getTestConfig())
		err := cache.PutObject(extObjInfo)
		require.NoError(t, err)

		cache.Delete(addr)
		actual := cache.GetObject(addr)
		require.Nil(t, actual)
	})
}