diff --git a/internal/exporter/exporter.go b/internal/exporter/exporter.go index 59605203..debef2ba 100644 --- a/internal/exporter/exporter.go +++ b/internal/exporter/exporter.go @@ -209,11 +209,6 @@ func (e *healthExporter) exportToHTTP(ctx context.Context, data *collector.Healt return nil } - if e.options.config.AuthToken == "" { - log.Logger.Infow("No auth token configured, skipping HTTP export") - return nil - } - newToken, err := e.httpWriter.Send(ctx, data, e.options.config.MetricsEndpoint, e.options.config.LogsEndpoint, e.options.config.RetryMaxAttempts, e.options.config.AuthToken) if err != nil { return fmt.Errorf("failed to send data: %w", err) diff --git a/internal/exporter/exporter_test.go b/internal/exporter/exporter_test.go index 8739eae1..0ed404d8 100644 --- a/internal/exporter/exporter_test.go +++ b/internal/exporter/exporter_test.go @@ -25,6 +25,7 @@ import ( "net/http/httptest" "os" "path/filepath" + "sync/atomic" "testing" "time" @@ -560,17 +561,36 @@ func TestExportToHTTP(t *testing.T) { require.NoError(t, err) }) - t.Run("skips when no auth token configured", func(t *testing.T) { + t.Run("updates token from server response", func(t *testing.T) { + newToken := "new-test-token" + + // Create mock server that returns new token + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("jwt_assertion", newToken) + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("SUCCESS")) + })) + defer server.Close() + cfg := &config.HealthExporterConfig{ Interval: metav1.Duration{Duration: 1 * time.Minute}, Timeout: metav1.Duration{Duration: 30 * time.Second}, - MetricsEndpoint: "http://example.com", - LogsEndpoint: "http://example.com", - AuthToken: "", + MetricsEndpoint: server.URL, + LogsEndpoint: server.URL, + AuthToken: "old-token", } ctx := context.Background() - exporter, err := New(ctx, WithConfig(cfg), WithMachineID("test-machine-id")) + + // Create temporary database for testing token updates + tmpDB := setupTestDB(t) + defer tmpDB.Close() + + exporter, err := New(ctx, + WithConfig(cfg), + WithDatabaseConnections(tmpDB, tmpDB), + WithMachineID("test-machine-id"), + ) require.NoError(t, err) require.NotNil(t, exporter) @@ -579,24 +599,39 @@ func TestExportToHTTP(t *testing.T) { healthData := &collector.HealthData{ MachineID: "test-machine", Timestamp: time.Now(), + Metrics: []pkgmetrics.Metric{ + { + Name: "test_metric", + Value: 42.0, + UnixMilliseconds: time.Now().UnixMilli(), + }, + }, } err = he.exportToHTTP(ctx, healthData) - require.NoError(t, err) // Should not error, just skip gracefully + require.NoError(t, err) + + // Verify token was updated in config + assert.Equal(t, newToken, he.options.config.AuthToken, "token should be refreshed in config") + + // Verify token was persisted to DB + storedToken, err := pkgmetadata.ReadMetadata(ctx, tmpDB, pkgmetadata.MetadataKeyToken) + require.NoError(t, err) + assert.Equal(t, newToken, storedToken, "token should be persisted to database") // Cleanup err = exporter.Stop() require.NoError(t, err) }) - t.Run("updates token from server response", func(t *testing.T) { - newToken := "new-test-token" - - // Create mock server that returns new token + t.Run("exports without auth token when endpoints configured", func(t *testing.T) { + // Create mock server that accepts requests without Authorization header + var requestCount atomic.Int32 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("X-New-JWT-Token", newToken) + requestCount.Add(1) + assert.Equal(t, http.MethodPost, r.Method) + assert.Empty(t, r.Header.Get("Authorization"), "should not send Authorization header when token is empty") w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("SUCCESS")) })) defer server.Close() @@ -605,20 +640,11 @@ func TestExportToHTTP(t *testing.T) { Timeout: metav1.Duration{Duration: 30 * time.Second}, MetricsEndpoint: server.URL, LogsEndpoint: server.URL, - AuthToken: "old-token", + AuthToken: "", // No auth token - should still export } ctx := context.Background() - - // Create temporary database for testing token updates - tmpDB := setupTestDB(t) - defer tmpDB.Close() - - exporter, err := New(ctx, - WithConfig(cfg), - WithDatabaseConnections(tmpDB, tmpDB), - WithMachineID("test-machine-id"), - ) + exporter, err := New(ctx, WithConfig(cfg), WithMachineID("test-machine-id")) require.NoError(t, err) require.NotNil(t, exporter) @@ -638,11 +664,12 @@ func TestExportToHTTP(t *testing.T) { err = he.exportToHTTP(ctx, healthData) require.NoError(t, err) + assert.Greater(t, requestCount.Load(), int32(0), "expected at least one request to the server") - // Cleanup err = exporter.Stop() require.NoError(t, err) }) + } // TestExportNow tests the ExportNow function