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(), }) 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 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, }) 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)) 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(), }) 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) 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(), }) 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 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, }) require.NoError(t, err) // Mock DELETE query 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()) }