mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
	
	
		
			131 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | package setting | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"encoding/json" | ||
|  | 	"strings" | ||
|  | 	"testing" | ||
|  | 
 | ||
|  | 	"github.com/stretchr/testify/assert" | ||
|  | 	"github.com/stretchr/testify/require" | ||
|  | 	"gopkg.in/ini.v1" | ||
|  | ) | ||
|  | 
 | ||
|  | func TestReadTimePicker(t *testing.T) { | ||
|  | 	t.Run("Default values when quick_ranges not specified", func(t *testing.T) { | ||
|  | 		cfg := NewCfg() | ||
|  | 		iniContent := ` | ||
|  | [time_picker] | ||
|  | ` | ||
|  | 		iniFile, err := ini.Load([]byte(iniContent)) | ||
|  | 		require.NoError(t, err) | ||
|  | 		cfg.Raw = iniFile | ||
|  | 
 | ||
|  | 		err = cfg.readTimePicker() | ||
|  | 		require.NoError(t, err) | ||
|  | 
 | ||
|  | 		// Default values should be used
 | ||
|  | 		assert.Empty(t, cfg.QuickRanges) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("Parse valid quick_ranges", func(t *testing.T) { | ||
|  | 		cfg := NewCfg() | ||
|  | 		iniContent := ` | ||
|  | [time_picker] | ||
|  | quick_ranges = [{"display":"Last 5 minutes","from":"now-5m","to":"now"},{"display":"Yesterday","from":"now-1d/d"},{"display":"Today so far","from":"now/d","to":"now"}] | ||
|  | ` | ||
|  | 		iniFile, err := ini.Load([]byte(iniContent)) | ||
|  | 		require.NoError(t, err) | ||
|  | 		cfg.Raw = iniFile | ||
|  | 
 | ||
|  | 		err = cfg.readTimePicker() | ||
|  | 		require.NoError(t, err) | ||
|  | 
 | ||
|  | 		// Validate parsed values
 | ||
|  | 		require.Len(t, cfg.QuickRanges, 3) | ||
|  | 
 | ||
|  | 		// First range
 | ||
|  | 		assert.Equal(t, "Last 5 minutes", cfg.QuickRanges[0].Display) | ||
|  | 		assert.Equal(t, "now-5m", cfg.QuickRanges[0].From) | ||
|  | 		assert.Equal(t, "now", cfg.QuickRanges[0].To) | ||
|  | 
 | ||
|  | 		// Second range (defaulted to 'now')
 | ||
|  | 		assert.Equal(t, "Yesterday", cfg.QuickRanges[1].Display) | ||
|  | 		assert.Equal(t, "now-1d/d", cfg.QuickRanges[1].From) | ||
|  | 		assert.Equal(t, "now", cfg.QuickRanges[1].To) | ||
|  | 
 | ||
|  | 		// Third range
 | ||
|  | 		assert.Equal(t, "Today so far", cfg.QuickRanges[2].Display) | ||
|  | 		assert.Equal(t, "now/d", cfg.QuickRanges[2].From) | ||
|  | 		assert.Equal(t, "now", cfg.QuickRanges[2].To) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("QuickRange with missing To field gets default value", func(t *testing.T) { | ||
|  | 		cfg := NewCfg() | ||
|  | 		iniContent := ` | ||
|  | [time_picker] | ||
|  | quick_ranges = [{"display":"Yesterday","from":"now-1d/d"}] | ||
|  | ` | ||
|  | 		iniFile, err := ini.Load([]byte(iniContent)) | ||
|  | 		require.NoError(t, err) | ||
|  | 		cfg.Raw = iniFile | ||
|  | 
 | ||
|  | 		err = cfg.readTimePicker() | ||
|  | 		require.NoError(t, err) | ||
|  | 
 | ||
|  | 		// Validate the parsed value
 | ||
|  | 		require.Len(t, cfg.QuickRanges, 1) | ||
|  | 		assert.Equal(t, "Yesterday", cfg.QuickRanges[0].Display) | ||
|  | 		assert.Equal(t, "now-1d/d", cfg.QuickRanges[0].From) | ||
|  | 		assert.Equal(t, "now", cfg.QuickRanges[0].To) | ||
|  | 
 | ||
|  | 		jsonBytes, err := json.Marshal(cfg.QuickRanges) | ||
|  | 		require.NoError(t, err) | ||
|  | 		assert.Contains(t, string(jsonBytes), "\"to\":\"now\"") | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("Invalid JSON format", func(t *testing.T) { | ||
|  | 		cfg := NewCfg() | ||
|  | 		iniContent := ` | ||
|  | [time_picker] | ||
|  | quick_ranges = [{"display":"Last 5 minutes","from":"now-5m","to":"now"}, INVALID JSON] | ||
|  | ` | ||
|  | 		iniFile, err := ini.Load([]byte(iniContent)) | ||
|  | 		require.NoError(t, err) | ||
|  | 		cfg.Raw = iniFile | ||
|  | 
 | ||
|  | 		err = cfg.readTimePicker() | ||
|  | 		require.Error(t, err) | ||
|  | 		assert.True(t, strings.Contains(err.Error(), "failed to parse quick_ranges")) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("Missing display field", func(t *testing.T) { | ||
|  | 		cfg := NewCfg() | ||
|  | 		iniContent := ` | ||
|  | [time_picker] | ||
|  | quick_ranges = [{"from":"now-5m","to":"now"}] | ||
|  | ` | ||
|  | 		iniFile, err := ini.Load([]byte(iniContent)) | ||
|  | 		require.NoError(t, err) | ||
|  | 		cfg.Raw = iniFile | ||
|  | 
 | ||
|  | 		err = cfg.readTimePicker() | ||
|  | 		require.Error(t, err) | ||
|  | 		assert.True(t, strings.Contains(err.Error(), "missing display name")) | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("Missing from field", func(t *testing.T) { | ||
|  | 		cfg := NewCfg() | ||
|  | 		iniContent := ` | ||
|  | [time_picker] | ||
|  | quick_ranges = [{"display":"Last 5 minutes","to":"now"}] | ||
|  | ` | ||
|  | 		iniFile, err := ini.Load([]byte(iniContent)) | ||
|  | 		require.NoError(t, err) | ||
|  | 		cfg.Raw = iniFile | ||
|  | 
 | ||
|  | 		err = cfg.readTimePicker() | ||
|  | 		require.Error(t, err) | ||
|  | 		assert.True(t, strings.Contains(err.Error(), "missing 'from' field")) | ||
|  | 	}) | ||
|  | } |