mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			166 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package api
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"net/http"
 | |
| 	"net/http/httptest"
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/grafana/grafana/pkg/infra/localcache"
 | |
| 	"github.com/grafana/grafana/pkg/services/sqlstore/mockstore"
 | |
| 	"github.com/grafana/grafana/pkg/setting"
 | |
| 	"github.com/grafana/grafana/pkg/web"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| func TestHealthAPI_Version(t *testing.T) {
 | |
| 	m, _ := setupHealthAPITestEnvironment(t, func(cfg *setting.Cfg) {
 | |
| 		cfg.BuildVersion = "7.4.0"
 | |
| 		cfg.BuildCommit = "59906ab1bf"
 | |
| 	})
 | |
| 
 | |
| 	req := httptest.NewRequest(http.MethodGet, "/api/health", nil)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 	m.ServeHTTP(rec, req)
 | |
| 
 | |
| 	require.Equal(t, 200, rec.Code)
 | |
| 	expectedBody := `
 | |
| 		{
 | |
| 			"database": "ok",
 | |
| 			"version": "7.4.0",
 | |
| 			"commit": "59906ab1bf"
 | |
| 		}
 | |
| 	`
 | |
| 	require.JSONEq(t, expectedBody, rec.Body.String())
 | |
| }
 | |
| 
 | |
| func TestHealthAPI_AnonymousHideVersion(t *testing.T) {
 | |
| 	m, hs := setupHealthAPITestEnvironment(t)
 | |
| 	hs.Cfg.AnonymousHideVersion = true
 | |
| 
 | |
| 	req := httptest.NewRequest(http.MethodGet, "/api/health", nil)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 	m.ServeHTTP(rec, req)
 | |
| 
 | |
| 	require.Equal(t, 200, rec.Code)
 | |
| 	expectedBody := `
 | |
| 		{
 | |
| 			"database": "ok"
 | |
| 		}
 | |
| 	`
 | |
| 	require.JSONEq(t, expectedBody, rec.Body.String())
 | |
| }
 | |
| 
 | |
| func TestHealthAPI_DatabaseHealthy(t *testing.T) {
 | |
| 	const cacheKey = "db-healthy"
 | |
| 
 | |
| 	m, hs := setupHealthAPITestEnvironment(t)
 | |
| 	hs.Cfg.AnonymousHideVersion = true
 | |
| 
 | |
| 	healthy, found := hs.CacheService.Get(cacheKey)
 | |
| 	require.False(t, found)
 | |
| 	require.Nil(t, healthy)
 | |
| 
 | |
| 	req := httptest.NewRequest(http.MethodGet, "/api/health", nil)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 	m.ServeHTTP(rec, req)
 | |
| 
 | |
| 	require.Equal(t, 200, rec.Code)
 | |
| 	expectedBody := `
 | |
| 		{
 | |
| 			"database": "ok"
 | |
| 		}
 | |
| 	`
 | |
| 	require.JSONEq(t, expectedBody, rec.Body.String())
 | |
| 
 | |
| 	healthy, found = hs.CacheService.Get(cacheKey)
 | |
| 	require.True(t, found)
 | |
| 	require.True(t, healthy.(bool))
 | |
| }
 | |
| 
 | |
| func TestHealthAPI_DatabaseUnhealthy(t *testing.T) {
 | |
| 	const cacheKey = "db-healthy"
 | |
| 
 | |
| 	m, hs := setupHealthAPITestEnvironment(t)
 | |
| 	hs.Cfg.AnonymousHideVersion = true
 | |
| 	hs.SQLStore.(*mockstore.SQLStoreMock).ExpectedError = errors.New("bad")
 | |
| 
 | |
| 	healthy, found := hs.CacheService.Get(cacheKey)
 | |
| 	require.False(t, found)
 | |
| 	require.Nil(t, healthy)
 | |
| 
 | |
| 	req := httptest.NewRequest(http.MethodGet, "/api/health", nil)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 	m.ServeHTTP(rec, req)
 | |
| 
 | |
| 	require.Equal(t, 503, rec.Code)
 | |
| 	expectedBody := `
 | |
| 		{
 | |
| 			"database": "failing"
 | |
| 		}
 | |
| 	`
 | |
| 	require.JSONEq(t, expectedBody, rec.Body.String())
 | |
| 
 | |
| 	healthy, found = hs.CacheService.Get(cacheKey)
 | |
| 	require.True(t, found)
 | |
| 	require.False(t, healthy.(bool))
 | |
| }
 | |
| 
 | |
| func TestHealthAPI_DatabaseHealthCached(t *testing.T) {
 | |
| 	const cacheKey = "db-healthy"
 | |
| 
 | |
| 	m, hs := setupHealthAPITestEnvironment(t)
 | |
| 	hs.Cfg.AnonymousHideVersion = true
 | |
| 
 | |
| 	// Mock unhealthy database in cache.
 | |
| 	hs.CacheService.Set(cacheKey, false, 5*time.Minute)
 | |
| 
 | |
| 	req := httptest.NewRequest(http.MethodGet, "/api/health", nil)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 	m.ServeHTTP(rec, req)
 | |
| 
 | |
| 	require.Equal(t, 503, rec.Code)
 | |
| 	expectedBody := `
 | |
| 		{
 | |
| 			"database": "failing"
 | |
| 		}
 | |
| 	`
 | |
| 	require.JSONEq(t, expectedBody, rec.Body.String())
 | |
| 
 | |
| 	// Purge cache and redo request.
 | |
| 	hs.CacheService.Delete(cacheKey)
 | |
| 	rec = httptest.NewRecorder()
 | |
| 	m.ServeHTTP(rec, req)
 | |
| 
 | |
| 	require.Equal(t, 200, rec.Code)
 | |
| 	expectedBody = `
 | |
| 		{
 | |
| 			"database": "ok"
 | |
| 		}
 | |
| 	`
 | |
| 	require.JSONEq(t, expectedBody, rec.Body.String())
 | |
| 
 | |
| 	healthy, found := hs.CacheService.Get(cacheKey)
 | |
| 	require.True(t, found)
 | |
| 	require.True(t, healthy.(bool))
 | |
| }
 | |
| 
 | |
| func setupHealthAPITestEnvironment(t *testing.T, cbs ...func(*setting.Cfg)) (*web.Mux, *HTTPServer) {
 | |
| 	t.Helper()
 | |
| 
 | |
| 	m := web.New()
 | |
| 	cfg := setting.NewCfg()
 | |
| 	for _, cb := range cbs {
 | |
| 		cb(cfg)
 | |
| 	}
 | |
| 	hs := &HTTPServer{
 | |
| 		CacheService: localcache.New(5*time.Minute, 10*time.Minute),
 | |
| 		Cfg:          cfg,
 | |
| 		SQLStore:     mockstore.NewSQLStoreMock(),
 | |
| 	}
 | |
| 
 | |
| 	m.Get("/api/health", hs.apiHealthHandler)
 | |
| 	return m, hs
 | |
| }
 |