Files
paralus/pkg/service/audit_log_query_test.go
2022-06-17 13:19:25 +05:30

146 lines
4.8 KiB
Go

package service
import (
"bytes"
"encoding/json"
"strings"
"testing"
v1 "github.com/paralus/paralus/proto/rpc/audit"
v3 "github.com/paralus/paralus/proto/types/commonpb/v3"
)
type md struct {
Source []string `json:"_source"`
Aggs struct {
GroupByProject struct {
Aggs struct {
GroupByType struct {
Terms struct {
Field string `json:"field"`
Size int `json:"size"`
} `json:"terms"`
} `json:"group_by_type"`
GroupByUsername struct {
Terms struct {
Field string `json:"field"`
Size int `json:"size"`
} `json:"terms"`
} `json:"group_by_username"`
} `json:"aggs"`
Terms struct {
Field string `json:"field"`
Size int `json:"size"`
} `json:"terms"`
} `json:"group_by_project"`
GroupByType struct {
Terms struct {
Field string `json:"field"`
} `json:"terms"`
} `json:"group_by_type"`
GroupByUsername struct {
Terms struct {
Field string `json:"field"`
} `json:"terms"`
} `json:"group_by_username"`
} `json:"aggs"`
Query struct {
Bool struct {
Filter struct {
Range struct {
JSONTimestamp struct {
Gte string `json:"gte"`
Lt string `json:"lt"`
} `json:"json.timestamp"`
} `json:"range"`
} `json:"filter"`
Must []struct {
Term struct {
JSONCategory string `json:"json.category"`
} `json:"term,omitempty"`
Terms struct {
JSONProject []string `json:"json.project"`
} `json:"terms,omitempty"`
QueryString struct {
Query string `json:"query"`
} `json:"query_string,omitempty"`
} `json:"must"`
} `json:"bool"`
} `json:"query"`
Size int `json:"size"`
Sort struct {
JSONTimestamp struct {
Order string `json:"order"`
} `json:"json.timestamp"`
} `json:"sort"`
}
type mockElasticSearchQuery struct {
msg []bytes.Buffer
}
func (m *mockElasticSearchQuery) Handle(msg bytes.Buffer) (map[string]interface{}, error) {
m.msg = append(m.msg, msg)
return map[string]interface{}{}, nil
}
func TestGetAuditLogByProjectsSimple(t *testing.T) {
esq := &mockElasticSearchQuery{}
al := &AuditLogService{auditQuery: esq}
req := v1.AuditLogSearchRequest{
Filter: &v1.AuditLogQueryFilter{
QueryString: "query-string",
Projects: []string{"project-one", "project-two"},
Timefrom: "now-1h",
Type: "fake-type",
User: "fake-user",
Client: "fake-client",
DashboardData: true,
},
}
_, err := al.GetAuditLogByProjects(&req)
if err != nil {
t.Error("unable to get audit logs")
}
if len(esq.msg) != 1 {
t.Fatalf("incorrect number of searches; expected '%v', got '%v'", 1, len(esq.msg))
}
m := &md{}
err = json.Unmarshal(esq.msg[0].Bytes(), m)
if err != nil {
t.Fatal("unable to unmarshall es request")
}
expected := `{"_source":["json"],"aggs":{"group_by_project":{"aggs":{"group_by_type":{"terms":{"field":"json.type","size":1000}},"group_by_username":{"terms":{"field":"json.actor.account.username","size":1000}}},"terms":{"field":"json.project","size":1000}},"group_by_type":{"terms":{"field":"json.type"}},"group_by_username":{"terms":{"field":"json.actor.account.username"}}},"query":{"bool":{"filter":{"range":{"json.timestamp":{"gte":"now-1h","lt":"now"}}},"must":[{"term":{"json.category":"AUDIT"}},{"term":{"json.type":"fake-type"}},{"term":{"json.actor.account.username":"fake-user"}},{"term":{"json.client.type":"fake-client"}},{"terms":{"json.project":["project-one","project-two"]}},{"query_string":{"query":"query-string"}}]}},"size":0,"sort":{"json.timestamp":{"order":"desc"}}}`
if strings.TrimSpace(esq.msg[0].String()) != expected {
t.Errorf("incorrect es query; expected '%v', got '%v'", expected, strings.TrimSpace(esq.msg[0].String()))
}
}
func TestGetAuditLogByProjectsNoProject(t *testing.T) {
esq := &mockElasticSearchQuery{}
al := &AuditLogService{auditQuery: esq}
req := v1.AuditLogSearchRequest{
Metadata: &v3.Metadata{UrlScope: "url/project"},
Filter: &v1.AuditLogQueryFilter{
QueryString: "query-string",
},
}
_, err := al.GetAuditLog(&req)
if err != nil {
t.Error("unable to get audit logs", err)
}
if len(esq.msg) != 1 {
t.Fatalf("incorrect number of searches; expected '%v', got '%v'", 1, len(esq.msg))
}
m := &md{}
err = json.Unmarshal(esq.msg[0].Bytes(), m)
if err != nil {
t.Fatal("unable to unmarshall es request")
}
expected := `{"_source":["json"],"aggs":{"group_by_type":{"terms":{"field":"json.type"}},"group_by_username":{"terms":{"field":"json.actor.account.username"}}},"query":{"bool":{"must":[{"term":{"json.category":"AUDIT"}},{"terms":{"json.project":["project"]}},{"query_string":{"query":"query-string"}}]}},"size":500,"sort":{"json.timestamp":{"order":"desc"}}}`
if strings.TrimSpace(esq.msg[0].String()) != expected {
t.Errorf("incorrect es query; expected '%v', got '%v'", expected, strings.TrimSpace(esq.msg[0].String()))
}
}