github.com/kiali/kiali@v1.84.0/business/grafana_test.go (about) 1 package business 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 10 "github.com/kiali/kiali/config" 11 ) 12 13 var dashboardsConfig = []config.GrafanaDashboardConfig{ 14 { 15 Name: "My Dashboard", 16 }, 17 } 18 19 var anError = map[string]string{ 20 "message": "unauthorized", 21 } 22 23 func genDashboard(path string) []map[string]interface{} { 24 return []map[string]interface{}{ 25 { 26 "url": path, 27 }, 28 } 29 } 30 31 func TestGetGrafanaInfoDisabled(t *testing.T) { 32 conf := config.NewConfig() 33 conf.ExternalServices.Grafana.Enabled = false 34 config.Set(conf) 35 36 info, code, err := GetGrafanaInfo(buildDashboardSupplier(genDashboard("/some_path"), 200, "whatever", t)) 37 assert.Nil(t, err) 38 assert.Equal(t, http.StatusNoContent, code) 39 assert.Nil(t, info) 40 } 41 42 func TestGetGrafanaInfoExternal(t *testing.T) { 43 conf := config.NewConfig() 44 conf.ExternalServices.Grafana.InClusterURL = "" 45 conf.ExternalServices.Grafana.URL = "http://grafana-external:3001" 46 conf.ExternalServices.Grafana.Dashboards = dashboardsConfig 47 config.Set(conf) 48 49 info, code, err := GetGrafanaInfo(buildDashboardSupplier(genDashboard("/some_path"), 200, "http://grafana-external:3001", t)) 50 51 assert.Nil(t, err) 52 assert.Equal(t, http.StatusOK, code) 53 assert.Len(t, info.ExternalLinks, 1) 54 assert.Equal(t, "http://grafana-external:3001/some_path", info.ExternalLinks[0].URL) 55 } 56 57 func TestGetGrafanaInfoInCluster(t *testing.T) { 58 conf := config.NewConfig() 59 conf.ExternalServices.Grafana.URL = "http://grafana-external:3001" 60 conf.ExternalServices.Grafana.Dashboards = dashboardsConfig 61 conf.ExternalServices.Grafana.InClusterURL = "http://grafana.istio-system:3001" 62 config.Set(conf) 63 64 info, code, err := GetGrafanaInfo(buildDashboardSupplier(genDashboard("/some_path"), 200, "http://grafana.istio-system:3001", t)) 65 66 assert.Nil(t, err) 67 assert.Equal(t, http.StatusOK, code) 68 assert.Len(t, info.ExternalLinks, 1) 69 assert.Equal(t, "http://grafana-external:3001/some_path", info.ExternalLinks[0].URL) 70 } 71 72 func TestGetGrafanaInfoGetError(t *testing.T) { 73 conf := config.NewConfig() 74 conf.ExternalServices.Grafana.InClusterURL = "" 75 conf.ExternalServices.Grafana.URL = "http://grafana-external:3001" 76 conf.ExternalServices.Grafana.Dashboards = dashboardsConfig 77 config.Set(conf) 78 79 _, code, err := GetGrafanaInfo(buildDashboardSupplier(anError, 401, "http://grafana-external:3001", t)) 80 81 assert.Equal(t, "error from Grafana (401): unauthorized", err.Error()) 82 assert.Equal(t, 503, code) 83 } 84 85 func TestGetGrafanaInfoInvalidDashboard(t *testing.T) { 86 conf := config.NewConfig() 87 conf.ExternalServices.Grafana.InClusterURL = "" 88 conf.ExternalServices.Grafana.URL = "http://grafana-external:3001" 89 conf.ExternalServices.Grafana.Dashboards = dashboardsConfig 90 config.Set(conf) 91 92 _, code, err := GetGrafanaInfo(buildDashboardSupplier("unexpected response", 200, "http://grafana-external:3001", t)) 93 94 assert.NotNil(t, err) 95 assert.Contains(t, err.Error(), "json: cannot unmarshal") 96 assert.Equal(t, 503, code) 97 } 98 99 func TestGetGrafanaInfoWithoutLeadingSlashPath(t *testing.T) { 100 conf := config.NewConfig() 101 conf.ExternalServices.Grafana.InClusterURL = "" 102 conf.ExternalServices.Grafana.URL = "http://grafana-external:3001" 103 conf.ExternalServices.Grafana.Dashboards = dashboardsConfig 104 config.Set(conf) 105 106 info, code, err := GetGrafanaInfo(buildDashboardSupplier(genDashboard("some_path"), 200, "http://grafana-external:3001", t)) 107 108 assert.Nil(t, err) 109 assert.Equal(t, http.StatusOK, code) 110 assert.Len(t, info.ExternalLinks, 1) 111 assert.Equal(t, "http://grafana-external:3001/some_path", info.ExternalLinks[0].URL) 112 } 113 114 func TestGetGrafanaInfoWithTrailingSlashURL(t *testing.T) { 115 conf := config.NewConfig() 116 conf.ExternalServices.Grafana.InClusterURL = "" 117 conf.ExternalServices.Grafana.URL = "http://grafana-external:3001/" 118 conf.ExternalServices.Grafana.Dashboards = dashboardsConfig 119 config.Set(conf) 120 121 info, code, err := GetGrafanaInfo(buildDashboardSupplier(genDashboard("/some_path"), 200, "http://grafana-external:3001/", t)) 122 123 assert.Nil(t, err) 124 assert.Equal(t, http.StatusOK, code) 125 assert.Len(t, info.ExternalLinks, 1) 126 assert.Equal(t, "http://grafana-external:3001/some_path", info.ExternalLinks[0].URL) 127 } 128 129 func TestGetGrafanaInfoWithQueryParams(t *testing.T) { 130 conf := config.NewConfig() 131 conf.ExternalServices.Grafana.InClusterURL = "" 132 conf.ExternalServices.Grafana.URL = "http://grafana-external:3001/?orgId=1" 133 conf.ExternalServices.Grafana.Dashboards = dashboardsConfig 134 config.Set(conf) 135 136 info, code, err := GetGrafanaInfo(buildDashboardSupplier(genDashboard("/some_path"), 200, "http://grafana-external:3001/?orgId=1", t)) 137 138 assert.Nil(t, err) 139 assert.Equal(t, http.StatusOK, code) 140 assert.Len(t, info.ExternalLinks, 1) 141 assert.Equal(t, "http://grafana-external:3001/some_path?orgId=1", info.ExternalLinks[0].URL) 142 } 143 144 func TestGetGrafanaInfoWithAbsoluteDashboardURL(t *testing.T) { 145 conf := config.NewConfig() 146 conf.ExternalServices.Grafana.InClusterURL = "" 147 conf.ExternalServices.Grafana.URL = "/system/grafana/" 148 conf.ExternalServices.Grafana.Dashboards = dashboardsConfig 149 conf.ExternalServices.Grafana.InClusterURL = "http://grafana.istio-system:3001" 150 config.Set(conf) 151 info, code, err := GetGrafanaInfo(buildDashboardSupplier(genDashboard("/system/grafana/some_path"), 200, "http://grafana.istio-system:3001", t)) 152 assert.Nil(t, err) 153 assert.Equal(t, http.StatusOK, code) 154 assert.Len(t, info.ExternalLinks, 1) 155 assert.Equal(t, "/system/grafana/some_path", info.ExternalLinks[0].URL) 156 } 157 158 func buildDashboardSupplier(jSon interface{}, code int, expectURL string, t *testing.T) dashboardSupplier { 159 return func(url, _ string, _ *config.Auth) ([]byte, int, error) { 160 assert.Equal(t, expectURL, url) 161 bytes, err := json.Marshal(jSon) 162 return bytes, code, err 163 } 164 }