mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
	
	
		
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | package models | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"testing" | ||
|  | 
 | ||
|  | 	"github.com/stretchr/testify/require" | ||
|  | ) | ||
|  | 
 | ||
|  | func TestApplyQueryFilters(t *testing.T) { | ||
|  | 	tests := []struct { | ||
|  | 		name         string | ||
|  | 		query        string | ||
|  | 		adhocFilters []ScopeFilter | ||
|  | 		scopeFilters []ScopeFilter | ||
|  | 		expected     string | ||
|  | 		expectErr    bool | ||
|  | 	}{ | ||
|  | 		{ | ||
|  | 			name:      "No filters with no existing filter", | ||
|  | 			query:     `http_requests_total`, | ||
|  | 			expected:  `http_requests_total`, | ||
|  | 			expectErr: false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			name:      "No filters with existing filter", | ||
|  | 			query:     `http_requests_total{job="prometheus"}`, | ||
|  | 			expected:  `http_requests_total{job="prometheus"}`, | ||
|  | 			expectErr: false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			name:  "Adhoc filter with existing filter", | ||
|  | 			query: `http_requests_total{job="prometheus"}`, | ||
|  | 			adhocFilters: []ScopeFilter{ | ||
|  | 				{Key: "method", Value: "get", Operator: FilterOperatorEquals}, | ||
|  | 			}, | ||
|  | 			expected:  `http_requests_total{job="prometheus",method="get"}`, | ||
|  | 			expectErr: false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			name:  "Adhoc filter with no existing filter", | ||
|  | 			query: `http_requests_total`, | ||
|  | 			adhocFilters: []ScopeFilter{ | ||
|  | 				{Key: "method", Value: "get", Operator: FilterOperatorEquals}, | ||
|  | 				{Key: "job", Value: "prometheus", Operator: FilterOperatorEquals}, | ||
|  | 			}, | ||
|  | 			expected:  `http_requests_total{job="prometheus",method="get"}`, | ||
|  | 			expectErr: false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			name:  "Scope filter", | ||
|  | 			query: `http_requests_total{job="prometheus"}`, | ||
|  | 			scopeFilters: []ScopeFilter{ | ||
|  | 				{Key: "status", Value: "200", Operator: FilterOperatorEquals}, | ||
|  | 			}, | ||
|  | 			expected:  `http_requests_total{job="prometheus",status="200"}`, | ||
|  | 			expectErr: false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			name:  "Adhoc and Scope filter no existing filter", | ||
|  | 			query: `http_requests_total`, | ||
|  | 			scopeFilters: []ScopeFilter{ | ||
|  | 				{Key: "status", Value: "200", Operator: FilterOperatorEquals}, | ||
|  | 			}, | ||
|  | 			adhocFilters: []ScopeFilter{ | ||
|  | 				{Key: "job", Value: "prometheus", Operator: FilterOperatorEquals}, | ||
|  | 			}, | ||
|  | 			expected:  `http_requests_total{job="prometheus",status="200"}`, | ||
|  | 			expectErr: false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			name:  "Adhoc and Scope filter conflict - adhoc wins", | ||
|  | 			query: `http_requests_total{job="prometheus"}`, | ||
|  | 			scopeFilters: []ScopeFilter{ | ||
|  | 				{Key: "status", Value: "404", Operator: FilterOperatorEquals}, | ||
|  | 			}, | ||
|  | 			adhocFilters: []ScopeFilter{ | ||
|  | 				{Key: "status", Value: "200", Operator: FilterOperatorEquals}, | ||
|  | 			}, | ||
|  | 			expected:  `http_requests_total{job="prometheus",status="200"}`, | ||
|  | 			expectErr: false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			name:  "Adhoc filters with more complex expression", | ||
|  | 			query: `capacity_bytes{job="prometheus"} + available_bytes{job="grafana"} / 1024`, | ||
|  | 			adhocFilters: []ScopeFilter{ | ||
|  | 				{Key: "job", Value: "alloy", Operator: FilterOperatorEquals}, | ||
|  | 			}, | ||
|  | 			expected:  `capacity_bytes{job="alloy"} + available_bytes{job="alloy"} / 1024`, | ||
|  | 			expectErr: false, | ||
|  | 		}, | ||
|  | 	} | ||
|  | 
 | ||
|  | 	for _, tt := range tests { | ||
|  | 		t.Run(tt.name, func(t *testing.T) { | ||
|  | 			expr, err := ApplyQueryFilters(tt.query, tt.scopeFilters, tt.adhocFilters) | ||
|  | 
 | ||
|  | 			if tt.expectErr { | ||
|  | 				require.Error(t, err) | ||
|  | 			} else { | ||
|  | 				require.NoError(t, err) | ||
|  | 				require.Equal(t, expr, tt.expected) | ||
|  | 			} | ||
|  | 		}) | ||
|  | 	} | ||
|  | } |