Skip to content

Commit

Permalink
chore: add queriers test
Browse files Browse the repository at this point in the history
  • Loading branch information
freak12techno committed Jul 8, 2024
1 parent 95238ff commit 99e507f
Show file tree
Hide file tree
Showing 7 changed files with 185 additions and 48 deletions.
1 change: 1 addition & 0 deletions assets/coingecko.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"cosmos":{"usd":5.84}}
12 changes: 0 additions & 12 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,6 @@ func (c *Config) GetCoingeckoCurrencies() []string {
return currencies
}

func (c *Config) FindChainAndDenomByCoingeckoCurrency(currency string) (string, string, bool) {
for _, chain := range c.Chains {
for _, denom := range chain.Denoms {
if denom.CoingeckoCurrency == currency {
return chain.Name, denom.GetName(), true
}
}
}

return "", "", false
}

func GetConfig(path string, filesystem fs.FS) (*Config, error) {
configBytes, err := filesystem.ReadFile(path)
if err != nil {
Expand Down
25 changes: 0 additions & 25 deletions pkg/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,31 +55,6 @@ func TestGetCoingeckoCurrencies(t *testing.T) {
assert.Equal(t, "cosmos", currencies[0])
}

func TestChainAndCurrencyByCoingeckoName(t *testing.T) {
t.Parallel()

chain := &Config{
Chains: []Chain{
{
Name: "chain",
Denoms: []DenomInfo{
{Denom: "uatom", DisplayDenom: "atom", CoingeckoCurrency: "cosmos"},
},
},
},
}

info1, chain1, found1 := chain.FindChainAndDenomByCoingeckoCurrency("cosmos")
require.NotNil(t, info1)
assert.Equal(t, "atom", chain1)
assert.True(t, found1)

info2, chain2, found2 := chain.FindChainAndDenomByCoingeckoCurrency("random")
require.Empty(t, info2)
assert.Empty(t, chain2)
assert.False(t, found2)
}

func TestLoadConfigFailedToLoad(t *testing.T) {
t.Parallel()

Expand Down
23 changes: 12 additions & 11 deletions pkg/queriers/price.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,18 @@ func (q *PriceQuerier) GetMetrics(ctx context.Context) ([]prometheus.Collector,
currenciesList := q.Config.GetCoingeckoCurrencies()
currenciesRates, queryInfo := q.Coingecko.FetchPrices(currenciesList, childCtx)

for currency, price := range currenciesRates {
chainName, denom, found := q.Config.FindChainAndDenomByCoingeckoCurrency(currency)
if !found {
q.Logger.Warn().
Str("currency", currency).
Msg("Could not find chain by Coingecko currency")
} else {
priceGauge.With(prometheus.Labels{
"chain": chainName,
"denom": denom,
}).Set(price)
for _, chain := range q.Config.Chains {
for _, denom := range chain.Denoms {
if denom.CoingeckoCurrency == "" {
continue
}

if price, ok := currenciesRates[denom.CoingeckoCurrency]; ok {
priceGauge.With(prometheus.Labels{
"chain": chain.Name,
"denom": denom.GetName(),
}).Set(price)
}
}
}

Expand Down
87 changes: 87 additions & 0 deletions pkg/queriers/price_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package queriers

import (
"context"
"errors"
"main/assets"
coingeckoPkg "main/pkg/coingecko"
configPkg "main/pkg/config"
loggerPkg "main/pkg/logger"
"main/pkg/tracing"
"testing"

"github.com/jarcoal/httpmock"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"
"github.com/stretchr/testify/assert"
)

//nolint:paralleltest // disabled due to httpmock usage
func TestPriceQuerierFail(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()

httpmock.RegisterResponder(
"GET",
"https://api.coingecko.com/api/v3/simple/price?ids=cosmos&vs_currencies=usd",
httpmock.NewErrorResponder(errors.New("custom error")),
)

config := &configPkg.Config{Chains: []configPkg.Chain{{
Name: "chain",
Denoms: []configPkg.DenomInfo{{Denom: "atom", CoingeckoCurrency: "cosmos"}},
}}}

tracer := tracing.InitNoopTracer()
logger := loggerPkg.GetDefaultLogger()
coingecko := coingeckoPkg.NewCoingecko(config, *logger, tracer)
querier := NewPriceQuerier(config, coingecko, tracer)

metrics, queries := querier.GetMetrics(context.Background())
assert.Len(t, queries, 1)
assert.False(t, queries[0].Success)

assert.Len(t, metrics, 1)
assert.Zero(t, testutil.CollectAndCount(metrics[0]))
}

//nolint:paralleltest // disabled due to httpmock usage
func TestPriceQuerierOk(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()

httpmock.RegisterResponder(
"GET",
"https://api.coingecko.com/api/v3/simple/price?ids=cosmos,random&vs_currencies=usd",
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("coingecko.json")),
)

config := &configPkg.Config{Chains: []configPkg.Chain{{
Name: "chain",
Denoms: []configPkg.DenomInfo{
{Denom: "atom", CoingeckoCurrency: "cosmos"},
{Denom: "random", CoingeckoCurrency: "random"},
{Denom: "unknown"},
},
}}}

tracer := tracing.InitNoopTracer()
logger := loggerPkg.GetDefaultLogger()
coingecko := coingeckoPkg.NewCoingecko(config, *logger, tracer)
querier := NewPriceQuerier(config, coingecko, tracer)

metrics, queries := querier.GetMetrics(context.Background())
assert.Len(t, queries, 1)
assert.True(t, queries[0].Success)

assert.Len(t, metrics, 1)

pricesMetric, ok := metrics[0].(*prometheus.GaugeVec)
assert.True(t, ok)

assert.InDelta(t, 1, testutil.CollectAndCount(pricesMetric), 0.001)
assert.InDelta(t, 5.84, testutil.ToFloat64(pricesMetric.With(prometheus.Labels{
"chain": "chain",
"denom": "atom",
})), 0.01)
}
60 changes: 60 additions & 0 deletions pkg/queriers/queries_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package queriers

import (
configPkg "main/pkg/config"
"main/pkg/types"
"testing"
"time"

"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"
"github.com/stretchr/testify/assert"
)

func TestQueriesQuerier(t *testing.T) {
t.Parallel()

config := &configPkg.Config{Chains: []configPkg.Chain{{Name: "chain"}, {Name: "chain2"}}}

queries := []types.QueryInfo{
{Chain: "chain", Success: true, URL: "url1", Duration: 5 * time.Second},
{Chain: "chain", Success: false, URL: "url2", Duration: 3 * time.Second},
}

querier := NewQueriesQuerier(config, queries)
metrics, queryInfos := querier.GetMetrics()
assert.Empty(t, queryInfos)
assert.Len(t, metrics, 3)

successGauge, ok := metrics[0].(*prometheus.GaugeVec)
assert.True(t, ok)
assert.Equal(t, 2, testutil.CollectAndCount(successGauge))
assert.InEpsilon(t, float64(1), testutil.ToFloat64(successGauge.With(prometheus.Labels{
"chain": "chain",
})), 0.01)
assert.Zero(t, testutil.ToFloat64(successGauge.With(prometheus.Labels{
"chain": "chain2",
})))

errorGauge, ok := metrics[1].(*prometheus.GaugeVec)
assert.True(t, ok)
assert.Equal(t, 2, testutil.CollectAndCount(errorGauge))
assert.InEpsilon(t, float64(1), testutil.ToFloat64(errorGauge.With(prometheus.Labels{
"chain": "chain",
})), 0.01)
assert.Zero(t, testutil.ToFloat64(errorGauge.With(prometheus.Labels{
"chain": "chain2",
})))

timingsGauge, ok := metrics[2].(*prometheus.GaugeVec)
assert.True(t, ok)
assert.Equal(t, 2, testutil.CollectAndCount(timingsGauge))
assert.InEpsilon(t, float64(5), testutil.ToFloat64(timingsGauge.With(prometheus.Labels{
"chain": "chain",
"url": "url1",
})), 0.01)
assert.InEpsilon(t, float64(3), testutil.ToFloat64(timingsGauge.With(prometheus.Labels{
"chain": "chain",
"url": "url2",
})), 0.01)
}
25 changes: 25 additions & 0 deletions pkg/queriers/uptime_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package queriers

import (
"context"
"main/pkg/tracing"
"testing"

"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"

"github.com/stretchr/testify/assert"
)

func TestUptimeQuerier(t *testing.T) {
t.Parallel()

querier := NewUptimeQuerier(tracing.InitNoopTracer())
metrics, queryInfos := querier.GetMetrics(context.Background())
assert.Empty(t, queryInfos)
assert.NotEmpty(t, metrics)

gauge, ok := metrics[0].(*prometheus.GaugeVec)
assert.True(t, ok)
assert.NotEmpty(t, testutil.ToFloat64(gauge))
}

0 comments on commit 99e507f

Please sign in to comment.