package session

import (
	"testing"

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

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

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)
}

func TestPublicSessionToken(t *testing.T) {
	var err error

	// nil PrivateToken
	_, err = PublicSessionToken(nil)
	require.EqualError(t, err, ErrNilPrivateToken.Error())

	// empty private key
	var pToken PrivateToken = new(pToken)
	_, err = PublicSessionToken(pToken)
	require.EqualError(t, err, crypto.ErrEmptyPrivateKey.Error())

	// correct PrivateToken
	pToken, err = NewPrivateToken(0)
	require.NoError(t, err)

	key := pToken.PrivateKey()
	require.NotNil(t, key)

	res, err := PublicSessionToken(pToken)
	require.NoError(t, err)
	require.Equal(t, res, crypto.MarshalPublicKey(&key.PublicKey))
}