-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsort_test.go
More file actions
97 lines (89 loc) · 3.44 KB
/
sort_test.go
File metadata and controls
97 lines (89 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// SPDX-FileCopyrightText: 2024 Greenbone AG <https://greenbone.net>
//
// SPDX-License-Identifier: AGPL-3.0-or-later
package openSearchQuery
import (
"testing"
"github.com/aquasecurity/esquery"
"github.com/greenbone/opensight-golang-libraries/pkg/query/sorting"
"github.com/stretchr/testify/assert"
)
type SortingTestCase struct {
SortingRequest *sorting.Request
ExpectedQueryJson string
ExpectedErrorMessage string
}
func TestSorting(t *testing.T) {
testCases := map[string]SortingTestCase{
"no sorting": {
SortingRequest: nil,
ExpectedQueryJson: `{"aggs":{"vulnerabilityWithAssetCountAgg":{"terms":{"field":"vulnerabilityTest.oid.keyword"}}},"query":{"bool":{}},"size":0}`,
},
"sorting by severity": {
SortingRequest: &sorting.Request{
SortColumn: "severity",
SortDirection: "desc",
},
ExpectedQueryJson: `{"aggs":{"vulnerabilityWithAssetCountAgg":{"aggs":{"maxSeverity":{"max":{"field":"vulnerabilityTest.severityCvss.override"}}},"terms":{"field":"vulnerabilityTest.oid.keyword","order":{"maxSeverity.value":"DESC"}}}},"query":{"bool":{}},"size":0}`,
},
"sorting by qod": {
SortingRequest: &sorting.Request{
SortColumn: "qod",
SortDirection: "desc",
},
ExpectedQueryJson: `{"aggs":{"vulnerabilityWithAssetCountAgg":{"aggs":{"maxQod":{"max":{"field":"qod"}}},"terms":{"field":"vulnerabilityTest.oid.keyword","order":{"maxQod.value":"DESC"}}}},"query":{"bool":{}},"size":0}`,
},
"sorting by unknown Field": {
SortingRequest: &sorting.Request{
SortColumn: "unknown",
SortDirection: "desc",
},
ExpectedQueryJson: `{"aggs":{"vulnerabilityWithAssetCountAgg":{"terms":{"field":"vulnerabilityTest.oid.keyword"}}},"query":{"bool":{}},"size":0}`,
ExpectedErrorMessage: "unknown is no valid sort column, possible values:",
},
"sorting qod asc": {
SortingRequest: &sorting.Request{
SortColumn: "qod",
SortDirection: "asc",
},
ExpectedQueryJson: `{"aggs":{"vulnerabilityWithAssetCountAgg":{"aggs":{"maxQod":{"max":{"field":"qod"}}},"terms":{"field":"vulnerabilityTest.oid.keyword","order":{"maxQod.value":"ASC"}}}},"query":{"bool":{}},"size":0}`,
ExpectedErrorMessage: "",
},
}
for name := range testCases {
t.Run(name, func(t *testing.T) {
q := NewBoolQueryBuilder(&QuerySettings{})
subAggs := []esquery.Aggregation{}
subAggs, err := AddMaxAggForSorting(subAggs, testCases[name].SortingRequest, sortFieldMapping)
if testCases[name].ExpectedErrorMessage != "" {
assert.Error(t, err)
assert.Contains(t, err.Error(), testCases[name].ExpectedErrorMessage)
return
} else {
assert.Nil(t, err)
}
termsAggregation := esquery.TermsAgg("vulnerabilityWithAssetCountAgg", "vulnerabilityTest.oid.keyword").
Aggs(subAggs...)
termsAggregation, err = AddOrder(termsAggregation,
testCases[name].SortingRequest, sortFieldMapping)
resultingJson, queryErr := esquery.Search().Query(q.Build()).Aggs(termsAggregation).Size(0).MarshalJSON()
assert.Nil(t, queryErr)
assert.JSONEq(t, testCases[name].ExpectedQueryJson, string(resultingJson))
})
}
}
var sortFieldMapping = map[string]EffectiveSortField{
"severity": {
PlainField: strPtr("vulnerabilityTest.severityCvss.override"),
AggregationName: strPtr("maxSeverity"),
AggregationValue: "maxSeverity.value",
},
"qod": {
PlainField: strPtr("qod"),
AggregationName: strPtr("maxQod"),
AggregationValue: "maxQod.value",
},
}
func strPtr(s string) *string {
return &s
}