Skip to content

Commit

Permalink
chore: added tests
Browse files Browse the repository at this point in the history
  • Loading branch information
freak12techno committed Jan 26, 2025
1 parent 37e3539 commit 7f1a24f
Show file tree
Hide file tree
Showing 5 changed files with 322 additions and 4 deletions.
3 changes: 3 additions & 0 deletions assets/responses/jails-count.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<strong>Validators jails count observed by the app:</strong>
- <a href='https://example.com/validator/validator2'>validator2</a>: 2
- <a href='https://example.com/validator/validator1'>validator1</a>: 1
2 changes: 1 addition & 1 deletion pkg/database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ func (d *Database) FindAllJailsCount(chain string) ([]types.ValidatorWithJailsCo
jailsCount := []types.ValidatorWithJailsCount{}

rows, err := d.client.Query(
"SELECT validator, count(*) from events where chain = $1 AND event = $2 GROUP BY chain, validator ORDER BY count DESC",
"SELECT validator, count(*) from events WHERE chain = $1 AND event = $2 GROUP BY chain, validator ORDER BY count DESC",
chain,
constants.EventValidatorJailed,
)
Expand Down
2 changes: 1 addition & 1 deletion pkg/reporters/telegram/jails_count.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func (reporter *Reporter) HandleJailsCount(c tele.Context) error {
Str("sender", c.Sender().Username).
Str("text", c.Text()).
Msg("No older snapshot on telegram events query!")
return reporter.BotReply(c, "Error getting validator events!")
return reporter.BotReply(c, "Error getting validators jails!")
}

jailsCount, err := reporter.Manager.FindAllJailsCount()
Expand Down
315 changes: 315 additions & 0 deletions pkg/reporters/telegram/jails_count_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,315 @@
package telegram

import (
"errors"
"main/assets"
configPkg "main/pkg/config"
databasePkg "main/pkg/database"
loggerPkg "main/pkg/logger"
"main/pkg/metrics"
"main/pkg/snapshot"
statePkg "main/pkg/state"
"main/pkg/types"
"testing"

"github.com/DATA-DOG/go-sqlmock"
"github.com/jarcoal/httpmock"
"github.com/stretchr/testify/require"
tele "gopkg.in/telebot.v3"
)

//nolint:paralleltest // disabled
func TestReporterJailsCountFailedToFetchSnapshot(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()

httpmock.RegisterResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/getMe",
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))

httpmock.RegisterMatcherResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/sendMessage",
types.TelegramResponseHasText("Error getting validators jails!"),
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")),
)

config := &configPkg.ChainConfig{
Name: "chain",
TelegramConfig: configPkg.TelegramConfig{
Token: "xxx:yyy",
Chat: 1,
Admins: []int64{1},
},
}
logger := loggerPkg.GetNopLogger()
metricsManager := metrics.NewManager(*logger, configPkg.MetricsConfig{})
snapshotManager := snapshot.NewManager(*logger, config, metricsManager)
database := databasePkg.NewDatabase(*logger, configPkg.DatabaseConfig{})
dbClient := databasePkg.NewStubDatabaseClient()
database.SetClient(dbClient)

stateManager := statePkg.NewManager(*logger, config, metricsManager, snapshotManager, database)
reporter := NewReporter(config, "1.2.3", *logger, stateManager, metricsManager, snapshotManager)
reporter.Init()

ctx := reporter.TelegramBot.NewContext(tele.Update{
ID: 1,
Message: &tele.Message{
Sender: &tele.User{Username: "testuser"},
Text: "/jailscount",
Chat: &tele.Chat{ID: 2},
},
})

err := reporter.HandleJailsCount(ctx)
require.NoError(t, err)
}

//nolint:paralleltest // disabled
func TestReporterJailsCountFailedToFetchEventsCount(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()

httpmock.RegisterResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/getMe",
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))

httpmock.RegisterMatcherResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/sendMessage",
types.TelegramResponseHasText("Error searching for jails count!"),
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")),
)

config := &configPkg.ChainConfig{
Name: "chain",
TelegramConfig: configPkg.TelegramConfig{
Token: "xxx:yyy",
Chat: 1,
Admins: []int64{1},
},
}
logger := loggerPkg.GetNopLogger()
metricsManager := metrics.NewManager(*logger, configPkg.MetricsConfig{})
snapshotManager := snapshot.NewManager(*logger, config, metricsManager)
database := databasePkg.NewDatabase(*logger, configPkg.DatabaseConfig{})
dbClient := databasePkg.NewStubDatabaseClient()
database.SetClient(dbClient)

snapshotManager.CommitNewSnapshot(100, snapshot.Snapshot{Entries: map[string]*types.Entry{
"validator": {
Validator: &types.Validator{OperatorAddress: "validator", Moniker: "validator"},
},
}})

dbClient.Mock.
ExpectQuery("SELECT validator, count(*) from events").
WillReturnError(errors.New("custom error"))

stateManager := statePkg.NewManager(*logger, config, metricsManager, snapshotManager, database)
reporter := NewReporter(config, "1.2.3", *logger, stateManager, metricsManager, snapshotManager)
reporter.Init()

ctx := reporter.TelegramBot.NewContext(tele.Update{
ID: 1,
Message: &tele.Message{
Sender: &tele.User{Username: "testuser"},
Text: "/jailscount",
Chat: &tele.Chat{ID: 2},
},
})

err := reporter.HandleJailsCount(ctx)
require.NoError(t, err)
}

//nolint:paralleltest // disabled
func TestReporterJailsCountValidatorNotFound(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()

httpmock.RegisterResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/getMe",
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))

httpmock.RegisterMatcherResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/sendMessage",
types.TelegramResponseHasText("Validator is not found!"),
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")),
)

config := &configPkg.ChainConfig{
Name: "chain",
TelegramConfig: configPkg.TelegramConfig{
Token: "xxx:yyy",
Chat: 1,
Admins: []int64{1},
},
}
logger := loggerPkg.GetNopLogger()
metricsManager := metrics.NewManager(*logger, configPkg.MetricsConfig{})
snapshotManager := snapshot.NewManager(*logger, config, metricsManager)
database := databasePkg.NewDatabase(*logger, configPkg.DatabaseConfig{})
dbClient := databasePkg.NewStubDatabaseClient()
database.SetClient(dbClient)

snapshotManager.CommitNewSnapshot(100, snapshot.Snapshot{Entries: map[string]*types.Entry{
"validator1": {
Validator: &types.Validator{OperatorAddress: "validator", Moniker: "validator"},
},
}})

dbClient.Mock.
ExpectQuery("SELECT").
WillReturnRows(sqlmock.
NewRows([]string{"validator", "count"}).
AddRow("validator2", 2),
)

stateManager := statePkg.NewManager(*logger, config, metricsManager, snapshotManager, database)
reporter := NewReporter(config, "1.2.3", *logger, stateManager, metricsManager, snapshotManager)
reporter.Init()

ctx := reporter.TelegramBot.NewContext(tele.Update{
ID: 1,
Message: &tele.Message{
Sender: &tele.User{Username: "testuser"},
Text: "/jailscount",
Chat: &tele.Chat{ID: 2},
},
})

err := reporter.HandleJailsCount(ctx)
require.NoError(t, err)
}

//nolint:paralleltest // disabled
func TestReporterJailsCountEmpty(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()

httpmock.RegisterResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/getMe",
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))

httpmock.RegisterMatcherResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/sendMessage",
types.TelegramResponseHasText("Nobody has been jailed since the app launch."),
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")),
)

config := &configPkg.ChainConfig{
Name: "chain",
TelegramConfig: configPkg.TelegramConfig{
Token: "xxx:yyy",
Chat: 1,
Admins: []int64{1},
},
}
logger := loggerPkg.GetNopLogger()
metricsManager := metrics.NewManager(*logger, configPkg.MetricsConfig{})
snapshotManager := snapshot.NewManager(*logger, config, metricsManager)
database := databasePkg.NewDatabase(*logger, configPkg.DatabaseConfig{})
dbClient := databasePkg.NewStubDatabaseClient()
database.SetClient(dbClient)

snapshotManager.CommitNewSnapshot(100, snapshot.Snapshot{Entries: map[string]*types.Entry{
"validator1": {
Validator: &types.Validator{OperatorAddress: "validator", Moniker: "validator"},
},
}})

dbClient.Mock.
ExpectQuery("SELECT").
WillReturnRows(sqlmock.NewRows([]string{"validator", "count"}))

stateManager := statePkg.NewManager(*logger, config, metricsManager, snapshotManager, database)
reporter := NewReporter(config, "1.2.3", *logger, stateManager, metricsManager, snapshotManager)
reporter.Init()

ctx := reporter.TelegramBot.NewContext(tele.Update{
ID: 1,
Message: &tele.Message{
Sender: &tele.User{Username: "testuser"},
Text: "/jailscount",
Chat: &tele.Chat{ID: 2},
},
})

err := reporter.HandleJailsCount(ctx)
require.NoError(t, err)
}

//nolint:paralleltest // disabled
func TestReporterJailsCountOk(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()

httpmock.RegisterResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/getMe",
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))

httpmock.RegisterMatcherResponder(
"POST",
"https://api.telegram.org/botxxx:yyy/sendMessage",
types.TelegramResponseHasBytes(assets.GetBytesOrPanic("responses/jails-count.html")),
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")),
)

config := &configPkg.ChainConfig{
Name: "chain",
TelegramConfig: configPkg.TelegramConfig{
Token: "xxx:yyy",
Chat: 1,
Admins: []int64{1},
},
ExplorerConfig: configPkg.ExplorerConfig{ValidatorLinkPattern: "https://example.com/validator/%s"},
}
logger := loggerPkg.GetNopLogger()
metricsManager := metrics.NewManager(*logger, configPkg.MetricsConfig{})
snapshotManager := snapshot.NewManager(*logger, config, metricsManager)
database := databasePkg.NewDatabase(*logger, configPkg.DatabaseConfig{})
dbClient := databasePkg.NewStubDatabaseClient()
database.SetClient(dbClient)

snapshotManager.CommitNewSnapshot(100, snapshot.Snapshot{Entries: map[string]*types.Entry{
"validator1": {
Validator: &types.Validator{OperatorAddress: "validator1", Moniker: "validator1"},
},
"validator2": {
Validator: &types.Validator{OperatorAddress: "validator2", Moniker: "validator2"},
},
}})

dbClient.Mock.
ExpectQuery("SELECT").
WillReturnRows(sqlmock.
NewRows([]string{"validator", "count"}).
AddRow("validator2", 2).
AddRow("validator1", 1),
)

stateManager := statePkg.NewManager(*logger, config, metricsManager, snapshotManager, database)
reporter := NewReporter(config, "1.2.3", *logger, stateManager, metricsManager, snapshotManager)
reporter.Init()

ctx := reporter.TelegramBot.NewContext(tele.Update{
ID: 1,
Message: &tele.Message{
Sender: &tele.User{Username: "testuser"},
Text: "/jailscount",
Chat: &tele.Chat{ID: 2},
},
})

err := reporter.HandleJailsCount(ctx)
require.NoError(t, err)
}
4 changes: 2 additions & 2 deletions templates/telegram/JailsCount.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{{- if . }}
<strong>Validators jails count since the app was started:</strong>
<strong>Validators jails count observed by the app:</strong>
{{- range . }}
{{ SerializeLink .ValidatorLink }}: {{ .JailsCount }}
- {{ SerializeLink .ValidatorLink }}: {{ .JailsCount }}
{{- end }}
{{- else }}
Nobody has been jailed since the app launch.
Expand Down

0 comments on commit 7f1a24f

Please sign in to comment.