mirror of https://github.com/grafana/grafana
Public Dashboards: Adds template variable validation for pubdash on the backend (#52566)
Validates template variables for pubdash on the backend when saving a public dashboardpull/52631/head
parent
9ef29bb5c3
commit
cf86c696e0
@ -0,0 +1,60 @@ |
||||
package validation |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/grafana/grafana/pkg/components/simplejson" |
||||
"github.com/grafana/grafana/pkg/models" |
||||
publicdashboardModels "github.com/grafana/grafana/pkg/services/publicdashboards/models" |
||||
"github.com/stretchr/testify/require" |
||||
) |
||||
|
||||
func TestValidateSavePublicDashboard(t *testing.T) { |
||||
t.Run("Returns validation error when dto has no dashboard uid", func(t *testing.T) { |
||||
dashboard := models.NewDashboard("dashboardTitle") |
||||
dto := &publicdashboardModels.SavePublicDashboardConfigDTO{DashboardUid: "", OrgId: 1, UserId: 1, PublicDashboard: nil} |
||||
|
||||
err := ValidateSavePublicDashboard(dto, dashboard) |
||||
require.ErrorContains(t, err, "Unique identifier needed to be able to get a dashboard") |
||||
}) |
||||
|
||||
t.Run("Returns no validation error when dto has dashboard uid", func(t *testing.T) { |
||||
dashboard := models.NewDashboard("dashboardTitle") |
||||
dto := &publicdashboardModels.SavePublicDashboardConfigDTO{DashboardUid: "abc123", OrgId: 1, UserId: 1, PublicDashboard: nil} |
||||
|
||||
err := ValidateSavePublicDashboard(dto, dashboard) |
||||
require.NoError(t, err) |
||||
}) |
||||
|
||||
t.Run("Returns validation error when dashboard has template variables", func(t *testing.T) { |
||||
templateVars := []byte(`{ |
||||
"templating": { |
||||
"list": [ |
||||
{ |
||||
"name": "templateVariableName" |
||||
} |
||||
] |
||||
} |
||||
}`) |
||||
dashboardData, _ := simplejson.NewJson(templateVars) |
||||
dashboard := models.NewDashboardFromJson(dashboardData) |
||||
dto := &publicdashboardModels.SavePublicDashboardConfigDTO{DashboardUid: "abc123", OrgId: 1, UserId: 1, PublicDashboard: nil} |
||||
|
||||
err := ValidateSavePublicDashboard(dto, dashboard) |
||||
require.ErrorContains(t, err, "Public dashboard has template variables") |
||||
}) |
||||
|
||||
t.Run("Returns no validation error when dashboard has no template variables", func(t *testing.T) { |
||||
templateVars := []byte(`{ |
||||
"templating": { |
||||
"list": [] |
||||
} |
||||
}`) |
||||
dashboardData, _ := simplejson.NewJson(templateVars) |
||||
dashboard := models.NewDashboardFromJson(dashboardData) |
||||
dto := &publicdashboardModels.SavePublicDashboardConfigDTO{DashboardUid: "abc123", OrgId: 1, UserId: 1, PublicDashboard: nil} |
||||
|
||||
err := ValidateSavePublicDashboard(dto, dashboard) |
||||
require.NoError(t, err) |
||||
}) |
||||
} |
@ -0,0 +1,27 @@ |
||||
package validation |
||||
|
||||
import ( |
||||
"github.com/grafana/grafana/pkg/models" |
||||
"github.com/grafana/grafana/pkg/services/dashboards" |
||||
publicDashboardModels "github.com/grafana/grafana/pkg/services/publicdashboards/models" |
||||
) |
||||
|
||||
func ValidateSavePublicDashboard(dto *publicDashboardModels.SavePublicDashboardConfigDTO, dashboard *models.Dashboard) error { |
||||
var err error |
||||
|
||||
if len(dto.DashboardUid) == 0 { |
||||
return dashboards.ErrDashboardIdentifierNotSet |
||||
} |
||||
|
||||
if hasTemplateVariables(dashboard) { |
||||
return publicDashboardModels.ErrPublicDashboardHasTemplateVariables |
||||
} |
||||
|
||||
return err |
||||
} |
||||
|
||||
func hasTemplateVariables(dashboard *models.Dashboard) bool { |
||||
templateVariables := dashboard.Data.Get("templating").Get("list").MustArray() |
||||
|
||||
return len(templateVariables) > 0 |
||||
} |
Loading…
Reference in new issue