This commit is contained in:
Eden Kirin
2024-06-22 23:17:37 +02:00
parent b67bc14e5e
commit 35082b1f6a
3 changed files with 289 additions and 1 deletions

View File

@ -0,0 +1,279 @@
package smartfilter
import (
"log"
"reflect"
"testing"
"github.com/DATA-DOG/go-sqlmock"
"github.com/go-playground/assert"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func NewMockDB() (*gorm.DB, sqlmock.Sqlmock) {
db, mock, err := sqlmock.New()
if err != nil {
log.Fatalf("An error '%s' was not expected when opening a stub database connection", err)
}
gormDB, err := gorm.Open(mysql.New(mysql.Config{
Conn: db,
SkipInitializeWithVersion: true,
}), &gorm.Config{})
if err != nil {
log.Fatalf("An error '%s' was not expected when opening gorm database", err)
}
return gormDB, mock
}
type MyModel struct {
Id int
Value string
}
func TestHandleOperatorEQ(t *testing.T) {
db, _ := NewMockDB()
testFunc := handleOperatorEQ
t.Run("Test handleOperatorEQ bool true", func(t *testing.T) {
var value bool = true
filterField := FilterField{
Name: "my_field",
boolValue: &value,
valueKind: reflect.Bool,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field = true ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorEQ bool false", func(t *testing.T) {
var value bool = false
filterField := FilterField{
Name: "my_field",
boolValue: &value,
valueKind: reflect.Bool,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field = false ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorEQ int64", func(t *testing.T) {
var value int64 = -123456
filterField := FilterField{
Name: "my_field",
intValue: &value,
valueKind: reflect.Int64,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field = -123456 ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorEQ uint64", func(t *testing.T) {
var value uint64 = 123456
filterField := FilterField{
Name: "my_field",
uintValue: &value,
valueKind: reflect.Uint64,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field = 123456 ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorEQ float", func(t *testing.T) {
var value float64 = -123456.789
filterField := FilterField{
Name: "my_field",
floatValue: &value,
valueKind: reflect.Float64,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field = -123456.789 ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorEQ string", func(t *testing.T) {
var value string = "Some Value"
filterField := FilterField{
Name: "my_field",
strValue: &value,
valueKind: reflect.String,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field = 'Some Value' ORDER BY `my_models`.`id` LIMIT 1", sql)
})
}
func TestHandleOperatorNE(t *testing.T) {
db, _ := NewMockDB()
testFunc := handleOperatorNE
t.Run("Test handleOperatorNE bool true", func(t *testing.T) {
var value bool = true
filterField := FilterField{
Name: "my_field",
boolValue: &value,
valueKind: reflect.Bool,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field != true ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorNE bool false", func(t *testing.T) {
var value bool = false
filterField := FilterField{
Name: "my_field",
boolValue: &value,
valueKind: reflect.Bool,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field != false ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorNE int64", func(t *testing.T) {
var value int64 = -123456
filterField := FilterField{
Name: "my_field",
intValue: &value,
valueKind: reflect.Int64,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field != -123456 ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorNE uint64", func(t *testing.T) {
var value uint64 = 123456
filterField := FilterField{
Name: "my_field",
uintValue: &value,
valueKind: reflect.Uint64,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field != 123456 ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorNE float", func(t *testing.T) {
var value float64 = -123456.789
filterField := FilterField{
Name: "my_field",
floatValue: &value,
valueKind: reflect.Float64,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field != -123456.789 ORDER BY `my_models`.`id` LIMIT 1", sql)
})
t.Run("Test handleOperatorNE string", func(t *testing.T) {
var value string = "Some Value"
filterField := FilterField{
Name: "my_field",
strValue: &value,
valueKind: reflect.String,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field != 'Some Value' ORDER BY `my_models`.`id` LIMIT 1", sql)
})
}
func TestHandleOperatorLIKE(t *testing.T) {
db, _ := NewMockDB()
testFunc := handleOperatorLIKE
t.Run("Test handleOperatorLIKE", func(t *testing.T) {
var value string = "Some Value"
filterField := FilterField{
Name: "my_field",
strValue: &value,
valueKind: reflect.String,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field LIKE '%Some Value%' ORDER BY `my_models`.`id` LIMIT 1", sql)
})
}
func TestHandleOperatorILIKE(t *testing.T) {
db, _ := NewMockDB()
testFunc := handleOperatorILIKE
t.Run("Test handleOperatorLIKE", func(t *testing.T) {
var value string = "Some Value"
filterField := FilterField{
Name: "my_field",
strValue: &value,
valueKind: reflect.String,
}
sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {
query := tx.Model(&MyModel{})
query = testFunc(query, "my_table", &filterField)
return query.First(&MyModel{})
})
assert.Equal(t, "SELECT * FROM `my_models` WHERE my_table.my_field ILIKE '%Some Value%' ORDER BY `my_models`.`id` LIMIT 1", sql)
})
}

4
go.mod
View File

@ -6,7 +6,7 @@ require (
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/kelseyhightower/envconfig v1.4.0 github.com/kelseyhightower/envconfig v1.4.0
github.com/mozillazg/go-slugify v0.2.0 github.com/mozillazg/go-slugify v0.2.0
github.com/stretchr/testify v1.8.1 github.com/stretchr/testify v1.9.0
go.uber.org/zap v1.27.0 go.uber.org/zap v1.27.0
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
gorm.io/datatypes v1.2.1 gorm.io/datatypes v1.2.1
@ -16,7 +16,9 @@ require (
require ( require (
filippo.io/edwards25519 v1.1.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect
github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-playground/assert v1.2.1 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect

7
go.sum
View File

@ -1,8 +1,12 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-playground/assert v1.2.1 h1:ad06XqC+TOv0nJWnbULSlh3ehp5uLuQEojZY5Tq8RgI=
github.com/go-playground/assert v1.2.1/go.mod h1:Lgy+k19nOB/wQG/fVSQ7rra5qYugmytMQqvQ2dgjWn8=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
@ -26,6 +30,7 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@ -51,6 +56,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=