package jwt import ( "context" "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, } // Revoke should fail due to no DB err := token.Revoke(context.Background()) require.Error(t, err) // CheckNotRevoked should fail _, err = token.CheckNotRevoked(context.Background()) 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, db: gen.dbConn, } // Revoke expectations mock.ExpectBegin() mock.ExpectExec(`INSERT INTO jwtblacklist`). WithArgs(jti, exp). WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() err := token.Revoke(context.Background()) require.NoError(t, err) // CheckNotRevoked expectations (now revoked) mock.ExpectBegin() mock.ExpectQuery(`SELECT 1 FROM jwtblacklist`). WithArgs(jti). WillReturnRows(sqlmock.NewRows([]string{"1"}).AddRow(1)) mock.ExpectCommit() valid, err := token.CheckNotRevoked(context.Background()) require.NoError(t, err) require.False(t, valid) require.NoError(t, mock.ExpectationsWereMet()) }