Files
sponge/pkg/mysql/query/query_condition_test.go
zhuyasen 083a0499c1 init
2022-09-19 23:24:11 +08:00

512 lines
9.0 KiB
Go

package query
import (
"reflect"
"strings"
"testing"
)
func TestParams_ConvertToPage(t *testing.T) {
p := &Params{
Page: 1,
Size: 50,
Sort: "age,-name",
}
order, limit, offset := p.ConvertToPage()
t.Logf("order=%s, limit=%d, offset=%d", order, limit, offset)
}
func TestParams_ConvertToGormConditions(t *testing.T) {
type args struct {
columns []Column
}
tests := []struct {
name string
args args
want string
want1 []interface{}
wantErr bool
}{
// --------------------------- 只有1列查询 ------------------------------
{
name: "1 column eq",
args: args{
columns: []Column{
{
Name: "name",
Value: "关羽",
},
},
},
want: "name = ?",
want1: []interface{}{"关羽"},
wantErr: false,
},
{
name: "1 column neq",
args: args{
columns: []Column{
{
Name: "name",
Value: "关羽",
//Exp: "neq",
Exp: "!=",
},
},
},
want: "name <> ?",
want1: []interface{}{"关羽"},
wantErr: false,
},
{
name: "1 column gt",
args: args{
columns: []Column{
{
Name: "age",
Value: 20,
//Exp: Gt,
Exp: ">",
},
},
},
want: "age > ?",
want1: []interface{}{20},
wantErr: false,
},
{
name: "1 column gte",
args: args{
columns: []Column{
{
Name: "age",
Value: 20,
//Exp: Gte,
Exp: ">=",
},
},
},
want: "age >= ?",
want1: []interface{}{20},
wantErr: false,
},
{
name: "1 column lt",
args: args{
columns: []Column{
{
Name: "age",
Value: 20,
//Exp: Lt,
Exp: "<",
},
},
},
want: "age < ?",
want1: []interface{}{20},
wantErr: false,
},
{
name: "1 column lte",
args: args{
columns: []Column{
{
Name: "age",
Value: 20,
//Exp: Lte,
Exp: "<=",
},
},
},
want: "age <= ?",
want1: []interface{}{20},
wantErr: false,
},
{
name: "1 column like",
args: args{
columns: []Column{
{
Name: "name",
Value: "刘",
Exp: Like,
},
},
},
want: "name LIKE ?",
want1: []interface{}{"%刘%"},
wantErr: false,
},
// --------------------------- 有2列查询 ------------------------------
{
name: "2 columns eq and",
args: args{
columns: []Column{
{
Name: "name",
Value: "关羽",
},
{
Name: "gender",
Value: "男",
},
},
},
want: "name = ? AND gender = ?",
want1: []interface{}{"关羽", "男"},
wantErr: false,
},
{
name: "2 columns neq and",
args: args{
columns: []Column{
{
Name: "name",
Value: "关羽",
//Exp: Neq,
Exp: "!=",
},
{
Name: "name",
Value: "刘备",
//Exp: Neq,
Exp: "!=",
},
},
},
want: "name <> ? AND name <> ?",
want1: []interface{}{"关羽", "刘备"},
wantErr: false,
},
{
name: "2 columns gt and",
args: args{
columns: []Column{
{
Name: "gender",
Value: "男",
},
{
Name: "age",
Value: 20,
//Exp: Gt,
Exp: ">",
},
},
},
want: "gender = ? AND age > ?",
want1: []interface{}{"男", 20},
wantErr: false,
},
{
name: "2 columns gte and",
args: args{
columns: []Column{
{
Name: "gender",
Value: "男",
},
{
Name: "age",
Value: 20,
//Exp: Gte,
Exp: ">=",
},
},
},
want: "gender = ? AND age >= ?",
want1: []interface{}{"男", 20},
wantErr: false,
},
{
name: "2 columns lt and",
args: args{
columns: []Column{
{
Name: "gender",
Value: "女",
},
{
Name: "age",
Value: 20,
//Exp: Lt,
Exp: "<",
},
},
},
want: "gender = ? AND age < ?",
want1: []interface{}{"女", 20},
wantErr: false,
},
{
name: "2 columns lte and",
args: args{
columns: []Column{
{
Name: "gender",
Value: "女",
},
{
Name: "age",
Value: 20,
//Exp: Lte,
Exp: "<=",
},
},
},
want: "gender = ? AND age <= ?",
want1: []interface{}{"女", 20},
wantErr: false,
},
{
name: "2 columns range and",
args: args{
columns: []Column{
{
Name: "age",
Value: 10,
//Exp: Gte,
Exp: ">=",
},
{
Name: "age",
Value: 20,
//Exp: Lte,
Exp: "<=",
},
},
},
want: "age >= ? AND age <= ?",
want1: []interface{}{10, 20},
wantErr: false,
},
{
name: "2 columns eq or",
args: args{
columns: []Column{
{
Name: "name",
Value: "刘备",
//Logic: OR,
Logic: "||",
},
{
Name: "gender",
Value: "女",
},
},
},
want: "name = ? OR gender = ?",
want1: []interface{}{"刘备", "女"},
wantErr: false,
},
{
name: "2 columns neq or",
args: args{
columns: []Column{
{
Name: "name",
Value: "刘备",
//Logic: OR,
Logic: "||",
},
{
Name: "gender",
Value: "男",
//Exp: Neq,
Exp: "!=",
},
},
},
want: "name = ? OR gender <> ?",
want1: []interface{}{"刘备", "男"},
wantErr: false,
},
// ------------------------------ IN -------------------------------------------------
{
name: "3 columns eq and",
args: args{
columns: []Column{
{
Name: "name",
Value: "刘备",
},
{
Name: "name",
Value: "关羽",
},
{
Name: "name",
Value: "张飞",
},
},
},
want: "name IN (?)",
want1: []interface{}{[]interface{}{"刘备", "关羽", "张飞"}},
wantErr: false,
},
// ----------------------------error----------------------------------------------
{
name: "exp type err",
args: args{
columns: []Column{
{
Name: "gender",
Value: "男",
Exp: "xxxxxx",
},
},
},
want: "",
want1: nil,
wantErr: true,
},
{
name: "logic type err",
args: args{
columns: []Column{
{
Name: "gender",
Value: "男",
Logic: "xxxxxx",
},
},
},
want: "",
want1: nil,
wantErr: true,
},
{
name: "empty",
args: args{
columns: nil,
},
want: "",
want1: nil,
wantErr: false,
},
}
for _, tt := range tests {
params := &Params{
Columns: tt.args.columns,
}
t.Run(tt.name, func(t *testing.T) {
got, got1, err := params.ConvertToGormConditions()
if (err != nil) != tt.wantErr {
t.Errorf("ConvertToGormConditions() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ConvertToGormConditions() got = %v, want %v", got, tt.want)
}
if !reflect.DeepEqual(got1, tt.want1) {
t.Errorf("ConvertToGormConditions() got1 = %v, want %v", got1, tt.want1)
}
got = strings.Replace(got, "?", "%v", -1)
t.Logf(got, got1...)
})
}
}
func Test_getExpsAndLogics(t *testing.T) {
type args struct {
keyLen int
paramSrc string
}
tests := []struct {
name string
args args
want []string
want1 []string
}{
{
name: "0 columns",
args: args{
keyLen: 0,
paramSrc: "page=0&size=10",
},
want: []string{},
want1: []string{},
},
{
name: "1 columns",
args: args{
keyLen: 1,
paramSrc: "k=name&v=刘备&page=0&size=10",
},
want: []string{""},
want1: []string{""},
},
{
name: "1 columns gt",
args: args{
keyLen: 1,
paramSrc: "k=age&exp=gt&v=20&page=0&size=10",
},
want: []string{"gt"},
want1: []string{""},
},
{
name: "1 columns gt and",
args: args{
keyLen: 1,
paramSrc: "k=age&exp=gt&v=20&logic=or&page=0&size=10",
},
want: []string{"gt"},
want1: []string{"or"},
},
{
name: "2 columns",
args: args{
keyLen: 2,
paramSrc: "k=name&v=刘备&k=gender&v=男&page=0&size=10",
},
want: []string{"", ""},
want1: []string{"", ""},
},
{
name: "2 columns gt",
args: args{
keyLen: 2,
paramSrc: "k=name&v=刘备&k=age&v=20&exp=gt&page=0&size=10",
},
want: []string{"", "gt"},
want1: []string{"", ""},
},
{
name: "3 columns gt or",
args: args{
keyLen: 3,
paramSrc: "k=name&v=刘备&exp=neq&k=age&v=20&exp=gt&k=gender&v=男&logic=or&page=0&size=10",
},
want: []string{"neq", "gt", ""},
want1: []string{"", "", "or"},
},
{
name: "error",
args: args{
keyLen: 1,
paramSrc: "k=name&exp=gt&v=刘备&page=0&size=10",
},
want: []string{"gt"},
want1: []string{""},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, got1 := getExpsAndLogics(tt.args.keyLen, tt.args.paramSrc)
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("getExpsAndLogics() got = %v, want %v", got, tt.want)
}
if !reflect.DeepEqual(got1, tt.want1) {
t.Errorf("getExpsAndLogics() got1 = %v, want %v", got1, tt.want1)
}
t.Logf("%+v %+v", got, got1)
})
}
}