211 lines
5.1 KiB
Go
211 lines
5.1 KiB
Go
package jwt
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestCreateGenerator_Success_NoDB(t *testing.T) {
|
|
gen, err := CreateGenerator(GeneratorConfig{
|
|
AccessExpireAfter: 15,
|
|
RefreshExpireAfter: 60,
|
|
FreshExpireAfter: 5,
|
|
TrustedHost: "example.com",
|
|
SecretKey: "secret",
|
|
DB: nil,
|
|
DBType: DatabaseType{Type: DatabasePostgreSQL, Version: "15"},
|
|
TableConfig: DefaultTableConfig(),
|
|
}, nil)
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, gen)
|
|
}
|
|
|
|
func TestCreateGenerator_Success_WithDB(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
config := DefaultTableConfig()
|
|
config.AutoCreate = false
|
|
config.EnableAutoCleanup = false
|
|
|
|
txGetter := func(ctx context.Context) (DBTransaction, error) {
|
|
return db.Begin()
|
|
}
|
|
|
|
gen, err := CreateGenerator(GeneratorConfig{
|
|
AccessExpireAfter: 15,
|
|
RefreshExpireAfter: 60,
|
|
FreshExpireAfter: 5,
|
|
TrustedHost: "example.com",
|
|
SecretKey: "secret",
|
|
DB: db,
|
|
DBType: DatabaseType{Type: DatabasePostgreSQL, Version: "15"},
|
|
TableConfig: config,
|
|
}, txGetter)
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, gen)
|
|
require.NoError(t, mock.ExpectationsWereMet())
|
|
}
|
|
|
|
func TestCreateGenerator_WithDB_AutoCreate(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
// Mock table doesn't exist
|
|
mock.ExpectQuery("SELECT 1 FROM information_schema.tables").
|
|
WithArgs("jwtblacklist").
|
|
WillReturnRows(sqlmock.NewRows([]string{"1"}))
|
|
|
|
// Mock CREATE TABLE
|
|
mock.ExpectExec("CREATE TABLE IF NOT EXISTS jwtblacklist").
|
|
WillReturnResult(sqlmock.NewResult(0, 0))
|
|
|
|
// Mock cleanup function creation
|
|
mock.ExpectExec("CREATE OR REPLACE FUNCTION cleanup_jwtblacklist").
|
|
WillReturnResult(sqlmock.NewResult(0, 0))
|
|
|
|
txGetter := func(ctx context.Context) (DBTransaction, error) {
|
|
return db.Begin()
|
|
}
|
|
|
|
gen, err := CreateGenerator(GeneratorConfig{
|
|
AccessExpireAfter: 15,
|
|
RefreshExpireAfter: 60,
|
|
FreshExpireAfter: 5,
|
|
TrustedHost: "example.com",
|
|
SecretKey: "secret",
|
|
DB: db,
|
|
DBType: DatabaseType{Type: DatabasePostgreSQL, Version: "15"},
|
|
TableConfig: DefaultTableConfig(),
|
|
}, txGetter)
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, gen)
|
|
require.NoError(t, mock.ExpectationsWereMet())
|
|
}
|
|
|
|
func TestCreateGenerator_InvalidInputs(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
config GeneratorConfig
|
|
}{
|
|
{
|
|
"access expiry <= 0",
|
|
GeneratorConfig{
|
|
AccessExpireAfter: 0,
|
|
RefreshExpireAfter: 1,
|
|
FreshExpireAfter: 1,
|
|
TrustedHost: "h",
|
|
SecretKey: "s",
|
|
},
|
|
},
|
|
{
|
|
"refresh expiry <= 0",
|
|
GeneratorConfig{
|
|
AccessExpireAfter: 1,
|
|
RefreshExpireAfter: 0,
|
|
FreshExpireAfter: 1,
|
|
TrustedHost: "h",
|
|
SecretKey: "s",
|
|
},
|
|
},
|
|
{
|
|
"fresh expiry <= 0",
|
|
GeneratorConfig{
|
|
AccessExpireAfter: 1,
|
|
RefreshExpireAfter: 1,
|
|
FreshExpireAfter: 0,
|
|
TrustedHost: "h",
|
|
SecretKey: "s",
|
|
},
|
|
},
|
|
{
|
|
"empty trustedHost",
|
|
GeneratorConfig{
|
|
AccessExpireAfter: 1,
|
|
RefreshExpireAfter: 1,
|
|
FreshExpireAfter: 1,
|
|
TrustedHost: "",
|
|
SecretKey: "s",
|
|
},
|
|
},
|
|
{
|
|
"empty secretKey",
|
|
GeneratorConfig{
|
|
AccessExpireAfter: 1,
|
|
RefreshExpireAfter: 1,
|
|
FreshExpireAfter: 1,
|
|
TrustedHost: "h",
|
|
SecretKey: "",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
_, err := CreateGenerator(tt.config, nil)
|
|
require.Error(t, err)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCleanup_NoDB(t *testing.T) {
|
|
gen, err := CreateGenerator(GeneratorConfig{
|
|
AccessExpireAfter: 15,
|
|
RefreshExpireAfter: 60,
|
|
FreshExpireAfter: 5,
|
|
TrustedHost: "example.com",
|
|
SecretKey: "secret",
|
|
DB: nil,
|
|
DBType: DatabaseType{Type: DatabasePostgreSQL, Version: "15"},
|
|
TableConfig: DefaultTableConfig(),
|
|
}, nil)
|
|
require.NoError(t, err)
|
|
|
|
err = gen.Cleanup(context.Background())
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "No DB provided")
|
|
}
|
|
|
|
func TestCleanup_Success(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
config := DefaultTableConfig()
|
|
config.AutoCreate = false
|
|
config.EnableAutoCleanup = false
|
|
|
|
txGetter := func(ctx context.Context) (DBTransaction, error) {
|
|
return db.Begin()
|
|
}
|
|
|
|
gen, err := CreateGenerator(GeneratorConfig{
|
|
AccessExpireAfter: 15,
|
|
RefreshExpireAfter: 60,
|
|
FreshExpireAfter: 5,
|
|
TrustedHost: "example.com",
|
|
SecretKey: "secret",
|
|
DB: db,
|
|
DBType: DatabaseType{Type: DatabasePostgreSQL, Version: "15"},
|
|
TableConfig: config,
|
|
}, txGetter)
|
|
require.NoError(t, err)
|
|
|
|
// Mock transaction begin and DELETE query
|
|
mock.ExpectBegin()
|
|
mock.ExpectExec("DELETE FROM jwtblacklist WHERE exp").
|
|
WillReturnResult(sqlmock.NewResult(0, 5))
|
|
|
|
err = gen.Cleanup(context.Background())
|
|
require.NoError(t, err)
|
|
require.NoError(t, mock.ExpectationsWereMet())
|
|
}
|