Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 57 additions & 44 deletions pkg/eventrepo/event_repo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -547,7 +547,6 @@ func TestListIndexesAdvanced(t *testing.T) {
Tags: []string{"vehicle", "telemetry", "status"},
}

// Add an event with different tags for testing ArrayFilterOption
eventIdx4 := &cloudevent.CloudEventHeader{
ID: "event-source3-producer4",
Subject: subject1,
Expand Down Expand Up @@ -577,10 +576,10 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "filter by single type status events",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Type: &grpc.StringFilterOption{
HasAny: []string{cloudevent.TypeStatus},
In: []string{cloudevent.TypeStatus},
},
},
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
Expand All @@ -589,10 +588,10 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "filter by multiple types with OR logic",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Type: &grpc.StringFilterOption{
HasAny: []string{cloudevent.TypeStatus, cloudevent.TypeFingerprint},
In: []string{cloudevent.TypeStatus, cloudevent.TypeFingerprint},
},
},
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3, keyTypeFingerprintSource2Producer2, keyTypeStatusSource1Producer1},
Expand All @@ -601,11 +600,10 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "filter by type with negation",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Type: &grpc.StringFilterOption{
HasAny: []string{cloudevent.TypeFingerprint},
Negate: true,
NotIn: []string{cloudevent.TypeFingerprint},
},
},
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
Expand All @@ -614,10 +612,10 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "filter by source: multiple results",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Source: &grpc.StringFilterOption{
HasAny: []string{"source-1"},
In: []string{"source-1"},
},
},
expectedIndexKeys: []string{keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
Expand All @@ -626,13 +624,13 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "combine multiple filters (AND logic)",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Type: &grpc.StringFilterOption{
HasAny: []string{cloudevent.TypeStatus},
In: []string{cloudevent.TypeStatus},
},
Source: &grpc.StringFilterOption{
HasAny: []string{"source-1"},
In: []string{"source-1"},
},
},
expectedIndexKeys: []string{keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
Expand All @@ -641,13 +639,12 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "OR logic within StringFilterOption",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Type: &grpc.StringFilterOption{
HasAny: []string{cloudevent.TypeAttestation},
Or: &grpc.StringFilterOption{
HasAny: []string{cloudevent.TypeStatus},
Negate: true,
In: []string{cloudevent.TypeAttestation},
Or: []*grpc.StringFilterOption{
{NotIn: []string{cloudevent.TypeStatus}},
},
},
},
Expand All @@ -657,10 +654,10 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "no matching records",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Type: &grpc.StringFilterOption{
HasAny: []string{"non-existent-type"},
In: []string{"non-existent-type"},
},
},
expectedIndexKeys: []string{},
Expand All @@ -670,10 +667,10 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "filter by tags: has any (telemetry)",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Tags: &grpc.ArrayFilterOption{
HasAny: []string{"telemetry"},
ContainsAny: []string{"telemetry"},
},
},
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3},
Expand All @@ -682,10 +679,10 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "filter by tags: has all (vehicle AND status)",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Tags: &grpc.ArrayFilterOption{
HasAll: []string{"vehicle", "status"},
ContainsAll: []string{"vehicle", "status"},
},
},
expectedIndexKeys: []string{keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
Expand All @@ -694,23 +691,25 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "filter by tags: has any with multiple values",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Tags: &grpc.ArrayFilterOption{
HasAny: []string{"security", "realtime"},
ContainsAny: []string{"security", "realtime"},
Or: []*grpc.ArrayFilterOption{
{ContainsAll: []string{"vehicle", "status"}},
},
},
},
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeFingerprintSource2Producer2},
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeStatusSource1Producer3, keyTypeFingerprintSource2Producer2, keyTypeStatusSource1Producer1},
},
{
name: "filter by tags: negated has_any",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Tags: &grpc.ArrayFilterOption{
HasAny: []string{"vehicle"},
Negate: true,
NotContainsAny: []string{"vehicle"},
},
},
expectedIndexKeys: []string{keyTypeStatusSource3Producer4, keyTypeFingerprintSource2Producer2},
Expand All @@ -719,12 +718,12 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "complex tags filter: has_any OR has_all combination",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Tags: &grpc.ArrayFilterOption{
HasAny: []string{"fingerprint"},
Or: &grpc.ArrayFilterOption{
HasAll: []string{"telemetry", "realtime"},
ContainsAny: []string{"fingerprint"},
Or: []*grpc.ArrayFilterOption{
{ContainsAll: []string{"telemetry", "realtime"}},
},
},
},
Expand All @@ -734,12 +733,12 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "complex tags filter: has_all with OR chain",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Tags: &grpc.ArrayFilterOption{
HasAll: []string{"vehicle", "telemetry"},
Or: &grpc.ArrayFilterOption{
HasAny: []string{"security"},
ContainsAll: []string{"vehicle", "telemetry"},
Or: []*grpc.ArrayFilterOption{
{ContainsAny: []string{"security"}},
},
},
},
Expand All @@ -749,23 +748,37 @@ func TestListIndexesAdvanced(t *testing.T) {
name: "complex negated tags with multiple conditions",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
HasAny: []string{subject1},
In: []string{subject1},
},
Tags: &grpc.ArrayFilterOption{
HasAny: []string{"fingerprint", "telemetry"},
Negate: true, // Does NOT have fingerprint or telemetry
Or: &grpc.ArrayFilterOption{
HasAll: []string{"telemetry", "status"},
NotContainsAny: []string{"fingerprint", "telemetry"},
Or: []*grpc.ArrayFilterOption{
{ContainsAll: []string{"telemetry", "status"}},
},
},
},
expectedIndexKeys: []string{keyTypeStatusSource1Producer3, keyTypeStatusSource1Producer1},
},
{
name: "complex negated tags with or override",
advancedOpts: &grpc.AdvancedSearchOptions{
Subject: &grpc.StringFilterOption{
In: []string{subject1},
},
Tags: &grpc.ArrayFilterOption{
ContainsAll: []string{"vehicle", "telemetry"},
NotContainsAny: []string{"fingerprint", "telemetry", "security"},
Or: []*grpc.ArrayFilterOption{
{ContainsAll: []string{"telemetry", "status"}},
},
},
},
expectedIndexKeys: []string{keyTypeStatusSource1Producer3},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
results, err := indexService.ListIndexesAdvanced(t.Context(), 10, tt.advancedOpts)
if tt.expectedError {
require.Error(t, err, "Expected error but got none")
Expand Down
Loading