Files
mautrix-telegram/pkg/gotd/telegram/client_external_test.go
T
2025-06-27 20:03:37 -07:00

121 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package telegram_test
import (
"context"
"os"
"strconv"
"strings"
"testing"
"time"
"github.com/go-faster/errors"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"go.uber.org/zap/zaptest"
"go.mau.fi/mautrix-telegram/pkg/gotd/session"
"go.mau.fi/mautrix-telegram/pkg/gotd/tdsync"
"go.mau.fi/mautrix-telegram/pkg/gotd/telegram"
"go.mau.fi/mautrix-telegram/pkg/gotd/telegram/dcs"
"go.mau.fi/mautrix-telegram/pkg/gotd/telegram/internal/e2etest"
"go.mau.fi/mautrix-telegram/pkg/gotd/testutil"
"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
"go.mau.fi/mautrix-telegram/pkg/gotd/transport"
)
func tryConnect(ctx context.Context, opts telegram.Options) error {
client := telegram.NewClient(telegram.TestAppID, telegram.TestAppHash, opts)
return client.Run(ctx, func(ctx context.Context) error {
_, err := client.API().HelpGetNearestDC(ctx)
return err
})
}
func testTransportExternal(resolver dcs.Resolver, storage session.Storage) func(t *testing.T) {
return func(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
log := zaptest.NewLogger(t)
defer func() { _ = log.Sync() }()
require.NoError(t, tryConnect(ctx, telegram.Options{
Logger: log.Named("client"),
SessionStorage: storage,
Resolver: resolver,
}))
}
}
func TestExternalE2EConnect(t *testing.T) {
testutil.SkipExternal(t)
// To re-use session.
storage := &session.StorageMemory{}
tcp := func(p dcs.Protocol) func(t *testing.T) {
return testTransportExternal(dcs.Plain(dcs.PlainOptions{Protocol: p}), storage)
}
t.Run("Abridged", tcp(transport.Abridged))
t.Run("Intermediate", tcp(transport.Intermediate))
t.Run("PaddedIntermediate", tcp(transport.PaddedIntermediate))
t.Run("Full", tcp(transport.Full))
wsOpts := dcs.WebsocketOptions{}
t.Run("Websocket", testTransportExternal(dcs.Websocket(wsOpts), storage))
}
const dialog = `— Да?
— Алё!
— Да да?
— Ну как там с деньгами?
А?
— Как с деньгами-то там?
— Чё с деньгами?
— Чё?
— Куда ты звонишь?
— Тебе звоню.
— Кому?
— Ну тебе.`
func TestExternalE2EUsersDialog(t *testing.T) {
testutil.SkipExternal(t)
if v, _ := strconv.ParseBool(os.Getenv("GOTD_E2E_DIALOGS_BROKEN")); v {
// TODO(ernado): enable when fixed
t.Skip("Dialogs are broken.")
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
log := zaptest.NewLogger(t).WithOptions(zap.IncreaseLevel(zapcore.InfoLevel))
cfg := e2etest.TestOptions{
Logger: log,
}
suite := e2etest.NewSuite(t, cfg)
auth := make(chan *tg.User, 1)
g := tdsync.NewLogGroup(ctx, log.Named("group"))
g.Go("echobot", func(ctx context.Context) error {
if err := e2etest.NewEchoBot(suite, auth).Run(ctx); err != nil {
return errors.Wrap(err, "echo bot")
}
return nil
})
user, ok := <-auth
if ok {
g.Go("terentyev", func(ctx context.Context) error {
defer g.Cancel()
if err := e2etest.NewUser(suite, strings.Split(dialog, "\n"), user.Username).Run(ctx); err != nil {
return errors.Wrap(err, "user")
}
return nil
})
}
require.NoError(t, g.Wait())
}