| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | package prometheus | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-20 21:54:27 +08:00
										 |  |  | 	"github.com/grafana/grafana-plugin-sdk-go/backend" | 
					
						
							| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | 	"github.com/grafana/grafana-plugin-sdk-go/backend/datasource" | 
					
						
							| 
									
										
										
										
											2023-10-23 22:40:43 +08:00
										 |  |  | 	"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" | 
					
						
							| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type heuristicsSuccessRoundTripper struct { | 
					
						
							|  |  |  | 	res    io.ReadCloser | 
					
						
							|  |  |  | 	status int | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (rt *heuristicsSuccessRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { | 
					
						
							|  |  |  | 	return &http.Response{ | 
					
						
							|  |  |  | 		Status:        strconv.Itoa(rt.status), | 
					
						
							|  |  |  | 		StatusCode:    rt.status, | 
					
						
							|  |  |  | 		Header:        nil, | 
					
						
							|  |  |  | 		Body:          rt.res, | 
					
						
							|  |  |  | 		ContentLength: 0, | 
					
						
							|  |  |  | 		Request:       req, | 
					
						
							|  |  |  | 	}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-23 22:40:43 +08:00
										 |  |  | func newHeuristicsSDKProvider(hrt heuristicsSuccessRoundTripper) *httpclient.Provider { | 
					
						
							|  |  |  | 	anotherFN := func(o httpclient.Options, next http.RoundTripper) http.RoundTripper { | 
					
						
							|  |  |  | 		return &hrt | 
					
						
							| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-23 22:40:43 +08:00
										 |  |  | 	fn := httpclient.MiddlewareFunc(anotherFN) | 
					
						
							|  |  |  | 	mid := httpclient.NamedMiddlewareFunc("mock", fn) | 
					
						
							|  |  |  | 	return httpclient.NewProvider(httpclient.ProviderOptions{Middlewares: []httpclient.Middleware{mid}}) | 
					
						
							| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Test_GetHeuristics(t *testing.T) { | 
					
						
							|  |  |  | 	t.Run("should return Prometheus", func(t *testing.T) { | 
					
						
							|  |  |  | 		rt := heuristicsSuccessRoundTripper{ | 
					
						
							|  |  |  | 			res:    io.NopCloser(strings.NewReader("{\"status\":\"success\",\"data\":{\"version\":\"1.0\"}}")), | 
					
						
							|  |  |  | 			status: http.StatusOK, | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-10-23 22:40:43 +08:00
										 |  |  | 		//httpProvider := getHeuristicsMockProvider(&rt)
 | 
					
						
							|  |  |  | 		httpProvider := newHeuristicsSDKProvider(rt) | 
					
						
							| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | 		s := &Service{ | 
					
						
							| 
									
										
										
										
											2024-02-07 18:01:09 +08:00
										 |  |  | 			im: datasource.NewInstanceManager(newInstanceSettings(httpProvider, backend.NewLoggerWith("logger", "test"))), | 
					
						
							| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		req := HeuristicsRequest{ | 
					
						
							|  |  |  | 			PluginContext: getPluginContext(), | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		res, err := s.GetHeuristics(context.Background(), req) | 
					
						
							|  |  |  | 		assert.NoError(t, err) | 
					
						
							|  |  |  | 		require.NotNil(t, res) | 
					
						
							|  |  |  | 		assert.Equal(t, KindPrometheus, res.Application) | 
					
						
							|  |  |  | 		assert.Equal(t, Features{RulerApiEnabled: false}, res.Features) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("should return Mimir", func(t *testing.T) { | 
					
						
							|  |  |  | 		rt := heuristicsSuccessRoundTripper{ | 
					
						
							|  |  |  | 			res:    io.NopCloser(strings.NewReader("{\"status\":\"success\",\"data\":{\"features\":{\"foo\":\"bar\"},\"version\":\"1.0\"}}")), | 
					
						
							|  |  |  | 			status: http.StatusOK, | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-10-23 22:40:43 +08:00
										 |  |  | 		httpProvider := newHeuristicsSDKProvider(rt) | 
					
						
							| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | 		s := &Service{ | 
					
						
							| 
									
										
										
										
											2024-02-07 18:01:09 +08:00
										 |  |  | 			im: datasource.NewInstanceManager(newInstanceSettings(httpProvider, backend.NewLoggerWith("logger", "test"))), | 
					
						
							| 
									
										
										
										
											2023-06-05 17:35:18 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		req := HeuristicsRequest{ | 
					
						
							|  |  |  | 			PluginContext: getPluginContext(), | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		res, err := s.GetHeuristics(context.Background(), req) | 
					
						
							|  |  |  | 		assert.NoError(t, err) | 
					
						
							|  |  |  | 		require.NotNil(t, res) | 
					
						
							|  |  |  | 		assert.Equal(t, KindMimir, res.Application) | 
					
						
							|  |  |  | 		assert.Equal(t, Features{RulerApiEnabled: true}, res.Features) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } |