mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
This PR completes public dashboards v1 functionality and simplifies public dashboard conventions. It exists as a large PR so that we are not making constant changes to the database schema. models.PublicDashboardConfig model replaced with models.PublicDashboard directly dashboard_public_config table renamed to dashboard_public models.Dashboard.IsPublic removed from the dashboard and replaced with models.PublicDashboard.isEnabled Routing now uses a uuid v4 as an access token for viewing a public dashboard anonymously, PublicDashboard.Uid only used as database identifier Frontend utilizes uuid for auth'd operations and access token for anonymous access Default to time range defined on dashboard when viewing public dashboard Add audit fields to public dashboard Co-authored-by: Owen Smallwood <owen.smallwood@grafana.com>, Ezequiel Victorero <ezequiel.victorero@grafana.com>, Jesse Weaver <jesse.weaver@grafana.com>
246 lines
8.5 KiB
Go
246 lines
8.5 KiB
Go
package database
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
|
"github.com/grafana/grafana/pkg/services/sqlstore"
|
|
"github.com/grafana/grafana/pkg/util"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// This is what the db sets empty time settings to
|
|
var DefaultTimeSettings, _ = simplejson.NewJson([]byte(`{}`))
|
|
|
|
// Default time to pass in with seconds rounded
|
|
var DefaultTime = time.Now().UTC().Round(time.Second)
|
|
|
|
// GetPublicDashboard
|
|
func TestIntegrationGetPublicDashboard(t *testing.T) {
|
|
var sqlStore *sqlstore.SQLStore
|
|
var dashboardStore *DashboardStore
|
|
var savedDashboard *models.Dashboard
|
|
|
|
setup := func() {
|
|
sqlStore = sqlstore.InitTestDB(t)
|
|
dashboardStore = ProvideDashboardStore(sqlStore)
|
|
savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, true)
|
|
}
|
|
|
|
t.Run("returns PublicDashboard and Dashboard", func(t *testing.T) {
|
|
setup()
|
|
pubdash, err := dashboardStore.SavePublicDashboardConfig(context.Background(), models.SavePublicDashboardConfigCommand{
|
|
PublicDashboard: models.PublicDashboard{
|
|
IsEnabled: true,
|
|
Uid: "abc1234",
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
TimeSettings: DefaultTimeSettings,
|
|
CreatedAt: DefaultTime,
|
|
CreatedBy: 7,
|
|
AccessToken: "NOTAREALUUID",
|
|
},
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
pd, d, err := dashboardStore.GetPublicDashboard(context.Background(), "NOTAREALUUID")
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, pd, pubdash)
|
|
assert.Equal(t, d.Uid, pubdash.DashboardUid)
|
|
})
|
|
|
|
t.Run("returns ErrPublicDashboardNotFound with empty uid", func(t *testing.T) {
|
|
setup()
|
|
_, _, err := dashboardStore.GetPublicDashboard(context.Background(), "")
|
|
require.Error(t, models.ErrPublicDashboardIdentifierNotSet, err)
|
|
})
|
|
|
|
t.Run("returns ErrPublicDashboardNotFound when PublicDashboard not found", func(t *testing.T) {
|
|
setup()
|
|
_, _, err := dashboardStore.GetPublicDashboard(context.Background(), "zzzzzz")
|
|
require.Error(t, models.ErrPublicDashboardNotFound, err)
|
|
})
|
|
|
|
t.Run("returns ErrDashboardNotFound when Dashboard not found", func(t *testing.T) {
|
|
setup()
|
|
_, err := dashboardStore.SavePublicDashboardConfig(context.Background(), models.SavePublicDashboardConfigCommand{
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
PublicDashboard: models.PublicDashboard{
|
|
IsEnabled: true,
|
|
Uid: "abc1234",
|
|
DashboardUid: "nevergonnafindme",
|
|
OrgId: savedDashboard.OrgId,
|
|
CreatedAt: DefaultTime,
|
|
CreatedBy: 7,
|
|
},
|
|
})
|
|
require.NoError(t, err)
|
|
_, _, err = dashboardStore.GetPublicDashboard(context.Background(), "abc1234")
|
|
require.Error(t, models.ErrDashboardNotFound, err)
|
|
})
|
|
}
|
|
|
|
// GetPublicDashboardConfig
|
|
func TestIntegrationGetPublicDashboardConfig(t *testing.T) {
|
|
var sqlStore *sqlstore.SQLStore
|
|
var dashboardStore *DashboardStore
|
|
var savedDashboard *models.Dashboard
|
|
|
|
setup := func() {
|
|
sqlStore = sqlstore.InitTestDB(t)
|
|
dashboardStore = ProvideDashboardStore(sqlStore)
|
|
savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, true)
|
|
}
|
|
|
|
t.Run("returns isPublic and set dashboardUid and orgId", func(t *testing.T) {
|
|
setup()
|
|
pubdash, err := dashboardStore.GetPublicDashboardConfig(context.Background(), savedDashboard.OrgId, savedDashboard.Uid)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, &models.PublicDashboard{IsEnabled: false, DashboardUid: savedDashboard.Uid, OrgId: savedDashboard.OrgId}, pubdash)
|
|
})
|
|
|
|
t.Run("returns dashboard errDashboardIdentifierNotSet", func(t *testing.T) {
|
|
setup()
|
|
_, err := dashboardStore.GetPublicDashboardConfig(context.Background(), savedDashboard.OrgId, "")
|
|
require.Error(t, models.ErrDashboardIdentifierNotSet, err)
|
|
})
|
|
|
|
t.Run("returns isPublic along with public dashboard when exists", func(t *testing.T) {
|
|
setup()
|
|
// insert test public dashboard
|
|
resp, err := dashboardStore.SavePublicDashboardConfig(context.Background(), models.SavePublicDashboardConfigCommand{
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
PublicDashboard: models.PublicDashboard{
|
|
IsEnabled: true,
|
|
Uid: "pubdash-uid",
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
TimeSettings: DefaultTimeSettings,
|
|
CreatedAt: DefaultTime,
|
|
CreatedBy: 7,
|
|
},
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
pubdash, err := dashboardStore.GetPublicDashboardConfig(context.Background(), savedDashboard.OrgId, savedDashboard.Uid)
|
|
require.NoError(t, err)
|
|
|
|
assert.True(t, assert.ObjectsAreEqualValues(resp, pubdash))
|
|
assert.True(t, assert.ObjectsAreEqual(resp, pubdash))
|
|
})
|
|
}
|
|
|
|
// SavePublicDashboardConfig
|
|
func TestIntegrationSavePublicDashboardConfig(t *testing.T) {
|
|
var sqlStore *sqlstore.SQLStore
|
|
var dashboardStore *DashboardStore
|
|
var savedDashboard *models.Dashboard
|
|
var savedDashboard2 *models.Dashboard
|
|
|
|
setup := func() {
|
|
sqlStore = sqlstore.InitTestDB(t, sqlstore.InitTestDBOpt{FeatureFlags: []string{featuremgmt.FlagPublicDashboards}})
|
|
dashboardStore = ProvideDashboardStore(sqlStore)
|
|
savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, true)
|
|
savedDashboard2 = insertTestDashboard(t, dashboardStore, "testDashie2", 1, 0, true)
|
|
}
|
|
|
|
t.Run("saves new public dashboard", func(t *testing.T) {
|
|
setup()
|
|
resp, err := dashboardStore.SavePublicDashboardConfig(context.Background(), models.SavePublicDashboardConfigCommand{
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
PublicDashboard: models.PublicDashboard{
|
|
IsEnabled: true,
|
|
Uid: "pubdash-uid",
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
TimeSettings: DefaultTimeSettings,
|
|
CreatedAt: DefaultTime,
|
|
CreatedBy: 7,
|
|
AccessToken: "NOTAREALUUID",
|
|
},
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
pubdash, err := dashboardStore.GetPublicDashboardConfig(context.Background(), savedDashboard.OrgId, savedDashboard.Uid)
|
|
require.NoError(t, err)
|
|
|
|
//verify saved response and queried response are the same
|
|
assert.Equal(t, resp, pubdash)
|
|
|
|
// verify we have a valid uid
|
|
assert.True(t, util.IsValidShortUID(pubdash.Uid))
|
|
|
|
// verify we didn't update all dashboards
|
|
pubdash2, err := dashboardStore.GetPublicDashboardConfig(context.Background(), savedDashboard2.OrgId, savedDashboard2.Uid)
|
|
require.NoError(t, err)
|
|
assert.False(t, pubdash2.IsEnabled)
|
|
})
|
|
}
|
|
|
|
func TestIntegrationUpdatePublicDashboard(t *testing.T) {
|
|
var sqlStore *sqlstore.SQLStore
|
|
var dashboardStore *DashboardStore
|
|
var savedDashboard *models.Dashboard
|
|
|
|
setup := func() {
|
|
sqlStore = sqlstore.InitTestDB(t, sqlstore.InitTestDBOpt{FeatureFlags: []string{featuremgmt.FlagPublicDashboards}})
|
|
dashboardStore = ProvideDashboardStore(sqlStore)
|
|
savedDashboard = insertTestDashboard(t, dashboardStore, "testDashie", 1, 0, true)
|
|
}
|
|
|
|
t.Run("updates an existing dashboard", func(t *testing.T) {
|
|
setup()
|
|
|
|
pdUid := "asdf1234"
|
|
|
|
_, err := dashboardStore.SavePublicDashboardConfig(context.Background(), models.SavePublicDashboardConfigCommand{
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
PublicDashboard: models.PublicDashboard{
|
|
Uid: pdUid,
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
IsEnabled: true,
|
|
CreatedAt: DefaultTime,
|
|
CreatedBy: 7,
|
|
AccessToken: "NOTAREALUUID",
|
|
},
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
updatedPublicDashboard := models.PublicDashboard{
|
|
Uid: pdUid,
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
IsEnabled: false,
|
|
TimeSettings: simplejson.NewFromAny(map[string]interface{}{"from": "now-8", "to": "now"}),
|
|
UpdatedAt: time.Now().UTC().Round(time.Second),
|
|
UpdatedBy: 8,
|
|
}
|
|
// update initial record
|
|
err = dashboardStore.UpdatePublicDashboardConfig(context.Background(), models.SavePublicDashboardConfigCommand{
|
|
DashboardUid: savedDashboard.Uid,
|
|
OrgId: savedDashboard.OrgId,
|
|
PublicDashboard: updatedPublicDashboard,
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
pdRetrieved, err := dashboardStore.GetPublicDashboardConfig(context.Background(), savedDashboard.OrgId, savedDashboard.Uid)
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, updatedPublicDashboard.UpdatedAt, pdRetrieved.UpdatedAt)
|
|
// make sure we're correctly updated IsEnabled because we have to call
|
|
// UseBool with xorm
|
|
assert.Equal(t, updatedPublicDashboard.IsEnabled, pdRetrieved.IsEnabled)
|
|
})
|
|
}
|