Skip to content

Commit 16eea10

Browse files
committed
chore: add /explorer_add test
1 parent 8083644 commit 16eea10

File tree

2 files changed

+381
-0
lines changed

2 files changed

+381
-0
lines changed

assets/responses/explorer-add.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Successfully inserted explorer!
2+
<strong>Chain:</strong> <code>nomic</code>
3+
<strong>Name:</strong> <code>Ping</code>
4+
<strong>Proposal link pattern:</strong> <code>https://explorer.quokkastake.io/nomic/gov/%s</code>
5+
<strong>Wallet link pattern:</strong> <code>https://explorer.quokkastake.io/nomic/account/%s</code>
6+
<strong>Validator link pattern:</strong> <code>https://explorer.quokkastake.io/nomic/staking/%s</code>
7+
<strong>Main link:</strong> <code>https://explorer.quokkastake.io/nomic</code>
Lines changed: 374 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,374 @@
1+
package telegram
2+
3+
import (
4+
"errors"
5+
"main/assets"
6+
datafetcher "main/pkg/data_fetcher"
7+
databasePkg "main/pkg/database"
8+
loggerPkg "main/pkg/logger"
9+
"main/pkg/metrics"
10+
"main/pkg/types"
11+
"testing"
12+
13+
"github.com/DATA-DOG/go-sqlmock"
14+
"github.com/jarcoal/httpmock"
15+
"github.com/stretchr/testify/require"
16+
tele "gopkg.in/telebot.v3"
17+
)
18+
19+
//nolint:paralleltest // disabled
20+
func TestTelegramExplorerAddNotEnoughArgs(t *testing.T) {
21+
httpmock.Activate()
22+
defer httpmock.DeactivateAndReset()
23+
24+
httpmock.RegisterResponder(
25+
"POST",
26+
"https://api.telegram.org/botxxx:yyy/getMe",
27+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))
28+
29+
httpmock.RegisterMatcherResponder(
30+
"POST",
31+
"https://api.telegram.org/botxxx:yyy/sendMessage",
32+
types.TelegramResponseHasText("Usage: /explorer_add &lt;params&gt;"),
33+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")))
34+
35+
logger := loggerPkg.GetNopLogger()
36+
metricsManager := metrics.NewManager(logger, types.MetricsConfig{})
37+
database := databasePkg.NewDatabase(logger, types.DatabaseConfig{})
38+
dataFetcher := datafetcher.NewDataFetcher(logger, database, nil, metricsManager, nil)
39+
40+
db, mock, err := sqlmock.New()
41+
require.NoError(t, err)
42+
43+
mock.ExpectExec("INSERT INTO queries").
44+
WillReturnResult(sqlmock.NewResult(1, 1))
45+
46+
mock.ExpectQuery("SELECT chain FROM chain_binds").
47+
WillReturnRows(sqlmock.NewRows([]string{"chain"}).AddRow("chain1").AddRow("chain2"))
48+
49+
database.SetClient(db)
50+
51+
interacter := NewInteracter(
52+
types.TelegramConfig{Token: "xxx:yyy", Admins: []int64{1, 2}},
53+
"v1.2.3",
54+
logger,
55+
dataFetcher,
56+
database,
57+
metricsManager,
58+
)
59+
interacter.Init()
60+
61+
ctx := interacter.TelegramBot.NewContext(tele.Update{
62+
ID: 1,
63+
Message: &tele.Message{
64+
Sender: &tele.User{Username: "testuser", ID: 1},
65+
Text: "/explorer_add",
66+
Chat: &tele.Chat{ID: 2},
67+
},
68+
})
69+
70+
err = interacter.TelegramBot.Trigger("/explorer_add", ctx)
71+
require.NoError(t, err)
72+
73+
err = mock.ExpectationsWereMet()
74+
require.NoError(t, err)
75+
}
76+
77+
//nolint:paralleltest // disabled
78+
func TestTelegramExplorerAddCannotParseInput(t *testing.T) {
79+
httpmock.Activate()
80+
defer httpmock.DeactivateAndReset()
81+
82+
httpmock.RegisterResponder(
83+
"POST",
84+
"https://api.telegram.org/botxxx:yyy/getMe",
85+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))
86+
87+
httpmock.RegisterMatcherResponder(
88+
"POST",
89+
"https://api.telegram.org/botxxx:yyy/sendMessage",
90+
types.TelegramResponseHasText("Invalid input syntax!"),
91+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")))
92+
93+
logger := loggerPkg.GetNopLogger()
94+
metricsManager := metrics.NewManager(logger, types.MetricsConfig{})
95+
database := databasePkg.NewDatabase(logger, types.DatabaseConfig{})
96+
dataFetcher := datafetcher.NewDataFetcher(logger, database, nil, metricsManager, nil)
97+
98+
db, mock, err := sqlmock.New()
99+
require.NoError(t, err)
100+
101+
mock.ExpectExec("INSERT INTO queries").
102+
WillReturnResult(sqlmock.NewResult(1, 1))
103+
104+
mock.ExpectQuery("SELECT chain FROM chain_binds").
105+
WillReturnRows(sqlmock.NewRows([]string{"chain"}).AddRow("chain1").AddRow("chain2"))
106+
107+
database.SetClient(db)
108+
109+
interacter := NewInteracter(
110+
types.TelegramConfig{Token: "xxx:yyy", Admins: []int64{1, 2}},
111+
"v1.2.3",
112+
logger,
113+
dataFetcher,
114+
database,
115+
metricsManager,
116+
)
117+
interacter.Init()
118+
119+
ctx := interacter.TelegramBot.NewContext(tele.Update{
120+
ID: 1,
121+
Message: &tele.Message{
122+
Sender: &tele.User{Username: "testuser", ID: 1},
123+
Text: "/explorer_add 123",
124+
Chat: &tele.Chat{ID: 2},
125+
},
126+
})
127+
128+
err = interacter.TelegramBot.Trigger("/explorer_add", ctx)
129+
require.NoError(t, err)
130+
131+
err = mock.ExpectationsWereMet()
132+
require.NoError(t, err)
133+
}
134+
135+
//nolint:paralleltest // disabled
136+
func TestTelegramExplorerAddInvalidInput(t *testing.T) {
137+
httpmock.Activate()
138+
defer httpmock.DeactivateAndReset()
139+
140+
httpmock.RegisterResponder(
141+
"POST",
142+
"https://api.telegram.org/botxxx:yyy/getMe",
143+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))
144+
145+
httpmock.RegisterMatcherResponder(
146+
"POST",
147+
"https://api.telegram.org/botxxx:yyy/sendMessage",
148+
types.TelegramResponseHasText("Invalid data provided: chain name cannot be empty"),
149+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")))
150+
151+
logger := loggerPkg.GetNopLogger()
152+
metricsManager := metrics.NewManager(logger, types.MetricsConfig{})
153+
database := databasePkg.NewDatabase(logger, types.DatabaseConfig{})
154+
dataFetcher := datafetcher.NewDataFetcher(logger, database, nil, metricsManager, nil)
155+
156+
db, mock, err := sqlmock.New()
157+
require.NoError(t, err)
158+
159+
mock.ExpectExec("INSERT INTO queries").
160+
WillReturnResult(sqlmock.NewResult(1, 1))
161+
162+
mock.ExpectQuery("SELECT chain FROM chain_binds").
163+
WillReturnRows(sqlmock.NewRows([]string{"chain"}).AddRow("chain1").AddRow("chain2"))
164+
165+
database.SetClient(db)
166+
167+
interacter := NewInteracter(
168+
types.TelegramConfig{Token: "xxx:yyy", Admins: []int64{1, 2}},
169+
"v1.2.3",
170+
logger,
171+
dataFetcher,
172+
database,
173+
metricsManager,
174+
)
175+
interacter.Init()
176+
177+
ctx := interacter.TelegramBot.NewContext(tele.Update{
178+
ID: 1,
179+
Message: &tele.Message{
180+
Sender: &tele.User{Username: "testuser", ID: 1},
181+
Text: "/explorer_add chain=",
182+
Chat: &tele.Chat{ID: 2},
183+
},
184+
})
185+
186+
err = interacter.TelegramBot.Trigger("/explorer_add", ctx)
187+
require.NoError(t, err)
188+
189+
err = mock.ExpectationsWereMet()
190+
require.NoError(t, err)
191+
}
192+
193+
//nolint:paralleltest // disabled
194+
func TestTelegramExplorerAddErrorInserting(t *testing.T) {
195+
httpmock.Activate()
196+
defer httpmock.DeactivateAndReset()
197+
198+
httpmock.RegisterResponder(
199+
"POST",
200+
"https://api.telegram.org/botxxx:yyy/getMe",
201+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))
202+
203+
httpmock.RegisterMatcherResponder(
204+
"POST",
205+
"https://api.telegram.org/botxxx:yyy/sendMessage",
206+
types.TelegramResponseHasText("Internal error!"),
207+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")))
208+
209+
logger := loggerPkg.GetNopLogger()
210+
metricsManager := metrics.NewManager(logger, types.MetricsConfig{})
211+
database := databasePkg.NewDatabase(logger, types.DatabaseConfig{})
212+
dataFetcher := datafetcher.NewDataFetcher(logger, database, nil, metricsManager, nil)
213+
214+
db, mock, err := sqlmock.New()
215+
require.NoError(t, err)
216+
217+
mock.ExpectExec("INSERT INTO queries").
218+
WillReturnResult(sqlmock.NewResult(1, 1))
219+
220+
mock.ExpectQuery("SELECT chain FROM chain_binds").
221+
WillReturnRows(sqlmock.NewRows([]string{"chain"}).AddRow("chain1").AddRow("chain2"))
222+
223+
mock.ExpectExec("INSERT INTO explorers").
224+
WillReturnError(errors.New("custom error"))
225+
226+
database.SetClient(db)
227+
228+
interacter := NewInteracter(
229+
types.TelegramConfig{Token: "xxx:yyy", Admins: []int64{1, 2}},
230+
"v1.2.3",
231+
logger,
232+
dataFetcher,
233+
database,
234+
metricsManager,
235+
)
236+
interacter.Init()
237+
238+
ctx := interacter.TelegramBot.NewContext(tele.Update{
239+
ID: 1,
240+
Message: &tele.Message{
241+
Sender: &tele.User{Username: "testuser", ID: 1},
242+
Text: "/explorer_add chain=nomic name=Ping ping-prefix=nomic ping-host=https://explorer.quokkastake.io",
243+
Chat: &tele.Chat{ID: 2},
244+
},
245+
})
246+
247+
err = interacter.TelegramBot.Trigger("/explorer_add", ctx)
248+
require.NoError(t, err)
249+
250+
err = mock.ExpectationsWereMet()
251+
require.NoError(t, err)
252+
}
253+
254+
//nolint:paralleltest // disabled
255+
func TestTelegramExplorerAddDuplicate(t *testing.T) {
256+
httpmock.Activate()
257+
defer httpmock.DeactivateAndReset()
258+
259+
httpmock.RegisterResponder(
260+
"POST",
261+
"https://api.telegram.org/botxxx:yyy/getMe",
262+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))
263+
264+
httpmock.RegisterMatcherResponder(
265+
"POST",
266+
"https://api.telegram.org/botxxx:yyy/sendMessage",
267+
types.TelegramResponseHasText("This explorer is already inserted!"),
268+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")))
269+
270+
logger := loggerPkg.GetNopLogger()
271+
metricsManager := metrics.NewManager(logger, types.MetricsConfig{})
272+
database := databasePkg.NewDatabase(logger, types.DatabaseConfig{})
273+
dataFetcher := datafetcher.NewDataFetcher(logger, database, nil, metricsManager, nil)
274+
275+
db, mock, err := sqlmock.New()
276+
require.NoError(t, err)
277+
278+
mock.ExpectExec("INSERT INTO queries").
279+
WillReturnResult(sqlmock.NewResult(1, 1))
280+
281+
mock.ExpectQuery("SELECT chain FROM chain_binds").
282+
WillReturnRows(sqlmock.NewRows([]string{"chain"}).AddRow("chain1").AddRow("chain2"))
283+
284+
mock.ExpectExec("INSERT INTO explorers").
285+
WillReturnError(errors.New("duplicate key value violates unique constraint \"explorers_name_chain_key\""))
286+
287+
database.SetClient(db)
288+
289+
interacter := NewInteracter(
290+
types.TelegramConfig{Token: "xxx:yyy", Admins: []int64{1, 2}},
291+
"v1.2.3",
292+
logger,
293+
dataFetcher,
294+
database,
295+
metricsManager,
296+
)
297+
interacter.Init()
298+
299+
ctx := interacter.TelegramBot.NewContext(tele.Update{
300+
ID: 1,
301+
Message: &tele.Message{
302+
Sender: &tele.User{Username: "testuser", ID: 1},
303+
Text: "/explorer_add chain=nomic name=Ping ping-prefix=nomic ping-host=https://explorer.quokkastake.io",
304+
Chat: &tele.Chat{ID: 2},
305+
},
306+
})
307+
308+
err = interacter.TelegramBot.Trigger("/explorer_add", ctx)
309+
require.NoError(t, err)
310+
311+
err = mock.ExpectationsWereMet()
312+
require.NoError(t, err)
313+
}
314+
315+
//nolint:paralleltest // disabled
316+
func TestTelegramExplorerAddOk(t *testing.T) {
317+
httpmock.Activate()
318+
defer httpmock.DeactivateAndReset()
319+
320+
httpmock.RegisterResponder(
321+
"POST",
322+
"https://api.telegram.org/botxxx:yyy/getMe",
323+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-bot-ok.json")))
324+
325+
httpmock.RegisterMatcherResponder(
326+
"POST",
327+
"https://api.telegram.org/botxxx:yyy/sendMessage",
328+
types.TelegramResponseHasBytes(assets.GetBytesOrPanic("responses/explorer-add.html")),
329+
httpmock.NewBytesResponder(200, assets.GetBytesOrPanic("telegram-send-message-ok.json")))
330+
331+
logger := loggerPkg.GetNopLogger()
332+
metricsManager := metrics.NewManager(logger, types.MetricsConfig{})
333+
database := databasePkg.NewDatabase(logger, types.DatabaseConfig{})
334+
dataFetcher := datafetcher.NewDataFetcher(logger, database, nil, metricsManager, nil)
335+
336+
db, mock, err := sqlmock.New()
337+
require.NoError(t, err)
338+
339+
mock.ExpectExec("INSERT INTO queries").
340+
WillReturnResult(sqlmock.NewResult(1, 1))
341+
342+
mock.ExpectQuery("SELECT chain FROM chain_binds").
343+
WillReturnRows(sqlmock.NewRows([]string{"chain"}).AddRow("chain1").AddRow("chain2"))
344+
345+
mock.ExpectExec("INSERT INTO explorers").
346+
WillReturnResult(sqlmock.NewResult(1, 1))
347+
348+
database.SetClient(db)
349+
350+
interacter := NewInteracter(
351+
types.TelegramConfig{Token: "xxx:yyy", Admins: []int64{1, 2}},
352+
"v1.2.3",
353+
logger,
354+
dataFetcher,
355+
database,
356+
metricsManager,
357+
)
358+
interacter.Init()
359+
360+
ctx := interacter.TelegramBot.NewContext(tele.Update{
361+
ID: 1,
362+
Message: &tele.Message{
363+
Sender: &tele.User{Username: "testuser", ID: 1},
364+
Text: "/explorer_add chain=nomic name=Ping ping-prefix=nomic ping-host=https://explorer.quokkastake.io",
365+
Chat: &tele.Chat{ID: 2},
366+
},
367+
})
368+
369+
err = interacter.TelegramBot.Trigger("/explorer_add", ctx)
370+
require.NoError(t, err)
371+
372+
err = mock.ExpectationsWereMet()
373+
require.NoError(t, err)
374+
}

0 commit comments

Comments
 (0)