1
0
Fork 0
golang-github-pocketbase-dbx/expression_test.go
Daniel Baumann 02cacc5b45
Adding upstream version 1.11.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-22 10:43:26 +02:00

196 lines
5.8 KiB
Go

// Copyright 2016 Qiang Xue. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package dbx
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestExp(t *testing.T) {
params := Params{"k2": "v2"}
e1 := NewExp("s1").(*Exp)
assert.Equal(t, e1.Build(nil, params), "s1", "e1.Build()")
assert.Equal(t, len(params), 1, `len(params)@1`)
e2 := NewExp("s2", Params{"k1": "v1"}).(*Exp)
assert.Equal(t, e2.Build(nil, params), "s2", "e2.Build()")
assert.Equal(t, len(params), 2, `len(params)@2`)
}
func TestHashExp(t *testing.T) {
e1 := HashExp{}
assert.Equal(t, e1.Build(nil, nil), "", `e1.Build()`)
e2 := HashExp{
"k1": nil,
"k2": NewExp("s1", Params{"ka": "va"}),
"k3": 1.1,
"k4": "abc",
"k5": []interface{}{1, 2},
}
db := getDB()
params := Params{"k0": "v0"}
expected := "`k1` IS NULL AND (s1) AND `k3`={:p2} AND `k4`={:p3} AND `k5` IN ({:p4}, {:p5})"
assert.Equal(t, e2.Build(db, params), expected, `e2.Build()`)
assert.Equal(t, len(params), 6, `len(params)`)
assert.Equal(t, params["p5"].(int), 2, `params["p5"]`)
}
func TestNotExp(t *testing.T) {
e1 := Not(NewExp("s1"))
assert.Equal(t, e1.Build(nil, nil), "NOT (s1)", `e1.Build()`)
e2 := Not(NewExp(""))
assert.Equal(t, e2.Build(nil, nil), "", `e2.Build()`)
}
func TestAndOrExp(t *testing.T) {
e1 := And(NewExp("s1", Params{"k1": "v1"}), NewExp(""), NewExp("s2", Params{"k2": "v2"}))
params := Params{}
assert.Equal(t, e1.Build(nil, params), "(s1) AND (s2)", `e1.Build()`)
assert.Equal(t, len(params), 2, `len(params)`)
e2 := Or(NewExp("s1"), NewExp("s2"))
assert.Equal(t, e2.Build(nil, nil), "(s1) OR (s2)", `e2.Build()`)
e3 := And()
assert.Equal(t, e3.Build(nil, nil), "", `e3.Build()`)
e4 := And(NewExp("s1"))
assert.Equal(t, e4.Build(nil, nil), "s1", `e4.Build()`)
e5 := And(NewExp("s1"), nil)
assert.Equal(t, e5.Build(nil, nil), "s1", `e5.Build()`)
}
func TestInExp(t *testing.T) {
db := getDB()
e1 := In("age", 1, 2, 3)
params := Params{}
assert.Equal(t, e1.Build(db, params), "`age` IN ({:p0}, {:p1}, {:p2})", `e1.Build()`)
assert.Equal(t, len(params), 3, `len(params)@1`)
e2 := In("age", 1)
params = Params{}
assert.Equal(t, e2.Build(db, params), "`age`={:p0}", `e2.Build()`)
assert.Equal(t, len(params), 1, `len(params)@2`)
e3 := NotIn("age", 1, 2, 3)
params = Params{}
assert.Equal(t, e3.Build(db, params), "`age` NOT IN ({:p0}, {:p1}, {:p2})", `e3.Build()`)
assert.Equal(t, len(params), 3, `len(params)@3`)
e4 := NotIn("age", 1)
params = Params{}
assert.Equal(t, e4.Build(db, params), "`age`<>{:p0}", `e4.Build()`)
assert.Equal(t, len(params), 1, `len(params)@4`)
e5 := In("age")
assert.Equal(t, e5.Build(db, nil), "0=1", `e5.Build()`)
e6 := NotIn("age")
assert.Equal(t, e6.Build(db, nil), "", `e6.Build()`)
}
func TestLikeExp(t *testing.T) {
db := getDB()
e1 := Like("name", "a", "b", "c")
params := Params{}
assert.Equal(t, e1.Build(db, params), "`name` LIKE {:p0} AND `name` LIKE {:p1} AND `name` LIKE {:p2}", `e1.Build()`)
assert.Equal(t, len(params), 3, `len(params)@1`)
e2 := Like("name", "a")
params = Params{}
assert.Equal(t, e2.Build(db, params), "`name` LIKE {:p0}", `e2.Build()`)
assert.Equal(t, len(params), 1, `len(params)@2`)
e3 := Like("name")
assert.Equal(t, e3.Build(db, nil), "", `e3.Build()`)
e4 := NotLike("name", "a", "b", "c")
params = Params{}
assert.Equal(t, e4.Build(db, params), "`name` NOT LIKE {:p0} AND `name` NOT LIKE {:p1} AND `name` NOT LIKE {:p2}", `e4.Build()`)
assert.Equal(t, len(params), 3, `len(params)@4`)
e5 := OrLike("name", "a", "b", "c")
params = Params{}
assert.Equal(t, e5.Build(db, params), "`name` LIKE {:p0} OR `name` LIKE {:p1} OR `name` LIKE {:p2}", `e5.Build()`)
assert.Equal(t, len(params), 3, `len(params)@5`)
e6 := OrNotLike("name", "a", "b", "c")
params = Params{}
assert.Equal(t, e6.Build(db, params), "`name` NOT LIKE {:p0} OR `name` NOT LIKE {:p1} OR `name` NOT LIKE {:p2}", `e6.Build()`)
assert.Equal(t, len(params), 3, `len(params)@6`)
e7 := Like("name", "a_\\%")
params = Params{}
e7.Build(db, params)
assert.Equal(t, params["p0"], "%a\\_\\\\\\%%", `params["p0"]@1`)
e8 := Like("name", "a").Match(false, true)
params = Params{}
e8.Build(db, params)
assert.Equal(t, params["p0"], "a%", `params["p0"]@2`)
e9 := Like("name", "a").Match(true, false)
params = Params{}
e9.Build(db, params)
assert.Equal(t, params["p0"], "%a", `params["p0"]@3`)
e10 := Like("name", "a").Match(false, false)
params = Params{}
e10.Build(db, params)
assert.Equal(t, params["p0"], "a", `params["p0"]@4`)
e11 := Like("name", "%a").Match(false, false).Escape()
params = Params{}
e11.Build(db, params)
assert.Equal(t, params["p0"], "%a", `params["p0"]@5`)
}
func TestBetweenExp(t *testing.T) {
db := getDB()
e1 := Between("age", 30, 40)
params := Params{}
assert.Equal(t, e1.Build(db, params), "`age` BETWEEN {:p0} AND {:p1}", `e1.Build()`)
assert.Equal(t, len(params), 2, `len(params)@1`)
e2 := NotBetween("age", 30, 40)
params = Params{}
assert.Equal(t, e2.Build(db, params), "`age` NOT BETWEEN {:p0} AND {:p1}", `e2.Build()`)
assert.Equal(t, len(params), 2, `len(params)@2`)
}
func TestExistsExp(t *testing.T) {
e1 := Exists(NewExp("s1"))
assert.Equal(t, e1.Build(nil, nil), "EXISTS (s1)", `e1.Build()`)
e2 := NotExists(NewExp("s1"))
assert.Equal(t, e2.Build(nil, nil), "NOT EXISTS (s1)", `e2.Build()`)
e3 := Exists(NewExp(""))
assert.Equal(t, e3.Build(nil, nil), "0=1", `e3.Build()`)
e4 := NotExists(NewExp(""))
assert.Equal(t, e4.Build(nil, nil), "", `e4.Build()`)
}
func TestEncloseExp(t *testing.T) {
e1 := Enclose(NewExp(""))
assert.Equal(t, e1.Build(nil, nil), "", `e1.Build()`)
e2 := Enclose(NewExp("s1"))
assert.Equal(t, e2.Build(nil, nil), "(s1)", `e2.Build()`)
e3 := Enclose(NewExp("(s1)"))
assert.Equal(t, e3.Build(nil, nil), "((s1))", `e3.Build()`)
}