From cf500f3157e4d4861d3ca1e32e9588473bf331db Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Wed, 6 Mar 2019 14:38:40 +0100 Subject: [PATCH] restore to current folder when restoring old dashboard version --- pkg/api/dashboard.go | 1 + pkg/api/dashboard_test.go | 124 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index f1ad935e621..07c4f75778d 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -488,6 +488,7 @@ func (hs *HTTPServer) RestoreDashboardVersion(c *m.ReqContext, apiCmd dtos.Resto saveCmd.Dashboard.Set("version", dash.Version) saveCmd.Dashboard.Set("uid", dash.Uid) saveCmd.Message = fmt.Sprintf("Restored from version %d", version.Version) + saveCmd.FolderId = dash.FolderId return hs.PostDashboard(c, saveCmd) } diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index 44d5cd32430..923bf57ce8a 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -810,6 +810,93 @@ func TestDashboardApiEndpoint(t *testing.T) { }) }) }) + + Convey("Given dashboard in folder being restored should restore to folder", t, func() { + fakeDash := m.NewDashboard("Child dash") + fakeDash.Id = 2 + fakeDash.FolderId = 1 + fakeDash.HasAcl = false + + bus.AddHandler("test", func(query *m.GetDashboardQuery) error { + query.Result = fakeDash + return nil + }) + + bus.AddHandler("test", func(query *m.GetDashboardVersionQuery) error { + query.Result = &m.DashboardVersion{ + DashboardId: 2, + Version: 1, + Data: fakeDash.Data, + } + return nil + }) + + mock := &dashboards.FakeDashboardService{ + SaveDashboardResult: &m.Dashboard{ + Id: 2, + Uid: "uid", + Title: "Dash", + Slug: "dash", + Version: 1, + }, + } + + cmd := dtos.RestoreDashboardVersionCommand{ + Version: 1, + } + + restoreDashboardVersionScenario("When calling POST on", "/api/dashboards/id/1/restore", "/api/dashboards/id/:dashboardId/restore", mock, cmd, func(sc *scenarioContext) { + CallRestoreDashboardVersion(sc) + So(sc.resp.Code, ShouldEqual, 200) + dto := mock.SavedDashboards[0] + So(dto.Dashboard.FolderId, ShouldEqual, 1) + So(dto.Dashboard.Title, ShouldEqual, "Child dash") + So(dto.Message, ShouldEqual, "Restored from version 1") + }) + }) + + Convey("Given dashboard in general folder being restored should restore to general folder", t, func() { + fakeDash := m.NewDashboard("Child dash") + fakeDash.Id = 2 + fakeDash.HasAcl = false + + bus.AddHandler("test", func(query *m.GetDashboardQuery) error { + query.Result = fakeDash + return nil + }) + + bus.AddHandler("test", func(query *m.GetDashboardVersionQuery) error { + query.Result = &m.DashboardVersion{ + DashboardId: 2, + Version: 1, + Data: fakeDash.Data, + } + return nil + }) + + mock := &dashboards.FakeDashboardService{ + SaveDashboardResult: &m.Dashboard{ + Id: 2, + Uid: "uid", + Title: "Dash", + Slug: "dash", + Version: 1, + }, + } + + cmd := dtos.RestoreDashboardVersionCommand{ + Version: 1, + } + + restoreDashboardVersionScenario("When calling POST on", "/api/dashboards/id/1/restore", "/api/dashboards/id/:dashboardId/restore", mock, cmd, func(sc *scenarioContext) { + CallRestoreDashboardVersion(sc) + So(sc.resp.Code, ShouldEqual, 200) + dto := mock.SavedDashboards[0] + So(dto.Dashboard.FolderId, ShouldEqual, 0) + So(dto.Dashboard.Title, ShouldEqual, "Child dash") + So(dto.Message, ShouldEqual, "Restored from version 1") + }) + }) } func GetDashboardShouldReturn200(sc *scenarioContext) dtos.DashboardFullWithMeta { @@ -871,6 +958,10 @@ func CallPostDashboard(sc *scenarioContext) { sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec() } +func CallRestoreDashboardVersion(sc *scenarioContext) { + sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec() +} + func CallPostDashboardShouldReturnSuccess(sc *scenarioContext) { CallPostDashboard(sc) @@ -928,6 +1019,39 @@ func postDiffScenario(desc string, url string, routePattern string, cmd dtos.Cal }) } +func restoreDashboardVersionScenario(desc string, url string, routePattern string, mock *dashboards.FakeDashboardService, cmd dtos.RestoreDashboardVersionCommand, fn scenarioFunc) { + Convey(desc+" "+url, func() { + defer bus.ClearBusHandlers() + + hs := HTTPServer{ + Bus: bus.GetBus(), + } + + sc := setupScenarioContext(url) + sc.defaultHandler = Wrap(func(c *m.ReqContext) Response { + sc.context = c + sc.context.SignedInUser = &m.SignedInUser{ + OrgId: TestOrgID, + UserId: TestUserID, + } + sc.context.OrgRole = m.ROLE_ADMIN + + return hs.RestoreDashboardVersion(c, cmd) + }) + + origNewDashboardService := dashboards.NewService + dashboards.MockDashboardService(mock) + + sc.m.Post(routePattern, sc.defaultHandler) + + defer func() { + dashboards.NewService = origNewDashboardService + }() + + fn(sc) + }) +} + func (sc *scenarioContext) ToJSON() *simplejson.Json { var result *simplejson.Json err := json.NewDecoder(sc.resp.Body).Decode(&result)