mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-12 10:36:24 +05:00
401 lines
14 KiB
Go
401 lines
14 KiB
Go
package utils
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestCondLoader(t *testing.T) {
|
|
cl := &CondLoader{}
|
|
err := cl.Parse(`{"*or":[{"test":1},{"field":{"*gt":1}},{"best":"coco"}]}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
|
|
err = cl.Parse(`{"*has":["NAT","RET","EUR"]}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
err = cl.Parse(`{"Field":7, "Other":true}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
err = cl.Parse(``)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
}
|
|
|
|
func TestCondKeyValue(t *testing.T) {
|
|
o := struct {
|
|
Test string
|
|
Field float64
|
|
Other bool
|
|
ExpDate time.Time
|
|
}{
|
|
Test: "test",
|
|
Field: 6.0,
|
|
Other: true,
|
|
ExpDate: time.Date(2016, 1, 19, 20, 47, 0, 0, time.UTC),
|
|
}
|
|
cl := &CondLoader{}
|
|
err := cl.Parse(`{"Test":"test"}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":6}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Other":true}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":6, "Other":true}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":7, "Other":true}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":6, "Other":false}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Other":true, "Field":{"*gt":5}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Other":true, "Field":{"*gt":7}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(``)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"ExpDate":{"*exp":true}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"ExpDate":{"*exp":false}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"*and":[{"Field":{"*gte":50}},{"Test":{"*eq":"test"}}]}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"WrongFieldName":{"*eq":1}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || err == nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
}
|
|
|
|
func TestCondKeyValuePointer(t *testing.T) {
|
|
o := &struct {
|
|
Test string
|
|
Field float64
|
|
Other bool
|
|
}{
|
|
Test: "test",
|
|
Field: 6.0,
|
|
Other: true,
|
|
}
|
|
cl := &CondLoader{}
|
|
err := cl.Parse(`{"Test":"test"}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":6}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Other":true}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
}
|
|
|
|
func TestCondOperatorValue(t *testing.T) {
|
|
root := &operatorValue{operator: CondGT, value: 3.4}
|
|
if check, err := root.checkStruct(3.5); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(root))
|
|
}
|
|
root = &operatorValue{operator: CondEQ, value: 3.4}
|
|
if check, err := root.checkStruct(3.5); check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(root))
|
|
}
|
|
root = &operatorValue{operator: CondEQ, value: 3.4}
|
|
if check, err := root.checkStruct(3.4); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(root))
|
|
}
|
|
root = &operatorValue{operator: CondEQ, value: "zinc"}
|
|
if check, err := root.checkStruct("zinc"); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(root))
|
|
}
|
|
root = &operatorValue{operator: CondHAS, value: []interface{}{"NAT", "RET", "EUR"}}
|
|
if check, err := root.checkStruct(StringMap{"WOR": true, "EUR": true, "NAT": true, "RET": true, "ROM": true}); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", !check, err, ToIJSON(root))
|
|
}
|
|
}
|
|
|
|
func TestCondKeyStruct(t *testing.T) {
|
|
o := struct {
|
|
Test string
|
|
Field float64
|
|
Other bool
|
|
}{
|
|
Test: "test",
|
|
Field: 6.0,
|
|
Other: true,
|
|
}
|
|
cl := &CondLoader{}
|
|
err := cl.Parse(`{"Field":{"*gt": 5}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Test":{"*gt": 5}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || !strings.HasPrefix(err.Error(), "INVALID_ARGUMENT") {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":{"*gte": 6}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":{"*lt": 7}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":{"*lte": 6}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":{"*eq": 6}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Test":{"*eq": "test"}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
}
|
|
|
|
func TestCondKeyStructPointer(t *testing.T) {
|
|
o := &struct {
|
|
Test string
|
|
Field float64
|
|
Other bool
|
|
}{
|
|
Test: "test",
|
|
Field: 6.0,
|
|
Other: true,
|
|
}
|
|
cl := &CondLoader{}
|
|
err := cl.Parse(`{"Field":{"*gt": 5}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Test":{"*gt": 5}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || !strings.HasPrefix(err.Error(), "INVALID_ARGUMENT") {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":{"*gte": 6}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":{"*lt": 7}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":{"*lte": 6}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Field":{"*eq": 6}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"Test":{"*eq": "test"}}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
}
|
|
|
|
func TestCondOperatorSlice(t *testing.T) {
|
|
o := &struct {
|
|
Test string
|
|
Field float64
|
|
Other bool
|
|
}{
|
|
Test: "test",
|
|
Field: 6.0,
|
|
Other: true,
|
|
}
|
|
cl := &CondLoader{}
|
|
err := cl.Parse(`{"*or":[{"Test":"test"},{"Field":{"*gt":5}},{"Other":true}]}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"*or":[{"Test":"test"},{"Field":{"*gt":7}},{"Other":false}]}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"*and":[{"Test":"test"},{"Field":{"*gt":5}},{"Other":true}]}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
err = cl.Parse(`{"*and":[{"Test":"test"},{"Field":{"*gt":7}},{"Other":false}]}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
}
|
|
|
|
func TestCondMixed(t *testing.T) {
|
|
o := &struct {
|
|
Test string
|
|
Field float64
|
|
Categories StringMap
|
|
Other bool
|
|
}{
|
|
Test: "test",
|
|
Field: 6.0,
|
|
Categories: StringMap{"call": true, "data": true, "voice": true},
|
|
Other: true,
|
|
}
|
|
cl := &CondLoader{}
|
|
err := cl.Parse(`{"*and":[{"Test":"test"},{"Field":{"*gt":5}},{"Other":true},{"Categories":{"*has":["data", "call"]}}]}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
}
|
|
|
|
func TestCondBalanceType(t *testing.T) {
|
|
type Balance struct {
|
|
Value float64
|
|
}
|
|
|
|
o := &struct {
|
|
BalanceType string
|
|
Balance
|
|
}{
|
|
BalanceType: MONETARY,
|
|
Balance: Balance{Value: 10},
|
|
}
|
|
cl := &CondLoader{}
|
|
err := cl.Parse(`{"BalanceType":"*monetary","Value":10}`)
|
|
if err != nil {
|
|
t.Errorf("Error loading structure: %+v (%v)", ToIJSON(cl.rootElement), err)
|
|
}
|
|
if check, err := cl.Check(o); !check || err != nil {
|
|
t.Errorf("Error checking struct: %v %v (%v)", !check, err, ToIJSON(cl.rootElement))
|
|
}
|
|
}
|