Skip to content

Commit 1ccb78e

Browse files
committed
Add test case for all the filter evaluation methods
1 parent 8fdf7fb commit 1ccb78e

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed

internal/filter/filter_test.go

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package filter
2+
3+
import (
4+
"errors"
5+
"github.com/stretchr/testify/assert"
6+
"regexp"
7+
"strings"
8+
"testing"
9+
)
10+
11+
const unknown string = "unknown"
12+
13+
var evalError = errors.New("evaluation error")
14+
15+
func TestFilter(t *testing.T) {
16+
t.Parallel()
17+
18+
filterable := &filterableType{
19+
key: "domain",
20+
value: "example.com",
21+
}
22+
23+
t.Run("InvalidOperator", func(t *testing.T) {
24+
chain, err := NewChain("unknown", nil)
25+
assert.Nil(t, chain)
26+
assert.EqualError(t, err, "invalid logical operator provided: \"unknown\"")
27+
28+
condition, err := NewCondition("column", "unknown", "value")
29+
assert.Nil(t, condition)
30+
assert.EqualError(t, err, "invalid comparison operator provided: \"unknown\"")
31+
})
32+
33+
t.Run("EvaluationError", func(t *testing.T) {
34+
t.Parallel()
35+
36+
testInvalidData := []struct {
37+
Expression string
38+
}{
39+
{"domain=" + unknown},
40+
{"domain!=" + unknown},
41+
{"domain<" + unknown},
42+
{"domain<=" + unknown},
43+
{"domain>" + unknown},
44+
{"domain>=" + unknown},
45+
{"domain~" + unknown},
46+
{"domain!~" + unknown},
47+
{"!(domain!=" + unknown + ")"},
48+
{"domain=" + unknown + "&domain<=test.example.com"},
49+
{"domain<=" + unknown + "|domain<=test.example.com"},
50+
}
51+
52+
for _, td := range testInvalidData {
53+
f, err := Parse(td.Expression)
54+
assert.NoError(t, err)
55+
56+
matched, err := f.Eval(filterable)
57+
assert.EqualError(t, err, evalError.Error())
58+
assert.Equal(t, matched, false, "unexpected filter result for %q", td.Expression)
59+
}
60+
})
61+
62+
t.Run("EvaluateFilter", func(t *testing.T) {
63+
t.Parallel()
64+
65+
testdata := []struct {
66+
Expression string
67+
Expected bool
68+
}{
69+
{"domain=example.com", true},
70+
{"domain!=example.com", false},
71+
{"domain=test.example.com", false},
72+
{"name!=example.com", false},
73+
{"domain", true},
74+
{"name", false},
75+
{"display_name", false},
76+
{"!name", true},
77+
{"domain~example*", true},
78+
{"domain!~example*", false},
79+
{"domain~example*&!domain", false},
80+
{"domain>a", true},
81+
{"domain<a", false},
82+
{"domain>z", false},
83+
{"domain<z", true},
84+
{"domain>=example&domain<=test.example.com", true},
85+
{"domain<=example|domain<=test.example.com", true},
86+
{"domain<=example|domain>=test.example.com", false},
87+
}
88+
89+
for _, td := range testdata {
90+
f, err := Parse(td.Expression)
91+
if assert.NoError(t, err, "parsing %q should not return an error", td.Expression) {
92+
matched, err := f.Eval(filterable)
93+
assert.NoError(t, err)
94+
assert.Equal(t, td.Expected, matched, "unexpected filter result for %q", td.Expression)
95+
}
96+
}
97+
})
98+
}
99+
100+
type filterableType struct {
101+
key string
102+
value string
103+
}
104+
105+
func (f *filterableType) EvalEqual(_ string, value string) (bool, error) {
106+
if value == unknown {
107+
return false, evalError
108+
}
109+
110+
return strings.EqualFold(f.value, value), nil
111+
}
112+
113+
func (f *filterableType) EvalLess(_ string, value string) (bool, error) {
114+
if value == unknown {
115+
return false, evalError
116+
}
117+
118+
return f.value < value, nil
119+
}
120+
121+
func (f *filterableType) EvalLike(_ string, value string) (bool, error) {
122+
if value == unknown {
123+
return false, evalError
124+
}
125+
126+
regex := regexp.MustCompile("^example.*$")
127+
return regex.MatchString(f.value), nil
128+
}
129+
130+
func (f *filterableType) EvalLessOrEqual(_ string, value string) (bool, error) {
131+
if value == unknown {
132+
return false, evalError
133+
}
134+
135+
return f.value <= value, nil
136+
}
137+
138+
func (f *filterableType) EvalExists(key string) bool {
139+
return f.key == key
140+
}

0 commit comments

Comments
 (0)