Ctrl K
ComunidadGuías…

internal/repository/clickhouse/reports_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package clickhouse

import (
	"context"
	"slices"
	"testing"

	"github.com/flexprice/flexprice/internal/domain/analytics"
	ierr "github.com/flexprice/flexprice/internal/errors"
	"github.com/flexprice/flexprice/internal/types"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func withSQL(t *testing.T, m types.Metric, sq *billingSQL) {
	t.Helper()
	prev := billingSQLs[m]
	billingSQLs[m] = sq
	t.Cleanup(func() { billingSQLs[m] = prev })
}

func TestBillingSQL_InvoiceTotalUsesConstants(t *testing.T) {
	_, sq, ok := lookupBillingMetric(types.MetricInvoiceTotal)
	require.True(t, ok)
	assert.Equal(t, "invoices", sq.Table)
	assert.Contains(t, sq.Where, "invoice_status = '"+string(types.InvoiceStatusFinalized)+"'")
}

func TestBillingSQL_MatchesDomainRegistry(t *testing.T) {
	metrics := analytics.BillingMetrics()
	assert.Len(t, billingSQLs, len(metrics))
	for _, m := range metrics {
		bm, sq, ok := lookupBillingMetric(m)
		require.True(t, ok, "metric %q has no SQL", m)
		for d := range sq.DimExprs {
			assert.True(t, slices.Contains(bm.Dimensions, d), "metric %q: unknown dimension %q", m, d)
		}
	}
}

func TestReportCatalog_AgreesWithRegistry(t *testing.T) {
	entries := analytics.ReportCatalog()
	require.NotEmpty(t, entries)
	for _, e := range entries {
		bm, sq, ok := lookupBillingMetric(e.Key)
		require.True(t, ok, "catalog key %q has no billing metric", e.Key)
		if sq.Agg != "" {
			assert.Equal(t, sq.Agg+"("+sq.Arg+")", sq.Measure, "measure of %q", e.Key)
		} else if sq.CompareMeasure == nil {
			assert.False(t, e.SupportsCompare, "compare of %q", e.Key)
		}
		for _, s := range e.Shapes {
			assert.Contains(t, bm.Shapes, s, "shape %q of %q", s, e.Key)
		}
		assert.Contains(t, e.Shapes, e.DefaultShape)
		for _, d := range e.Dimensions {
			assert.True(t, slices.Contains(bm.Dimensions, d.Key), "dimension %q of %q", d.Key, e.Key)
			assert.NotEmpty(t, d.Label)
		}
		for _, g := range e.Grains {
			assert.Contains(t, []types.Grain{types.GrainDay, types.GrainWeek, types.GrainMonth}, g)
		}
		assert.Contains(t, []types.ReportCategory{types.ReportCategoryBilling, types.ReportCategoryReceivables, types.ReportCategoryCustomers, types.ReportCategoryCredits, types.ReportCategoryUsage}, e.Category)
		assert.Contains(t, []types.ReportKind{types.ReportKindFlow, types.ReportKindRatio, types.ReportKindSnapshot}, e.Kind)
		assert.Contains(t, []types.ReportValueType{types.ReportValueTypeMoney, types.ReportValueTypeCount, types.ReportValueTypeDays}, e.ValueType)
		if e.Kind == types.ReportKindSnapshot {
			assert.False(t, e.SupportsCompare)
			assert.Empty(t, e.Grains)
		}
	}
}

func TestReportResult_OverflowIsValidationError(t *testing.T) {
	q, err := buildBillingQuery(billingRV(types.ShapeScalar), "reports_db", "t", "e", 2)
	require.NoError(t, err)
	_, err = reportResult(q, [][]string{{"usd", "1"}, {"inr", "2"}, {"eur", "3"}}, 2)
	require.Error(t, err)
	assert.True(t, ierr.IsValidation(err))
}

func TestReportResult_TopNSkipsOverflow(t *testing.T) {
	rv := billingRV(types.ShapeBreakdown, "customer_id")
	rv.Limit = 2
	q, err := buildBillingQuery(rv, "reports_db", "t", "e", 2)
	require.NoError(t, err)
	res, err := reportResult(q, [][]string{{"c1", "usd", "50"}, {"c2", "usd", "20"}, {"c3", "usd", "5"}}, 2)
	require.NoError(t, err)
	assert.Len(t, res.Rows, 3)
	assert.Equal(t, q.Columns, res.Columns)
}

func TestRunReport_DisabledIs403(t *testing.T) {
	_, err := (&ReportsRepository{}).RunReport(context.Background(), billingRV(types.ShapeScalar), "t", "e")
	require.Error(t, err)
	assert.True(t, ierr.IsPermissionDenied(err))
}