From de22374751a742bafabd893391c94956d5104bb5 Mon Sep 17 00:00:00 2001 From: Vardan Torosyan Date: Wed, 16 Dec 2020 16:12:02 +0100 Subject: [PATCH] Usage Stats: Introduce an interface for usage stats service (#29882) Adding an interface type for usage stats service allows us to not depend on the implementation outside of the package, for example when testing we can easily mock the service --- pkg/infra/usagestats/service.go | 6 ++++++ pkg/infra/usagestats/usage_stats_test.go | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/pkg/infra/usagestats/service.go b/pkg/infra/usagestats/service.go index 9dc3be51fb2..6c82e1e714f 100644 --- a/pkg/infra/usagestats/service.go +++ b/pkg/infra/usagestats/service.go @@ -21,6 +21,12 @@ func init() { registry.RegisterService(&UsageStatsService{}) } +type UsageStats interface { + GetUsageReport() (UsageReport, error) + + RegisterMetric(name string, fn MetricFunc) +} + type MetricFunc func() (interface{}, error) type UsageStatsService struct { diff --git a/pkg/infra/usagestats/usage_stats_test.go b/pkg/infra/usagestats/usage_stats_test.go index d779ad4b159..356fd6b108e 100644 --- a/pkg/infra/usagestats/usage_stats_test.go +++ b/pkg/infra/usagestats/usage_stats_test.go @@ -25,6 +25,17 @@ import ( "github.com/stretchr/testify/assert" ) +// This is to ensure that the interface contract is held by the implementation +func Test_InterfaceContractValidity(t *testing.T) { + newUsageStats := func() UsageStats { + return &UsageStatsService{} + } + v, ok := newUsageStats().(*UsageStatsService) + + assert.NotNil(t, v) + assert.True(t, ok) +} + func TestMetrics(t *testing.T) { t.Run("When sending usage stats", func(t *testing.T) { uss := &UsageStatsService{