|
|
|
|
@ -31,11 +31,12 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
|
|
|
|
|
viewerRole := models.ROLE_VIEWER |
|
|
|
|
editorRole := models.ROLE_EDITOR |
|
|
|
|
sqlmock := mockstore.NewSQLStoreMock() |
|
|
|
|
aclMockResp := []*models.DashboardAclInfoDTO{} |
|
|
|
|
hs := &HTTPServer{SQLStore: sqlmock} |
|
|
|
|
|
|
|
|
|
setUpSnapshotTest := func(t *testing.T) *models.DashboardSnapshot { |
|
|
|
|
t.Helper() |
|
|
|
|
|
|
|
|
|
mockSnapshotResult := &models.DashboardSnapshot{ |
|
|
|
|
Id: 1, |
|
|
|
|
Key: "12345", |
|
|
|
|
@ -45,48 +46,34 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
UserId: 999999, |
|
|
|
|
External: true, |
|
|
|
|
} |
|
|
|
|
sqlmock.ExpectedDashboardSnapshot = mockSnapshotResult |
|
|
|
|
sqlmock.ExpectedDashboardAclInfoList = aclMockResp |
|
|
|
|
sqlmock.ExpectedTeamsByUser = []*models.TeamDTO{} |
|
|
|
|
|
|
|
|
|
bus.AddHandler("test", func(ctx context.Context, query *models.GetDashboardSnapshotQuery) error { |
|
|
|
|
query.Result = mockSnapshotResult |
|
|
|
|
return nil |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
bus.AddHandler("test", func(ctx context.Context, cmd *models.DeleteDashboardSnapshotCommand) error { |
|
|
|
|
return nil |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
// we need it here for now for the guadian service to work
|
|
|
|
|
bus.AddHandler("test", func(ctx context.Context, query *models.GetDashboardAclInfoListQuery) error { |
|
|
|
|
query.Result = aclMockResp |
|
|
|
|
return nil |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
teamResp := []*models.TeamDTO{} |
|
|
|
|
bus.AddHandler("test", func(ctx context.Context, query *models.GetTeamsByUserQuery) error { |
|
|
|
|
query.Result = teamResp |
|
|
|
|
return nil |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
return mockSnapshotResult |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
t.Run("When user has editor role and is not in the ACL", func(t *testing.T) { |
|
|
|
|
mock := mockstore.NewSQLStoreMock() |
|
|
|
|
loggedInUserScenarioWithRole(t, "Should not be able to delete snapshot when calling DELETE on", |
|
|
|
|
"DELETE", "/api/snapshots/12345", "/api/snapshots/:key", models.ROLE_EDITOR, func(sc *scenarioContext) { |
|
|
|
|
mockSnapshotResult := setUpSnapshotTest(t) |
|
|
|
|
|
|
|
|
|
var externalRequest *http.Request |
|
|
|
|
mockSnapshotResult := setUpSnapshotTest(t) |
|
|
|
|
ts := setupRemoteServer(func(rw http.ResponseWriter, req *http.Request) { |
|
|
|
|
externalRequest = req |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
mockSnapshotResult.ExternalDeleteUrl = ts.URL |
|
|
|
|
sc.handlerFunc = DeleteDashboardSnapshot |
|
|
|
|
sc.handlerFunc = hs.DeleteDashboardSnapshot |
|
|
|
|
sc.fakeReqWithParams("DELETE", sc.url, map[string]string{"key": "12345"}).exec() |
|
|
|
|
|
|
|
|
|
assert.Equal(t, 403, sc.resp.Code) |
|
|
|
|
require.Nil(t, externalRequest) |
|
|
|
|
}, mock) |
|
|
|
|
}, sqlmock) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("When user is anonymous", func(t *testing.T) { |
|
|
|
|
@ -101,7 +88,7 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
mockSnapshotResult.ExternalDeleteUrl = ts.URL |
|
|
|
|
sc.handlerFunc = DeleteDashboardSnapshotByDeleteKey |
|
|
|
|
sc.handlerFunc = hs.DeleteDashboardSnapshotByDeleteKey |
|
|
|
|
sc.fakeReqWithParams("GET", sc.url, map[string]string{"deleteKey": "12345"}).exec() |
|
|
|
|
|
|
|
|
|
require.Equal(t, 200, sc.resp.Code) |
|
|
|
|
@ -122,7 +109,7 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
{Role: &viewerRole, Permission: models.PERMISSION_VIEW}, |
|
|
|
|
{Role: &editorRole, Permission: models.PERMISSION_EDIT}, |
|
|
|
|
} |
|
|
|
|
mock := mockstore.NewSQLStoreMock() |
|
|
|
|
|
|
|
|
|
loggedInUserScenarioWithRole(t, "Should be able to delete a snapshot when calling DELETE on", "DELETE", |
|
|
|
|
"/api/snapshots/12345", "/api/snapshots/:key", models.ROLE_EDITOR, func(sc *scenarioContext) { |
|
|
|
|
mockSnapshotResult := setUpSnapshotTest(t) |
|
|
|
|
@ -132,9 +119,8 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
rw.WriteHeader(200) |
|
|
|
|
externalRequest = req |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
mockSnapshotResult.ExternalDeleteUrl = ts.URL |
|
|
|
|
sc.handlerFunc = DeleteDashboardSnapshot |
|
|
|
|
sc.handlerFunc = hs.DeleteDashboardSnapshot |
|
|
|
|
sc.fakeReqWithParams("DELETE", sc.url, map[string]string{"key": "12345"}).exec() |
|
|
|
|
|
|
|
|
|
assert.Equal(t, 200, sc.resp.Code) |
|
|
|
|
@ -145,20 +131,19 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
assert.Equal(t, 1, respJSON.Get("id").MustInt()) |
|
|
|
|
assert.Equal(t, ts.URL, fmt.Sprintf("http://%s", externalRequest.Host)) |
|
|
|
|
assert.Equal(t, "/", externalRequest.URL.EscapedPath()) |
|
|
|
|
}, mock) |
|
|
|
|
}, sqlmock) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("When user is editor and creator of the snapshot", func(t *testing.T) { |
|
|
|
|
aclMockResp = []*models.DashboardAclInfoDTO{} |
|
|
|
|
mock := mockstore.NewSQLStoreMock() |
|
|
|
|
aclMockResp := []*models.DashboardAclInfoDTO{} |
|
|
|
|
loggedInUserScenarioWithRole(t, "Should be able to delete a snapshot when calling DELETE on", |
|
|
|
|
"DELETE", "/api/snapshots/12345", "/api/snapshots/:key", models.ROLE_EDITOR, func(sc *scenarioContext) { |
|
|
|
|
mockSnapshotResult := setUpSnapshotTest(t) |
|
|
|
|
|
|
|
|
|
sqlmock.ExpectedDashboardAclInfoList = aclMockResp |
|
|
|
|
mockSnapshotResult.UserId = testUserID |
|
|
|
|
mockSnapshotResult.External = false |
|
|
|
|
|
|
|
|
|
sc.handlerFunc = DeleteDashboardSnapshot |
|
|
|
|
sc.handlerFunc = hs.DeleteDashboardSnapshot |
|
|
|
|
sc.fakeReqWithParams("DELETE", sc.url, map[string]string{"key": "12345"}).exec() |
|
|
|
|
|
|
|
|
|
assert.Equal(t, 200, sc.resp.Code) |
|
|
|
|
@ -167,12 +152,11 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
|
|
|
|
|
assert.True(t, strings.HasPrefix(respJSON.Get("message").MustString(), "Snapshot deleted")) |
|
|
|
|
assert.Equal(t, 1, respJSON.Get("id").MustInt()) |
|
|
|
|
}, mock) |
|
|
|
|
}, sqlmock) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
t.Run("When deleting an external snapshot", func(t *testing.T) { |
|
|
|
|
aclMockResp = []*models.DashboardAclInfoDTO{} |
|
|
|
|
mock := mockstore.NewSQLStoreMock() |
|
|
|
|
loggedInUserScenarioWithRole(t, |
|
|
|
|
"Should gracefully delete local snapshot when remote snapshot has already been removed when calling DELETE on", |
|
|
|
|
"DELETE", "/api/snapshots/12345", "/api/snapshots/:key", models.ROLE_EDITOR, func(sc *scenarioContext) { |
|
|
|
|
@ -186,7 +170,7 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
mockSnapshotResult.ExternalDeleteUrl = ts.URL |
|
|
|
|
sc.handlerFunc = DeleteDashboardSnapshot |
|
|
|
|
sc.handlerFunc = hs.DeleteDashboardSnapshot |
|
|
|
|
sc.fakeReqWithParams("DELETE", sc.url, map[string]string{"key": "12345"}).exec() |
|
|
|
|
|
|
|
|
|
require.NoError(t, writeErr) |
|
|
|
|
@ -196,7 +180,7 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
|
|
|
|
|
assert.True(t, strings.HasPrefix(respJSON.Get("message").MustString(), "Snapshot deleted")) |
|
|
|
|
assert.Equal(t, 1, respJSON.Get("id").MustInt()) |
|
|
|
|
}, mock) |
|
|
|
|
}, sqlmock) |
|
|
|
|
|
|
|
|
|
loggedInUserScenarioWithRole(t, |
|
|
|
|
"Should fail to delete local snapshot when an unexpected 500 error occurs when calling DELETE on", "DELETE", |
|
|
|
|
@ -212,12 +196,12 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
|
|
|
|
|
t.Log("Setting external delete URL", "url", ts.URL) |
|
|
|
|
mockSnapshotResult.ExternalDeleteUrl = ts.URL |
|
|
|
|
sc.handlerFunc = DeleteDashboardSnapshot |
|
|
|
|
sc.handlerFunc = hs.DeleteDashboardSnapshot |
|
|
|
|
sc.fakeReqWithParams("DELETE", sc.url, map[string]string{"key": "12345"}).exec() |
|
|
|
|
|
|
|
|
|
require.NoError(t, writeErr) |
|
|
|
|
assert.Equal(t, 500, sc.resp.Code) |
|
|
|
|
}, mock) |
|
|
|
|
}, sqlmock) |
|
|
|
|
|
|
|
|
|
loggedInUserScenarioWithRole(t, |
|
|
|
|
"Should fail to delete local snapshot when an unexpected remote error occurs when calling DELETE on", |
|
|
|
|
@ -230,17 +214,17 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
mockSnapshotResult.ExternalDeleteUrl = ts.URL |
|
|
|
|
sc.handlerFunc = DeleteDashboardSnapshot |
|
|
|
|
sc.handlerFunc = hs.DeleteDashboardSnapshot |
|
|
|
|
sc.fakeReqWithParams("DELETE", sc.url, map[string]string{"key": "12345"}).exec() |
|
|
|
|
|
|
|
|
|
assert.Equal(t, 500, sc.resp.Code) |
|
|
|
|
}, mock) |
|
|
|
|
}, sqlmock) |
|
|
|
|
|
|
|
|
|
loggedInUserScenarioWithRole(t, "Should be able to read a snapshot's unencrypted data when calling GET on", |
|
|
|
|
"GET", "/api/snapshots/12345", "/api/snapshots/:key", models.ROLE_EDITOR, func(sc *scenarioContext) { |
|
|
|
|
setUpSnapshotTest(t) |
|
|
|
|
|
|
|
|
|
sc.handlerFunc = GetDashboardSnapshot |
|
|
|
|
sc.handlerFunc = hs.GetDashboardSnapshot |
|
|
|
|
sc.fakeReqWithParams("GET", sc.url, map[string]string{"key": "12345"}).exec() |
|
|
|
|
|
|
|
|
|
assert.Equal(t, 200, sc.resp.Code) |
|
|
|
|
@ -251,6 +235,6 @@ func TestDashboardSnapshotAPIEndpoint_singleSnapshot(t *testing.T) { |
|
|
|
|
id := dashboard.Get("id") |
|
|
|
|
|
|
|
|
|
assert.Equal(t, int64(100), id.MustInt64()) |
|
|
|
|
}, mock) |
|
|
|
|
}, sqlmock) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|