package jwt import ( "context" "database/sql" "testing" "time" "github.com/DATA-DOG/go-sqlmock" "github.com/google/uuid" "github.com/stretchr/testify/require" ) func newGeneratorWithNoDB(t *testing.T) *TokenGenerator { gen, err := CreateGenerator( 15, 60, 5, "example.com", "supersecret", nil, ) require.NoError(t, err) return gen } func TestNoDBFail(t *testing.T) { jti := uuid.New() exp := time.Now().Add(time.Hour).Unix() token := AccessToken{ JTI: jti, EXP: exp, gen: &TokenGenerator{}, } // Revoke should fail due to no DB err := token.Revoke(&sql.Tx{}) require.Error(t, err) // CheckNotRevoked should fail _, err = token.CheckNotRevoked(&sql.Tx{}) require.Error(t, err) } func TestRevokeAndCheckNotRevoked(t *testing.T) { gen, mock, cleanup := newGeneratorWithMockDB(t) defer cleanup() jti := uuid.New() exp := time.Now().Add(time.Hour).Unix() token := AccessToken{ JTI: jti, EXP: exp, gen: gen, } // Revoke expectations mock.ExpectBegin() mock.ExpectExec(`INSERT INTO jwtblacklist`). WithArgs(jti, exp). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectQuery(`SELECT 1 FROM jwtblacklist`). WithArgs(jti). WillReturnRows(sqlmock.NewRows([]string{"1"}).AddRow(1)) mock.ExpectCommit() tx, err := gen.dbConn.BeginTx(context.Background(), nil) defer tx.Rollback() require.NoError(t, err) err = token.Revoke(tx) require.NoError(t, err) valid, err := token.CheckNotRevoked(tx) require.NoError(t, err) require.False(t, valid) require.NoError(t, tx.Commit()) require.NoError(t, mock.ExpectationsWereMet()) }