diff --git a/internal/sinks/multiwriter.go b/internal/sinks/multiwriter.go index 2e50ca6049..470fd214d9 100644 --- a/internal/sinks/multiwriter.go +++ b/internal/sinks/multiwriter.go @@ -77,7 +77,7 @@ func (mw *MultiWriter) DefineMetrics(metrics *metrics.Metrics) (err error) { err = errors.Join(err, definer.DefineMetrics(metrics)) } } - return nil + return err } func (mw *MultiWriter) SyncMetric(sourceName, metricName string, op SyncOp) (err error) { diff --git a/internal/sinks/multiwriter_test.go b/internal/sinks/multiwriter_test.go index 075e5014ed..4dfdf2985c 100644 --- a/internal/sinks/multiwriter_test.go +++ b/internal/sinks/multiwriter_test.go @@ -1,6 +1,7 @@ package sinks_test import ( + "errors" "testing" "github.com/cybertec-postgresql/pgwatch/v5/internal/metrics" @@ -87,6 +88,42 @@ func TestWriteMeasurements(t *testing.T) { assert.NoError(t, err) } +type MockWriterWithDefiner struct { + shouldError bool +} + +func (mw *MockWriterWithDefiner) SyncMetric(_, _ string, _ sinks.SyncOp) error { + return nil +} + +func (mw *MockWriterWithDefiner) Write(_ metrics.MeasurementEnvelope) error { + return nil +} + +func (mw *MockWriterWithDefiner) DefineMetrics(metrics *metrics.Metrics) error { + if mw.shouldError { + return errors.New("metric err") + } + return nil +} + +func TestDefineMetrics(t *testing.T) { + t.Run("when there is error", func(t *testing.T) { + mw := &sinks.MultiWriter{} + mockWriter := &MockWriterWithDefiner{shouldError: true} + mw.AddWriter(mockWriter) + err := mw.DefineMetrics(&metrics.Metrics{}) + assert.Error(t, err) + }) + t.Run("when there is no error", func(t *testing.T) { + mw := &sinks.MultiWriter{} + mockWriter := &MockWriterWithDefiner{shouldError: false} + mw.AddWriter(mockWriter) + err := mw.DefineMetrics(&metrics.Metrics{}) + assert.NoError(t, err) + }) +} + // mockMigratableWriter implements Writer and Migrator interfaces type mockMigratableWriter struct { migrateErr error