package session

import (
	"crypto/rand"
	"testing"

	crypto "github.com/nspcc-dev/neofs-crypto"
	"github.com/stretchr/testify/require"
)

func TestPrivateToken(t *testing.T) {
	// create new private token
	pToken, err := NewPrivateToken(0)
	require.NoError(t, err)

	// generate data to sign
	data := make([]byte, 10)
	_, err = rand.Read(data)
	require.NoError(t, err)

	// sign data via private token
	sig, err := pToken.Sign(data)
	require.NoError(t, err)

	// check signature
	require.NoError(t,
		crypto.Verify(
			crypto.UnmarshalPublicKey(pToken.PublicKey()),
			data,
			sig,
		),
	)
}

func TestPToken_Expired(t *testing.T) {
	e := uint64(10)

	var token PrivateToken = &pToken{
		validUntil: e,
	}

	// must not be expired in the epoch before last
	require.False(t, token.Expired(e-1))

	// must not be expired in the last epoch
	require.False(t, token.Expired(e))

	// must be expired in the epoch after last
	require.True(t, token.Expired(e+1))
}

func TestPrivateTokenKey_SetOwnerID(t *testing.T) {
	ownerID := OwnerID{1, 2, 3}

	s := new(PrivateTokenKey)

	s.SetOwnerID(ownerID)

	require.Equal(t, ownerID, s.owner)
}

func TestPrivateTokenKey_SetTokenID(t *testing.T) {
	tokenID := TokenID{1, 2, 3}

	s := new(PrivateTokenKey)

	s.SetTokenID(tokenID)

	require.Equal(t, tokenID, s.token)
}