package kv

import (
	"context"
	"testing"

	fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams"
	"github.com/prysmaticlabs/prysm/crypto/hash"
	"github.com/prysmaticlabs/prysm/testing/require"
)

func TestStore_GraffitiOrderedIndex_ReadAndWrite(t *testing.T) {
	ctx := context.Background()
	db := setupDB(t, [][fieldparams.BLSPubkeyLength]byte{})
	tests := []struct {
		name     string
		want     uint64
		write    uint64
		fileHash [32]byte
	}{
		{
			name:     "empty then write",
			want:     0,
			write:    15,
			fileHash: hash.Hash([]byte("one")),
		},
		{
			name:     "update with same file hash",
			want:     15,
			write:    20,
			fileHash: hash.Hash([]byte("one")),
		},
		{
			name:     "continued updates",
			want:     20,
			write:    21,
			fileHash: hash.Hash([]byte("one")),
		},
		{
			name:     "reset with new file hash",
			want:     0,
			write:    10,
			fileHash: hash.Hash([]byte("two")),
		},
		{
			name:     "read with new file hash",
			want:     10,
			fileHash: hash.Hash([]byte("two")),
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := db.GraffitiOrderedIndex(ctx, tt.fileHash)
			require.NoError(t, err)
			require.DeepEqual(t, tt.want, got)
			err = db.SaveGraffitiOrderedIndex(ctx, tt.write)
			require.NoError(t, err)
		})
	}
}
