100 lines
2.9 KiB
Go
100 lines
2.9 KiB
Go
package app
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestAuditFiltersFromRequest(t *testing.T) {
|
|
t.Parallel()
|
|
request := httptest.NewRequest(
|
|
"GET",
|
|
"/portal?audit_range=7d&audit_event=package_downloaded&audit_customer=Acme&audit_user=taiadmin&audit_hostname=pve01&audit_package=sentinelone-linux&audit_ip=10.10.1.25&audit_details=install-rmm",
|
|
nil,
|
|
)
|
|
filters := auditFiltersFromRequest(request)
|
|
expected := auditFilters{
|
|
TimeRange: "7d",
|
|
EventType: "package_downloaded",
|
|
CustomerLabel: "Acme",
|
|
User: "taiadmin",
|
|
Hostname: "pve01",
|
|
PackageSlug: "sentinelone-linux",
|
|
SourceIP: "10.10.1.25",
|
|
Details: "install-rmm",
|
|
}
|
|
if !reflect.DeepEqual(filters, expected) {
|
|
t.Fatalf("filters = %#v, want %#v", filters, expected)
|
|
}
|
|
}
|
|
|
|
func TestAuditFiltersDefaultToThirtyDays(t *testing.T) {
|
|
t.Parallel()
|
|
request := httptest.NewRequest("GET", "/portal?audit_range=invalid", nil)
|
|
if filters := auditFiltersFromRequest(request); filters.TimeRange != "30d" {
|
|
t.Fatalf("time range = %q, want 30d", filters.TimeRange)
|
|
}
|
|
}
|
|
|
|
func TestAuditFiltersAcceptLegacyActorParameter(t *testing.T) {
|
|
t.Parallel()
|
|
request := httptest.NewRequest("GET", "/portal?audit_actor=legacy-user", nil)
|
|
if filters := auditFiltersFromRequest(request); filters.User != "legacy-user" {
|
|
t.Fatalf("user = %q, want legacy-user", filters.User)
|
|
}
|
|
}
|
|
|
|
func TestHasAuditQuery(t *testing.T) {
|
|
t.Parallel()
|
|
if !hasAuditQuery(httptest.NewRequest("GET", "/portal?audit_hostname=pve01", nil)) {
|
|
t.Fatal("expected audit query to be detected")
|
|
}
|
|
if hasAuditQuery(httptest.NewRequest("GET", "/portal?notice=updated", nil)) {
|
|
t.Fatal("non-audit query must stay on the Codes view")
|
|
}
|
|
}
|
|
|
|
func TestAuditQueryUsesPlaceholders(t *testing.T) {
|
|
t.Parallel()
|
|
filters := auditFilters{
|
|
TimeRange: "all",
|
|
EventType: "package_downloaded",
|
|
CustomerLabel: "Acme",
|
|
User: "taiadmin",
|
|
Hostname: "pve01",
|
|
PackageSlug: "sentinelone-linux",
|
|
SourceIP: "10.10.1.25",
|
|
Details: "install-rmm",
|
|
}
|
|
query, arguments := auditQuery(filters, 250)
|
|
if strings.Contains(query, filters.CustomerLabel) ||
|
|
strings.Contains(query, filters.User) ||
|
|
strings.Contains(query, filters.Hostname) {
|
|
t.Fatal("filter values must not be interpolated into the SQL query")
|
|
}
|
|
if strings.Contains(query, "INTERVAL") {
|
|
t.Fatal("all-time query must not include a time restriction")
|
|
}
|
|
if strings.Contains(query, "lan_ip") {
|
|
t.Fatal("audit query must use the single source_ip column")
|
|
}
|
|
if !strings.HasSuffix(query, "ORDER BY ae.created_at DESC LIMIT ?") {
|
|
t.Fatalf("query has unexpected limit: %s", query)
|
|
}
|
|
expectedArguments := []any{
|
|
"package_downloaded",
|
|
"Acme",
|
|
"taiadmin",
|
|
"pve01",
|
|
"sentinelone-linux",
|
|
"install-rmm",
|
|
"10.10.1.25",
|
|
250,
|
|
}
|
|
if !reflect.DeepEqual(arguments, expectedArguments) {
|
|
t.Fatalf("arguments = %#v, want %#v", arguments, expectedArguments)
|
|
}
|
|
}
|