Ctrl K
ComunidadGuías…

ocis-pkg/natstest/natstest.go

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// Package natstest has helpers for tests with NATS JWT credentials.
package natstest

import (
	"testing"
	"time"

	"github.com/nats-io/jwt/v2"
	"github.com/nats-io/nats-server/v2/server"
	"github.com/nats-io/nkeys"
	"github.com/stretchr/testify/require"
)

// Creds returns the content of a ".creds" file for a new user in a new account.
// No server knows the account, so use the content only for the checks of the format.
func Creds(t *testing.T) []byte {
	t.Helper()
	accountKP, err := nkeys.CreateAccount()
	require.NoError(t, err)
	return UserCreds(t, accountKP)
}

// UserCreds returns the content of a ".creds" file for a new user of the account accountKP.
func UserCreds(t *testing.T, accountKP nkeys.KeyPair) []byte {
	t.Helper()
	userKP, err := nkeys.CreateUser()
	require.NoError(t, err)
	userPub, err := userKP.PublicKey()
	require.NoError(t, err)
	userJWT, err := jwt.NewUserClaims(userPub).Encode(accountKP)
	require.NoError(t, err)
	seed, err := userKP.Seed()
	require.NoError(t, err)
	creds, err := jwt.FormatUserConfig(userJWT, seed)
	require.NoError(t, err)
	return creds
}

// StartOperatorServer starts a NATS server in operator (JWT) mode.
// It returns the server and the ".creds" content of a user.
func StartOperatorServer(t *testing.T) (*server.Server, []byte) {
	t.Helper()

	operatorKP, err := nkeys.CreateOperator()
	require.NoError(t, err)
	operatorPub, err := operatorKP.PublicKey()
	require.NoError(t, err)
	operatorJWT, err := jwt.NewOperatorClaims(operatorPub).Encode(operatorKP)
	require.NoError(t, err)
	operator, err := jwt.DecodeOperatorClaims(operatorJWT)
	require.NoError(t, err)

	accountKP, err := nkeys.CreateAccount()
	require.NoError(t, err)
	accountPub, err := accountKP.PublicKey()
	require.NoError(t, err)
	accountJWT, err := jwt.NewAccountClaims(accountPub).Encode(operatorKP)
	require.NoError(t, err)

	resolver := &server.MemAccResolver{}
	require.NoError(t, resolver.Store(accountPub, accountJWT))

	s, err := server.NewServer(&server.Options{
		Host:             "127.0.0.1",
		Port:             -1,
		TrustedOperators: []*jwt.OperatorClaims{operator},
		AccountResolver:  resolver,
		NoLog:            true,
		NoSigs:           true,
	})
	require.NoError(t, err)
	go s.Start()
	t.Cleanup(s.Shutdown)
	require.True(t, s.ReadyForConnections(10*time.Second))

	return s, UserCreds(t, accountKP)
}