| 
									
										
										
										
											2021-06-01 20:19:10 +08:00
										 |  |  | package api | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-06-02 02:34:59 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2021-06-01 20:19:10 +08:00
										 |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/api/dtos" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/api/response" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/api/routing" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/infra/log" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/models" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/shorturls" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestShortURLAPIEndpoint(t *testing.T) { | 
					
						
							|  |  |  | 	t.Run("Given a correct request for creating a shortUrl", func(t *testing.T) { | 
					
						
							|  |  |  | 		cmd := dtos.CreateShortURLCmd{ | 
					
						
							|  |  |  | 			Path: "d/TxKARsmGz/new-dashboard?orgId=1&from=1599389322894&to=1599410922894", | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 02:34:59 +08:00
										 |  |  | 		createResp := &models.ShortUrl{ | 
					
						
							|  |  |  | 			Id:    1, | 
					
						
							|  |  |  | 			OrgId: testOrgID, | 
					
						
							|  |  |  | 			Uid:   "N1u6L4eGz", | 
					
						
							|  |  |  | 			Path:  cmd.Path, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		service := &fakeShortURLService{ | 
					
						
							|  |  |  | 			createShortURLFunc: func(ctx context.Context, user *models.SignedInUser, path string) (*models.ShortUrl, error) { | 
					
						
							|  |  |  | 				return createResp, nil | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		createShortURLScenario(t, "When calling POST on", "/api/short-urls", "/api/short-urls", cmd, service, | 
					
						
							| 
									
										
										
										
											2021-06-01 20:19:10 +08:00
										 |  |  | 			func(sc *scenarioContext) { | 
					
						
							|  |  |  | 				callCreateShortURL(sc) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				shortUrl := dtos.ShortURL{} | 
					
						
							|  |  |  | 				err := json.NewDecoder(sc.resp.Body).Decode(&shortUrl) | 
					
						
							|  |  |  | 				require.NoError(t, err) | 
					
						
							|  |  |  | 				require.Equal(t, 200, sc.resp.Code) | 
					
						
							| 
									
										
										
										
											2021-06-02 02:34:59 +08:00
										 |  |  | 				require.Equal(t, fmt.Sprintf("/goto/%s?orgId=%d", createResp.Uid, createResp.OrgId), shortUrl.URL) | 
					
						
							| 
									
										
										
										
											2021-06-01 20:19:10 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func callCreateShortURL(sc *scenarioContext) { | 
					
						
							|  |  |  | 	sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 02:34:59 +08:00
										 |  |  | func createShortURLScenario(t *testing.T, desc string, url string, routePattern string, cmd dtos.CreateShortURLCmd, shortURLService shorturls.Service, fn scenarioFunc) { | 
					
						
							| 
									
										
										
										
											2021-06-01 20:19:10 +08:00
										 |  |  | 	t.Run(fmt.Sprintf("%s %s", desc, url), func(t *testing.T) { | 
					
						
							|  |  |  | 		hs := HTTPServer{ | 
					
						
							| 
									
										
										
										
											2021-06-02 02:34:59 +08:00
										 |  |  | 			Cfg:             setting.NewCfg(), | 
					
						
							|  |  |  | 			ShortURLService: shortURLService, | 
					
						
							|  |  |  | 			log:             log.New("test"), | 
					
						
							| 
									
										
										
										
											2021-06-01 20:19:10 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		sc := setupScenarioContext(t, url) | 
					
						
							|  |  |  | 		sc.defaultHandler = routing.Wrap(func(c *models.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 			c.Req.Body = mockRequestBody(cmd) | 
					
						
							| 
									
										
										
										
											2022-02-09 20:44:38 +08:00
										 |  |  | 			c.Req.Header.Add("Content-Type", "application/json") | 
					
						
							| 
									
										
										
										
											2021-06-01 20:19:10 +08:00
										 |  |  | 			sc.context = c | 
					
						
							|  |  |  | 			sc.context.SignedInUser = &models.SignedInUser{OrgId: testOrgID, UserId: testUserID} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 			return hs.createShortURL(c) | 
					
						
							| 
									
										
										
										
											2021-06-01 20:19:10 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		sc.m.Post(routePattern, sc.defaultHandler) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		fn(sc) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-06-02 02:34:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type fakeShortURLService struct { | 
					
						
							|  |  |  | 	createShortURLFunc func(ctx context.Context, user *models.SignedInUser, path string) (*models.ShortUrl, error) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *fakeShortURLService) GetShortURLByUID(ctx context.Context, user *models.SignedInUser, uid string) (*models.ShortUrl, error) { | 
					
						
							|  |  |  | 	return nil, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *fakeShortURLService) CreateShortURL(ctx context.Context, user *models.SignedInUser, path string) (*models.ShortUrl, error) { | 
					
						
							|  |  |  | 	if s.createShortURLFunc != nil { | 
					
						
							|  |  |  | 		return s.createShortURLFunc(ctx, user, path) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *fakeShortURLService) UpdateLastSeenAt(ctx context.Context, shortURL *models.ShortUrl) error { | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *fakeShortURLService) DeleteStaleShortURLs(ctx context.Context, cmd *models.DeleteShortUrlCommand) error { | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |