package storage

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"google.golang.org/protobuf/types/known/structpb"

	"github.com/pomerium/pomerium/pkg/protoutil"
)

func TestGetRecordIndex(t *testing.T) {
	type M = map[string]any
	t.Run("missing", func(t *testing.T) {
		v, err := structpb.NewStruct(M{
			"notindex": "value",
		})
		require.NoError(t, err)
		assert.Nil(t, GetRecordIndex(v))
	})
	t.Run("struct", func(t *testing.T) {
		v, err := structpb.NewStruct(M{
			"$index": M{
				"cidr": "192.168.0.0/16",
			},
		})
		require.NoError(t, err)
		assert.Equal(t, &structpb.Struct{
			Fields: map[string]*structpb.Value{
				"cidr": structpb.NewStringValue("192.168.0.0/16"),
			},
		}, GetRecordIndex(v))
	})
	t.Run("value", func(t *testing.T) {
		v, err := structpb.NewValue(M{
			"$index": M{
				"cidr": "192.168.0.0/16",
			},
		})
		require.NoError(t, err)
		assert.Equal(t, &structpb.Struct{
			Fields: map[string]*structpb.Value{
				"cidr": structpb.NewStringValue("192.168.0.0/16"),
			},
		}, GetRecordIndex(v))
	})
	t.Run("any", func(t *testing.T) {
		v, err := structpb.NewValue(M{
			"$index": M{
				"cidr": "192.168.0.0/16",
			},
		})
		require.NoError(t, err)
		data := protoutil.NewAny(v)
		assert.Equal(t, &structpb.Struct{
			Fields: map[string]*structpb.Value{
				"cidr": structpb.NewStringValue("192.168.0.0/16"),
			},
		}, GetRecordIndex(data))
	})
}