From 7f1a24fcc88ccc363dc12e3344bcc82edc2115fa Mon Sep 17 00:00:00 2001 From: Sergey Date: Sun, 26 Jan 2025 18:15:11 +0300 Subject: [PATCH] chore: added tests --- assets/responses/jails-count.html | 3 + pkg/database/database.go | 2 +- pkg/reporters/telegram/jails_count.go | 2 +- pkg/reporters/telegram/jails_count_test.go | 315 +++++++++++++++++++++ templates/telegram/JailsCount.html | 4 +- 5 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 assets/responses/jails-count.html create mode 100644 pkg/reporters/telegram/jails_count_test.go diff --git a/assets/responses/jails-count.html b/assets/responses/jails-count.html new file mode 100644 index 0000000..ecf74b7 --- /dev/null +++ b/assets/responses/jails-count.html @@ -0,0 +1,3 @@ +Validators jails count observed by the app: +- validator2: 2 +- validator1: 1 \ No newline at end of file diff --git a/pkg/database/database.go b/pkg/database/database.go index 2214a8a..25c7a43 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -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, ) diff --git a/pkg/reporters/telegram/jails_count.go b/pkg/reporters/telegram/jails_count.go index 4bd1ddb..64e7859 100644 --- a/pkg/reporters/telegram/jails_count.go +++ b/pkg/reporters/telegram/jails_count.go @@ -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() diff --git a/pkg/reporters/telegram/jails_count_test.go b/pkg/reporters/telegram/jails_count_test.go new file mode 100644 index 0000000..65f1117 --- /dev/null +++ b/pkg/reporters/telegram/jails_count_test.go @@ -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) +} diff --git a/templates/telegram/JailsCount.html b/templates/telegram/JailsCount.html index 7969b00..eec7c51 100644 --- a/templates/telegram/JailsCount.html +++ b/templates/telegram/JailsCount.html @@ -1,7 +1,7 @@ {{- if . }} -Validators jails count since the app was started: +Validators jails count observed by the app: {{- range . }} -{{ SerializeLink .ValidatorLink }}: {{ .JailsCount }} +- {{ SerializeLink .ValidatorLink }}: {{ .JailsCount }} {{- end }} {{- else }} Nobody has been jailed since the app launch.