2020-02-07 18:45:35 +03:00
package clause_test
import (
"fmt"
"testing"
2020-06-02 04:16:07 +03:00
"gorm.io/gorm/clause"
2020-02-07 18:45:35 +03:00
)
func TestWhere ( t * testing . T ) {
results := [ ] struct {
Clauses [ ] clause . Interface
Result string
Vars [ ] interface { }
} {
{
[ ] clause . Interface { clause . Select { } , clause . From { } , clause . Where {
Exprs : [ ] clause . Expression { clause . Eq { Column : clause . PrimaryColumn , Value : "1" } , clause . Gt { Column : "age" , Value : 18 } , clause . Or ( clause . Neq { Column : "name" , Value : "jinzhu" } ) } ,
} } ,
"SELECT * FROM `users` WHERE `users`.`id` = ? AND `age` > ? OR `name` <> ?" , [ ] interface { } { "1" , 18 , "jinzhu" } ,
} ,
{
[ ] clause . Interface { clause . Select { } , clause . From { } , clause . Where {
Exprs : [ ] clause . Expression { clause . Or ( clause . Neq { Column : "name" , Value : "jinzhu" } ) , clause . Eq { Column : clause . PrimaryColumn , Value : "1" } , clause . Gt { Column : "age" , Value : 18 } } ,
} } ,
"SELECT * FROM `users` WHERE `users`.`id` = ? OR `name` <> ? AND `age` > ?" , [ ] interface { } { "1" , "jinzhu" , 18 } ,
} ,
{
[ ] clause . Interface { clause . Select { } , clause . From { } , clause . Where {
2020-06-06 17:52:08 +03:00
Exprs : [ ] clause . Expression { clause . Or ( clause . Neq { Column : "name" , Value : "jinzhu" } ) , clause . Eq { Column : clause . PrimaryColumn , Value : "1" } , clause . Gt { Column : "age" , Value : 18 } } ,
2020-02-07 18:45:35 +03:00
} } ,
"SELECT * FROM `users` WHERE `users`.`id` = ? OR `name` <> ? AND `age` > ?" , [ ] interface { } { "1" , "jinzhu" , 18 } ,
} ,
{
[ ] clause . Interface { clause . Select { } , clause . From { } , clause . Where {
Exprs : [ ] clause . Expression { clause . Or ( clause . Eq { Column : clause . PrimaryColumn , Value : "1" } ) , clause . Or ( clause . Neq { Column : "name" , Value : "jinzhu" } ) } ,
} } ,
"SELECT * FROM `users` WHERE `users`.`id` = ? OR `name` <> ?" , [ ] interface { } { "1" , "jinzhu" } ,
} ,
{
[ ] clause . Interface { clause . Select { } , clause . From { } , clause . Where {
Exprs : [ ] clause . Expression { clause . Eq { Column : clause . PrimaryColumn , Value : "1" } , clause . Gt { Column : "age" , Value : 18 } , clause . Or ( clause . Neq { Column : "name" , Value : "jinzhu" } ) } ,
} , clause . Where {
Exprs : [ ] clause . Expression { clause . Or ( clause . Gt { Column : "score" , Value : 100 } , clause . Like { Column : "name" , Value : "%linus%" } ) } ,
} } ,
"SELECT * FROM `users` WHERE `users`.`id` = ? AND `age` > ? OR `name` <> ? AND (`score` > ? OR `name` LIKE ?)" , [ ] interface { } { "1" , 18 , "jinzhu" , 100 , "%linus%" } ,
} ,
{
[ ] clause . Interface { clause . Select { } , clause . From { } , clause . Where {
Exprs : [ ] clause . Expression { clause . Not ( clause . Eq { Column : clause . PrimaryColumn , Value : "1" } , clause . Gt { Column : "age" , Value : 18 } ) , clause . Or ( clause . Neq { Column : "name" , Value : "jinzhu" } ) } ,
} , clause . Where {
Exprs : [ ] clause . Expression { clause . Or ( clause . Not ( clause . Gt { Column : "score" , Value : 100 } ) , clause . Like { Column : "name" , Value : "%linus%" } ) } ,
} } ,
"SELECT * FROM `users` WHERE (`users`.`id` <> ? AND `age` <= ?) OR `name` <> ? AND (`score` <= ? OR `name` LIKE ?)" , [ ] interface { } { "1" , 18 , "jinzhu" , 100 , "%linus%" } ,
} ,
2020-06-19 20:55:30 +03:00
{
[ ] clause . Interface { clause . Select { } , clause . From { } , clause . Where {
Exprs : [ ] clause . Expression { clause . And ( clause . Eq { Column : "age" , Value : 18 } , clause . Or ( clause . Neq { Column : "name" , Value : "jinzhu" } ) ) } ,
} } ,
"SELECT * FROM `users` WHERE (`age` = ? OR `name` <> ?)" , [ ] interface { } { 18 , "jinzhu" } ,
} ,
2020-02-07 18:45:35 +03:00
}
for idx , result := range results {
t . Run ( fmt . Sprintf ( "case #%v" , idx ) , func ( t * testing . T ) {
checkBuildClauses ( t , result . Clauses , result . Result , result . Vars )
} )
}
}