...

Source file src/github.com/cybertec-postgresql/pgwatch/v3/internal/metrics/yaml_test.go

Documentation: github.com/cybertec-postgresql/pgwatch/v3/internal/metrics

     1  package metrics_test
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestDeaultMetrics(t *testing.T) {
    14  	fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), "") // empty path is reserved for default metrics
    15  	assert.NoError(t, err)
    16  
    17  	// Test GetMetrics
    18  	metricsDefs, err := fmr.GetMetrics()
    19  	assert.NoError(t, err)
    20  
    21  	// Test WriteMetrics
    22  	err = fmr.WriteMetrics(metricsDefs)
    23  	assert.Error(t, err)
    24  
    25  	// Test DeleteMetric
    26  	err = fmr.DeleteMetric("test")
    27  	assert.Error(t, err)
    28  
    29  	// Test UpdateMetric
    30  	err = fmr.UpdateMetric("test", metrics.Metric{})
    31  	assert.Error(t, err)
    32  
    33  	// Test DeletePreset
    34  	err = fmr.DeletePreset("test")
    35  	assert.Error(t, err)
    36  
    37  	// Test UpdatePreset
    38  	err = fmr.UpdatePreset("test", metrics.Preset{})
    39  	assert.Error(t, err)
    40  }
    41  
    42  func TestWriteMetricsToFile(t *testing.T) {
    43  	// Define test data
    44  	metricDefs := metrics.Metrics{
    45  		MetricDefs: metrics.MetricDefs{
    46  			"test_metric": metrics.Metric{
    47  				SQLs: map[int]string{
    48  					1: "SELECT 1",
    49  				},
    50  				InitSQL:         "SELECT 1",
    51  				NodeStatus:      "primary",
    52  				Gauges:          []string{"gauge1", "gauge2"},
    53  				IsInstanceLevel: true,
    54  				StorageName:     "storage1",
    55  				Description:     "Test metric",
    56  			},
    57  		},
    58  		PresetDefs: metrics.PresetDefs{
    59  			"test_preset": metrics.Preset{
    60  				Description: "Test preset",
    61  				Metrics: map[string]float64{
    62  					"test_metric": 1.0,
    63  				},
    64  			},
    65  		},
    66  	}
    67  
    68  	// Create a temporary file for testing
    69  	tempDir := t.TempDir()
    70  	tempFile := filepath.Join(tempDir, "metrics.yaml")
    71  
    72  	fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), tempFile)
    73  	assert.NoError(t, err)
    74  
    75  	// Call the function being tested
    76  	err = fmr.WriteMetrics(&metricDefs)
    77  	assert.NoError(t, err)
    78  
    79  	// Read the contents of the file
    80  	assert.NoError(t, err)
    81  	metrics, err := fmr.GetMetrics()
    82  	assert.NoError(t, err)
    83  
    84  	// Assert that the file contains the expected data
    85  	assert.Equal(t, metricDefs, *metrics)
    86  }
    87  func TestMetricsToFile(t *testing.T) {
    88  	// Define test data
    89  	metricDefs := metrics.Metrics{
    90  		MetricDefs: metrics.MetricDefs{
    91  			"existing_metric": metrics.Metric{
    92  				SQLs: map[int]string{
    93  					1: "SELECT 1",
    94  				},
    95  				InitSQL:         "SELECT 1",
    96  				NodeStatus:      "primary",
    97  				Gauges:          []string{"gauge1", "gauge2"},
    98  				IsInstanceLevel: true,
    99  				StorageName:     "storage1",
   100  				Description:     "Existing metric",
   101  			},
   102  		},
   103  		PresetDefs: metrics.PresetDefs{
   104  			"test_preset": metrics.Preset{
   105  				Description: "Test preset",
   106  				Metrics: map[string]float64{
   107  					"existing_metric": 1.0,
   108  				},
   109  			},
   110  		},
   111  	}
   112  
   113  	// Create a temporary file for testing
   114  	tempDir := t.TempDir()
   115  	tempFile := filepath.Join(tempDir, "metrics.yaml")
   116  
   117  	fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), tempFile)
   118  	assert.NoError(t, err)
   119  
   120  	// Write initial metrics to the file
   121  	err = fmr.WriteMetrics(&metricDefs)
   122  	assert.NoError(t, err)
   123  
   124  	// Call the function being tested
   125  	newMetric := metrics.Metric{
   126  		SQLs: map[int]string{
   127  			1: "SELECT 2",
   128  		},
   129  		InitSQL:         "SELECT 2",
   130  		NodeStatus:      "primary",
   131  		Gauges:          []string{"gauge3", "gauge4"},
   132  		IsInstanceLevel: true,
   133  		StorageName:     "storage2",
   134  		Description:     "New metric",
   135  	}
   136  	err = fmr.UpdateMetric("new_metric", newMetric)
   137  	assert.NoError(t, err)
   138  
   139  	// Read the updated metrics from the file
   140  	updatedMetrics, err := fmr.GetMetrics()
   141  	assert.NoError(t, err)
   142  
   143  	// Assert that the metric was updated correctly
   144  	expectedMetrics := metricDefs
   145  	expectedMetrics.MetricDefs["new_metric"] = newMetric
   146  	assert.Equal(t, expectedMetrics, *updatedMetrics)
   147  
   148  	// Call the function being tested
   149  	err = fmr.DeleteMetric("new_metric")
   150  	assert.NoError(t, err)
   151  
   152  	// Read the updated metrics from the file
   153  	updatedMetrics, err = fmr.GetMetrics()
   154  	assert.NoError(t, err)
   155  
   156  	// Assert that the metric was deleted correctly
   157  	assert.Zero(t, updatedMetrics.MetricDefs["new_metric"])
   158  }
   159  
   160  func TestPresetsToFile(t *testing.T) {
   161  	// Define test data
   162  	presetDefs := metrics.PresetDefs{
   163  		"existing_preset": metrics.Preset{
   164  			Description: "Existing preset",
   165  			Metrics: map[string]float64{
   166  				"existing_metric": 1.0,
   167  			},
   168  		},
   169  	}
   170  
   171  	// Create a temporary file for testing
   172  	tempDir := t.TempDir()
   173  	tempFile := filepath.Join(tempDir, "metrics.yaml")
   174  
   175  	fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), tempFile)
   176  	assert.NoError(t, err)
   177  
   178  	// Write initial presets to the file
   179  	err = fmr.WriteMetrics(&metrics.Metrics{
   180  		PresetDefs: presetDefs,
   181  	})
   182  	assert.NoError(t, err)
   183  
   184  	// Call the function being tested
   185  	newPreset := metrics.Preset{
   186  		Description: "New preset",
   187  		Metrics: map[string]float64{
   188  			"new_metric": 1.0,
   189  		},
   190  	}
   191  	err = fmr.UpdatePreset("new_preset", newPreset)
   192  	assert.NoError(t, err)
   193  
   194  	// Read the updated presets from the file
   195  	updatedMetrics, err := fmr.GetMetrics()
   196  	assert.NoError(t, err)
   197  
   198  	// Assert that the preset was updated correctly
   199  	expectedPresets := presetDefs
   200  	expectedPresets["new_preset"] = newPreset
   201  	assert.Equal(t, expectedPresets, updatedMetrics.PresetDefs)
   202  
   203  	// check the delete preset function
   204  	err = fmr.DeletePreset("new_preset")
   205  	assert.NoError(t, err)
   206  
   207  	// Read the updated presets from the file
   208  	updatedMetrics, err = fmr.GetMetrics()
   209  	assert.NoError(t, err)
   210  
   211  	// Assert that the preset was deleted correctly
   212  	assert.Zero(t, updatedMetrics.PresetDefs["new_preset"])
   213  }
   214  
   215  func TestErrorHandlingToFile(t *testing.T) {
   216  	fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), "/") // empty path is reserved for default metrics
   217  	assert.NoError(t, err)
   218  
   219  	// Test WriteMetrics
   220  	err = fmr.WriteMetrics(&metrics.Metrics{})
   221  	assert.Error(t, err)
   222  
   223  	// Test GetMetrics
   224  	_, err = fmr.GetMetrics()
   225  	assert.Error(t, err)
   226  
   227  	// Test DeleteMetric
   228  	err = fmr.DeleteMetric("test")
   229  	assert.Error(t, err)
   230  
   231  	// Test UpdateMetric
   232  	err = fmr.UpdateMetric("test", metrics.Metric{})
   233  	assert.Error(t, err)
   234  
   235  	// Test DeletePreset
   236  	err = fmr.DeletePreset("test")
   237  	assert.Error(t, err)
   238  
   239  	// Test UpdatePreset
   240  	err = fmr.UpdatePreset("test", metrics.Preset{})
   241  	assert.Error(t, err)
   242  
   243  	// Test invalid YAML
   244  	tempDir := t.TempDir()
   245  	tempFile := filepath.Join(tempDir, "metrics.yaml")
   246  	file, err := os.Create(tempFile)
   247  	assert.NoError(t, err)
   248  	defer file.Close()
   249  	_, err = file.WriteString("invalid yaml")
   250  	assert.NoError(t, err)
   251  
   252  	fmr, err = metrics.NewYAMLMetricReaderWriter(context.Background(), tempFile)
   253  	assert.NoError(t, err)
   254  
   255  	_, err = fmr.GetMetrics()
   256  	assert.Error(t, err)
   257  }
   258