mirror of
https://github.com/zhufuyi/sponge.git
synced 2025-10-06 01:07:08 +08:00
512 lines
9.0 KiB
Go
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)
|
|
})
|
|
}
|
|
}
|