mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
	
	
		
			189 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			189 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | package api | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"context" | ||
|  | 	"encoding/json" | ||
|  | 	"net/http" | ||
|  | 	"net/http/httptest" | ||
|  | 	"net/url" | ||
|  | 	"testing" | ||
|  | 
 | ||
|  | 	"github.com/grafana/grafana/pkg/infra/log" | ||
|  | 	"github.com/grafana/grafana/pkg/infra/log/logtest" | ||
|  | 	"github.com/grafana/grafana/pkg/services/auth/identity" | ||
|  | 	contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" | ||
|  | 	"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" | ||
|  | 	"github.com/grafana/grafana/pkg/services/ngalert/models" | ||
|  | 	"github.com/grafana/grafana/pkg/services/ngalert/notifier" | ||
|  | 	"github.com/grafana/grafana/pkg/services/ngalert/tests/fakes" | ||
|  | 	"github.com/grafana/grafana/pkg/services/user" | ||
|  | 	"github.com/grafana/grafana/pkg/web" | ||
|  | 
 | ||
|  | 	am_config "github.com/prometheus/alertmanager/config" | ||
|  | 	"github.com/stretchr/testify/require" | ||
|  | ) | ||
|  | 
 | ||
|  | func TestRouteGetReceiver(t *testing.T) { | ||
|  | 	fakeReceiverSvc := fakes.NewFakeReceiverService() | ||
|  | 
 | ||
|  | 	t.Run("returns expected model", func(t *testing.T) { | ||
|  | 		expected := definitions.GettableApiReceiver{ | ||
|  | 			Receiver: am_config.Receiver{ | ||
|  | 				Name: "receiver1", | ||
|  | 			}, | ||
|  | 			GettableGrafanaReceivers: definitions.GettableGrafanaReceivers{ | ||
|  | 				GrafanaManagedReceivers: []*definitions.GettableGrafanaReceiver{ | ||
|  | 					{ | ||
|  | 						UID:  "uid1", | ||
|  | 						Name: "receiver1", | ||
|  | 						Type: "slack", | ||
|  | 					}, | ||
|  | 				}, | ||
|  | 			}, | ||
|  | 		} | ||
|  | 		fakeReceiverSvc.GetReceiverFn = func(ctx context.Context, q models.GetReceiverQuery, u identity.Requester) (definitions.GettableApiReceiver, error) { | ||
|  | 			return expected, nil | ||
|  | 		} | ||
|  | 		handler := NewNotificationsApi(newNotificationSrv(fakeReceiverSvc)) | ||
|  | 		rc := testReqCtx("GET") | ||
|  | 		resp := handler.handleRouteGetReceiver(&rc, "receiver1") | ||
|  | 		require.Equal(t, http.StatusOK, resp.Status()) | ||
|  | 		json, err := json.Marshal(expected) | ||
|  | 		require.NoError(t, err) | ||
|  | 		require.Equal(t, json, resp.Body()) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("builds query from request context and url param", func(t *testing.T) { | ||
|  | 		fakeReceiverSvc.GetReceiverFn = func(ctx context.Context, q models.GetReceiverQuery, u identity.Requester) (definitions.GettableApiReceiver, error) { | ||
|  | 			return definitions.GettableApiReceiver{}, nil | ||
|  | 		} | ||
|  | 		handler := NewNotificationsApi(newNotificationSrv(fakeReceiverSvc)) | ||
|  | 		rc := testReqCtx("GET") | ||
|  | 		rc.Context.Req.Form.Set("decrypt", "true") | ||
|  | 		resp := handler.handleRouteGetReceiver(&rc, "receiver1") | ||
|  | 		require.Equal(t, http.StatusOK, resp.Status()) | ||
|  | 
 | ||
|  | 		call := fakeReceiverSvc.PopMethodCall() | ||
|  | 		require.Equal(t, "GetReceiver", call.Method) | ||
|  | 		expectedQ := models.GetReceiverQuery{ | ||
|  | 			Name:    "receiver1", | ||
|  | 			Decrypt: true, | ||
|  | 			OrgID:   1, | ||
|  | 		} | ||
|  | 		require.Equal(t, expectedQ, call.Args[1]) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("should pass along not found response", func(t *testing.T) { | ||
|  | 		fakeReceiverSvc.GetReceiverFn = func(ctx context.Context, q models.GetReceiverQuery, u identity.Requester) (definitions.GettableApiReceiver, error) { | ||
|  | 			return definitions.GettableApiReceiver{}, notifier.ErrNotFound | ||
|  | 		} | ||
|  | 		handler := NewNotificationsApi(newNotificationSrv(fakeReceiverSvc)) | ||
|  | 		rc := testReqCtx("GET") | ||
|  | 		resp := handler.handleRouteGetReceiver(&rc, "receiver1") | ||
|  | 		require.Equal(t, http.StatusNotFound, resp.Status()) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("should pass along permission denied response", func(t *testing.T) { | ||
|  | 		fakeReceiverSvc.GetReceiverFn = func(ctx context.Context, q models.GetReceiverQuery, u identity.Requester) (definitions.GettableApiReceiver, error) { | ||
|  | 			return definitions.GettableApiReceiver{}, notifier.ErrPermissionDenied | ||
|  | 		} | ||
|  | 		handler := NewNotificationsApi(newNotificationSrv(fakeReceiverSvc)) | ||
|  | 		rc := testReqCtx("GET") | ||
|  | 		resp := handler.handleRouteGetReceiver(&rc, "receiver1") | ||
|  | 		require.Equal(t, http.StatusForbidden, resp.Status()) | ||
|  | 	}) | ||
|  | } | ||
|  | 
 | ||
|  | func TestRouteGetReceivers(t *testing.T) { | ||
|  | 	fakeReceiverSvc := fakes.NewFakeReceiverService() | ||
|  | 
 | ||
|  | 	t.Run("returns expected model", func(t *testing.T) { | ||
|  | 		expected := []definitions.GettableApiReceiver{ | ||
|  | 			{ | ||
|  | 				Receiver: am_config.Receiver{ | ||
|  | 					Name: "receiver1", | ||
|  | 				}, | ||
|  | 				GettableGrafanaReceivers: definitions.GettableGrafanaReceivers{ | ||
|  | 					GrafanaManagedReceivers: []*definitions.GettableGrafanaReceiver{ | ||
|  | 						{ | ||
|  | 							UID:  "uid1", | ||
|  | 							Name: "receiver1", | ||
|  | 							Type: "slack", | ||
|  | 						}, | ||
|  | 					}, | ||
|  | 				}, | ||
|  | 			}, | ||
|  | 		} | ||
|  | 		fakeReceiverSvc.GetReceiversFn = func(ctx context.Context, q models.GetReceiversQuery, u identity.Requester) ([]definitions.GettableApiReceiver, error) { | ||
|  | 			return expected, nil | ||
|  | 		} | ||
|  | 		handler := NewNotificationsApi(newNotificationSrv(fakeReceiverSvc)) | ||
|  | 		rc := testReqCtx("GET") | ||
|  | 		rc.Context.Req.Form.Set("names", "receiver1") | ||
|  | 		resp := handler.handleRouteGetReceivers(&rc) | ||
|  | 		require.Equal(t, http.StatusOK, resp.Status()) | ||
|  | 		json, err := json.Marshal(expected) | ||
|  | 		require.NoError(t, err) | ||
|  | 		require.Equal(t, json, resp.Body()) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("builds query from request context", func(t *testing.T) { | ||
|  | 		fakeReceiverSvc.GetReceiversFn = func(ctx context.Context, q models.GetReceiversQuery, u identity.Requester) ([]definitions.GettableApiReceiver, error) { | ||
|  | 			return []definitions.GettableApiReceiver{}, nil | ||
|  | 		} | ||
|  | 		handler := NewNotificationsApi(newNotificationSrv(fakeReceiverSvc)) | ||
|  | 		rc := testReqCtx("GET") | ||
|  | 		rc.Context.Req.Form.Set("names", "receiver1") | ||
|  | 		rc.Context.Req.Form.Add("names", "receiver2") | ||
|  | 		rc.Context.Req.Form.Set("limit", "1") | ||
|  | 		rc.Context.Req.Form.Set("offset", "2") | ||
|  | 		rc.Context.Req.Form.Set("decrypt", "true") | ||
|  | 		resp := handler.handleRouteGetReceivers(&rc) | ||
|  | 		require.Equal(t, http.StatusOK, resp.Status()) | ||
|  | 
 | ||
|  | 		call := fakeReceiverSvc.PopMethodCall() | ||
|  | 		require.Equal(t, "GetReceivers", call.Method) | ||
|  | 		expectedQ := models.GetReceiversQuery{ | ||
|  | 			Names:   []string{"receiver1", "receiver2"}, | ||
|  | 			Limit:   1, | ||
|  | 			Offset:  2, | ||
|  | 			Decrypt: true, | ||
|  | 			OrgID:   1, | ||
|  | 		} | ||
|  | 		require.Equal(t, expectedQ, call.Args[1]) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("should pass along permission denied response", func(t *testing.T) { | ||
|  | 		fakeReceiverSvc.GetReceiversFn = func(ctx context.Context, q models.GetReceiversQuery, u identity.Requester) ([]definitions.GettableApiReceiver, error) { | ||
|  | 			return nil, notifier.ErrPermissionDenied | ||
|  | 		} | ||
|  | 		handler := NewNotificationsApi(newNotificationSrv(fakeReceiverSvc)) | ||
|  | 		rc := testReqCtx("GET") | ||
|  | 		resp := handler.handleRouteGetReceivers(&rc) | ||
|  | 		require.Equal(t, http.StatusForbidden, resp.Status()) | ||
|  | 	}) | ||
|  | } | ||
|  | 
 | ||
|  | func newNotificationSrv(receiverService ReceiverService) *NotificationSrv { | ||
|  | 	return &NotificationSrv{ | ||
|  | 		logger:          log.NewNopLogger(), | ||
|  | 		receiverService: receiverService, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func testReqCtx(method string) contextmodel.ReqContext { | ||
|  | 	return contextmodel.ReqContext{ | ||
|  | 		Context: &web.Context{ | ||
|  | 			Req: &http.Request{ | ||
|  | 				Header: make(http.Header), | ||
|  | 				Form:   make(url.Values), | ||
|  | 			}, | ||
|  | 			Resp: web.NewResponseWriter(method, httptest.NewRecorder()), | ||
|  | 		}, | ||
|  | 		SignedInUser: &user.SignedInUser{ | ||
|  | 			OrgID: 1, | ||
|  | 		}, | ||
|  | 		Logger: &logtest.Fake{}, | ||
|  | 	} | ||
|  | } |