| 
									
										
										
										
											2020-11-19 20:17:00 +08:00
										 |  |  | package expr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"sort" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/google/go-cmp/cmp" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana-plugin-sdk-go/backend" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana-plugin-sdk-go/data" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/models" | 
					
						
							| 
									
										
										
										
											2022-04-26 00:57:45 +08:00
										 |  |  | 	datasources "github.com/grafana/grafana/pkg/services/datasources/fakes" | 
					
						
							| 
									
										
										
										
											2021-11-10 18:52:16 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2020-11-19 20:17:00 +08:00
										 |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestService(t *testing.T) { | 
					
						
							|  |  |  | 	dsDF := data.NewFrame("test", | 
					
						
							| 
									
										
										
										
											2021-06-03 00:29:19 +08:00
										 |  |  | 		data.NewField("time", nil, []time.Time{time.Unix(1, 0)}), | 
					
						
							| 
									
										
										
										
											2020-11-19 20:17:00 +08:00
										 |  |  | 		data.NewField("value", nil, []*float64{fp(2)})) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-08 14:02:49 +08:00
										 |  |  | 	me := &mockEndpoint{ | 
					
						
							|  |  |  | 		Frames: []*data.Frame{dsDF}, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-11-12 19:16:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	cfg := setting.NewCfg() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 18:52:16 +08:00
										 |  |  | 	s := Service{ | 
					
						
							| 
									
										
										
										
											2022-04-26 00:57:45 +08:00
										 |  |  | 		cfg:               cfg, | 
					
						
							|  |  |  | 		dataService:       me, | 
					
						
							|  |  |  | 		dataSourceService: &datasources.FakeDataSourceService{}, | 
					
						
							| 
									
										
										
										
											2021-11-10 18:52:16 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-11-12 19:16:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-23 22:52:32 +08:00
										 |  |  | 	queries := []Query{ | 
					
						
							| 
									
										
										
										
											2020-11-19 20:17:00 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			RefID: "A", | 
					
						
							| 
									
										
										
										
											2021-12-17 00:51:46 +08:00
										 |  |  | 			DataSource: &models.DataSource{ | 
					
						
							|  |  |  | 				OrgId: 1, | 
					
						
							|  |  |  | 				Uid:   "test", | 
					
						
							|  |  |  | 				Type:  "test", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			JSON: json.RawMessage(`{ "datasource": { "uid": "1" }, "intervalMs": 1000, "maxDataPoints": 1000 }`), | 
					
						
							| 
									
										
										
										
											2020-11-19 20:17:00 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2021-12-17 00:51:46 +08:00
										 |  |  | 			RefID:      "B", | 
					
						
							|  |  |  | 			DataSource: DataSourceModel(), | 
					
						
							|  |  |  | 			JSON:       json.RawMessage(`{ "datasource": { "uid": "__expr__", "type": "__expr__"}, "type": "math", "expression": "$A * 2" }`), | 
					
						
							| 
									
										
										
										
											2020-11-19 20:17:00 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-23 22:52:32 +08:00
										 |  |  | 	req := &Request{Queries: queries} | 
					
						
							| 
									
										
										
										
											2020-12-07 23:30:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	pl, err := s.BuildPipeline(req) | 
					
						
							| 
									
										
										
										
											2020-11-19 20:17:00 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res, err := s.ExecutePipeline(context.Background(), pl) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bDF := data.NewFrame("", | 
					
						
							| 
									
										
										
										
											2021-06-03 00:29:19 +08:00
										 |  |  | 		data.NewField("Time", nil, []time.Time{time.Unix(1, 0)}), | 
					
						
							| 
									
										
										
										
											2020-12-11 19:59:12 +08:00
										 |  |  | 		data.NewField("B", nil, []*float64{fp(4)})) | 
					
						
							| 
									
										
										
										
											2020-11-19 20:17:00 +08:00
										 |  |  | 	bDF.RefID = "B" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	expect := &backend.QueryDataResponse{ | 
					
						
							|  |  |  | 		Responses: backend.Responses{ | 
					
						
							|  |  |  | 			"A": { | 
					
						
							|  |  |  | 				Frames: []*data.Frame{dsDF}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			"B": { | 
					
						
							|  |  |  | 				Frames: []*data.Frame{bDF}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Service currently doesn't care about order of datas in the return.
 | 
					
						
							|  |  |  | 	trans := cmp.Transformer("Sort", func(in []*data.Frame) []*data.Frame { | 
					
						
							|  |  |  | 		out := append([]*data.Frame(nil), in...) // Copy input to avoid mutating it
 | 
					
						
							|  |  |  | 		sort.SliceStable(out, func(i, j int) bool { | 
					
						
							|  |  |  | 			return out[i].RefID > out[j].RefID | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		return out | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	options := append([]cmp.Option{trans}, data.FrameTestCompareOptions()...) | 
					
						
							|  |  |  | 	if diff := cmp.Diff(expect, res, options...); diff != "" { | 
					
						
							|  |  |  | 		t.Errorf("Result mismatch (-want +got):\n%s", diff) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func fp(f float64) *float64 { | 
					
						
							|  |  |  | 	return &f | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type mockEndpoint struct { | 
					
						
							|  |  |  | 	Frames data.Frames | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 18:52:16 +08:00
										 |  |  | func (me *mockEndpoint) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { | 
					
						
							|  |  |  | 	resp := backend.NewQueryDataResponse() | 
					
						
							|  |  |  | 	resp.Responses["A"] = backend.DataResponse{ | 
					
						
							|  |  |  | 		Frames: me.Frames, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return resp, nil | 
					
						
							| 
									
										
										
										
											2021-03-08 14:02:49 +08:00
										 |  |  | } |