github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/itokens-payloads/impl_test.go (about)

     1  /*
     2   * Copyright (c) 2021-present unTill Pro, Ltd.
     3   */
     4  
     5  package payloads
     6  
     7  import (
     8  	"log"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/voedger/voedger/pkg/appdef"
    15  	"github.com/voedger/voedger/pkg/istructs"
    16  	"github.com/voedger/voedger/pkg/itokens"
    17  	"github.com/voedger/voedger/pkg/itokensjwt"
    18  )
    19  
    20  var (
    21  	testTime     = time.Now()
    22  	testTimeFunc = func() time.Time { return testTime }
    23  	testApp      = istructs.AppQName_test1_app1
    24  	testDuration = time.Minute
    25  )
    26  
    27  func TestBasicUsage_PrincipalPayload(t *testing.T) {
    28  
    29  	require := require.New(t)
    30  
    31  	signer := itokensjwt.ProvideITokens(itokensjwt.SecretKeyExample, testTimeFunc)
    32  
    33  	srcPayload := PrincipalPayload{
    34  		Login:       "login",
    35  		SubjectKind: istructs.SubjectKind_User,
    36  		ProfileWSID: istructs.WSID(10),
    37  	}
    38  
    39  	var token string
    40  	var err error
    41  
    42  	t.Run("Prepare token", func(t *testing.T) {
    43  		token, err = signer.IssueToken(testApp, testDuration, &srcPayload)
    44  		log.Printf("%+v", srcPayload)
    45  		require.NoError(err)
    46  	})
    47  
    48  	t.Run("Verify token", func(t *testing.T) {
    49  		payload := PrincipalPayload{}
    50  		gp, err := signer.ValidateToken(token, &payload)
    51  		require.NoError(err)
    52  		require.Equal(srcPayload, payload)
    53  		require.Greater(gp.IssuedAt.Unix(), int64(0))
    54  		require.Equal(testApp, gp.AppQName)
    55  		require.Equal(testDuration, gp.Duration)
    56  	})
    57  
    58  }
    59  
    60  func TestBasicUsage_BLOBUploadingPayload(t *testing.T) {
    61  
    62  	require := require.New(t)
    63  	signer := itokensjwt.ProvideITokens(itokensjwt.SecretKeyExample, testTimeFunc)
    64  
    65  	srcPayload := BLOBUploadingPayload{
    66  		Workspace: istructs.WSID(1),
    67  		BLOB:      istructs.RecordID(1),
    68  		MaxSize:   20000,
    69  	}
    70  
    71  	var token string
    72  	var err error
    73  
    74  	t.Run("Prepare token", func(t *testing.T) {
    75  		token, err = signer.IssueToken(testApp, testDuration, &srcPayload)
    76  		log.Printf("%+v", srcPayload)
    77  		require.NoError(err)
    78  	})
    79  
    80  	t.Run("Verify token", func(t *testing.T) {
    81  		payload := BLOBUploadingPayload{}
    82  		gp, err := signer.ValidateToken(token, &payload)
    83  		require.NoError(err)
    84  		require.Equal(srcPayload, payload)
    85  		require.Greater(gp.IssuedAt.Unix(), int64(0))
    86  		require.Equal(testApp, gp.AppQName)
    87  		require.Equal(testDuration, gp.Duration)
    88  	})
    89  }
    90  
    91  func TestBasicUsage_VerifiedValue(t *testing.T) {
    92  
    93  	require := require.New(t)
    94  	signer := itokensjwt.ProvideITokens(itokensjwt.SecretKeyExample, testTimeFunc)
    95  	testQName := appdef.NewQName("test", "entity")
    96  
    97  	token := ""
    98  	var err error
    99  
   100  	t.Run("Issue token", func(t *testing.T) {
   101  		payload := VerifiedValuePayload{
   102  			VerificationKind: appdef.VerificationKind_EMail,
   103  			WSID:             43,
   104  			Entity:           testQName,
   105  			Field:            "testName",
   106  			Value:            42,
   107  		}
   108  		token, err = signer.IssueToken(testApp, testDuration, &payload)
   109  		require.NoError(err)
   110  	})
   111  
   112  	t.Run("Verify token", func(t *testing.T) {
   113  		payload := VerifiedValuePayload{}
   114  		gp, err := signer.ValidateToken(token, &payload)
   115  		require.NoError(err)
   116  		require.Equal(appdef.VerificationKind_EMail, payload.VerificationKind)
   117  		require.Equal(testQName, payload.Entity)
   118  		require.Equal("testName", payload.Field)
   119  		require.Equal(float64(42), payload.Value)
   120  		require.Greater(gp.IssuedAt.Unix(), int64(0))
   121  		require.Equal(testApp, gp.AppQName)
   122  		require.Equal(testDuration, gp.Duration)
   123  		require.Equal(istructs.WSID(43), payload.WSID)
   124  	})
   125  }
   126  
   127  func TestBasicUsage_IAppTokens(t *testing.T) {
   128  	require := require.New(t)
   129  	tokens := itokensjwt.ProvideITokens(itokensjwt.SecretKeyExample, testTimeFunc)
   130  	atf := ProvideIAppTokensFactory(tokens)
   131  	at := atf.New(testApp)
   132  
   133  	token := ""
   134  	var err error
   135  
   136  	t.Run("Issue token", func(t *testing.T) {
   137  		srcPayload := PrincipalPayload{
   138  			Login:       "login",
   139  			SubjectKind: istructs.SubjectKind_User,
   140  			ProfileWSID: istructs.WSID(10),
   141  		}
   142  		token, err = at.IssueToken(testDuration, &srcPayload)
   143  		require.NoError(err)
   144  	})
   145  
   146  	t.Run("Validate token", func(t *testing.T) {
   147  		payload := PrincipalPayload{}
   148  		gp, err := at.ValidateToken(token, &payload)
   149  		require.NoError(err)
   150  		require.Greater(gp.IssuedAt.Unix(), int64(0))
   151  		require.Equal(testApp, gp.AppQName)
   152  		require.Equal(testDuration, gp.Duration)
   153  	})
   154  
   155  	t.Run("Basic validation error", func(t *testing.T) {
   156  		testTime = testTime.Add(testDuration * 2)
   157  		defer func() { testTime = testTime.Add(-testDuration * 2) }()
   158  		payload := PrincipalPayload{}
   159  		_, err := at.ValidateToken(token, &payload)
   160  		require.ErrorIs(err, itokens.ErrTokenExpired)
   161  	})
   162  
   163  	t.Run("Error on validate a token issued for an another app", func(t *testing.T) {
   164  		tokens := itokensjwt.ProvideITokens(itokensjwt.SecretKeyExample, testTimeFunc)
   165  		atf := ProvideIAppTokensFactory(tokens)
   166  		at := atf.New(istructs.AppQName_test2_app1)
   167  		payload := PrincipalPayload{}
   168  		_, err := at.ValidateToken(token, &payload)
   169  		require.Equal(ErrTokenIssuedForAnotherApp, err)
   170  	})
   171  }