e9f836db87
Tests · Go / test (push) Successful in 9s
Tests · Integration / integration (push) Successful in 10s
Tests · UI / test (push) Successful in 20s
Tests · Go / test (pull_request) Successful in 8s
Tests · Integration / integration (pull_request) Successful in 11s
Tests · UI / test (pull_request) Successful in 19s
Service-agnostic refinement of the owner's idea: the sign-in service returns a set of supported game languages with the user identity, and the lobby gates the New Game variant choice by it (en -> English; ru -> Russian + Эрудит). - Connector hosts two bots in one container (one per service language, each its own token + game channel; the same telegram_id spans both). ValidateInitData tries each token and returns the validating bot's service_language + supported_languages. Per-language config (TELEGRAM_BOT_TOKEN_EN/_RU, channels). - supported_languages rides the Session (fbs, session-scoped, not persisted); the UI offers only the matching variants on New Game — gating only the START of a new game (auto-match + friend invite), not accept/open/play; backend does not enforce. - service_language persisted (accounts.service_language, migration 00010, written every login, last-login-wins) and routes the user-facing Notify push back through the right bot (push-target coalesces with preferred_language). - Admin SendToUser/SendToGameChannel gain an operator-chosen language selector in the console (unrelated to ValidateInitData). - Non-Telegram logins carry the gateway default set (GATEWAY_DEFAULT_SUPPORTED_LANGUAGES, all variants). Wire (committed regen): ValidateInitDataResponse +service_language +supported_languages; Session +supported_languages; SendToUser/SendToGameChannel +language. Docs (ARCHITECTURE/FUNCTIONAL/_ru/READMEs) + PLAN updated; stage marked done.
72 lines
2.4 KiB
Go
72 lines
2.4 KiB
Go
package config
|
|
|
|
import (
|
|
"testing"
|
|
|
|
pkgtel "scrabble/pkg/telemetry"
|
|
)
|
|
|
|
// setRequired sets the required connector variables (one bot + the Mini App URL)
|
|
// so Load reaches the telemetry checks.
|
|
func setRequired(t *testing.T) {
|
|
t.Helper()
|
|
t.Setenv("TELEGRAM_BOT_TOKEN_EN", "test-token")
|
|
t.Setenv("TELEGRAM_MINIAPP_URL", "https://example.org/app")
|
|
}
|
|
|
|
// TestLoadBots verifies the per-language bot parsing: a present token enables a
|
|
// language, its channel id is optional, and the result is keyed by language.
|
|
func TestLoadBots(t *testing.T) {
|
|
t.Setenv("TELEGRAM_MINIAPP_URL", "https://example.org/app")
|
|
t.Setenv("TELEGRAM_BOT_TOKEN_EN", "en-token")
|
|
t.Setenv("TELEGRAM_GAME_CHANNEL_ID_EN", "-100111")
|
|
t.Setenv("TELEGRAM_BOT_TOKEN_RU", "ru-token")
|
|
c, err := Load()
|
|
if err != nil {
|
|
t.Fatalf("Load: %v", err)
|
|
}
|
|
if len(c.Bots) != 2 {
|
|
t.Fatalf("Bots = %d, want 2", len(c.Bots))
|
|
}
|
|
if c.Bots["en"].Token != "en-token" || c.Bots["en"].GameChannelID != -100111 {
|
|
t.Errorf("en bot = %+v", c.Bots["en"])
|
|
}
|
|
if c.Bots["ru"].Token != "ru-token" || c.Bots["ru"].GameChannelID != 0 {
|
|
t.Errorf("ru bot = %+v, want token ru-token / channel 0", c.Bots["ru"])
|
|
}
|
|
}
|
|
|
|
// TestLoadRequiresBot verifies Load fails when no bot token is configured.
|
|
func TestLoadRequiresBot(t *testing.T) {
|
|
t.Setenv("TELEGRAM_MINIAPP_URL", "https://example.org/app")
|
|
if _, err := Load(); err == nil {
|
|
t.Fatal("Load: expected an error when no bot token is set, got nil")
|
|
}
|
|
}
|
|
|
|
// TestLoadTelemetryDefaults verifies the connector telemetry defaults: the
|
|
// "scrabble-telegram" service name and both exporters off.
|
|
func TestLoadTelemetryDefaults(t *testing.T) {
|
|
setRequired(t)
|
|
c, err := Load()
|
|
if err != nil {
|
|
t.Fatalf("Load: %v", err)
|
|
}
|
|
if c.Telemetry.ServiceName != "scrabble-telegram" {
|
|
t.Errorf("Telemetry.ServiceName = %q, want scrabble-telegram", c.Telemetry.ServiceName)
|
|
}
|
|
if c.Telemetry.TracesExporter != pkgtel.ExporterNone || c.Telemetry.MetricsExporter != pkgtel.ExporterNone {
|
|
t.Errorf("exporters = %q/%q, want none/none", c.Telemetry.TracesExporter, c.Telemetry.MetricsExporter)
|
|
}
|
|
}
|
|
|
|
// TestLoadRejectsUnsupportedExporter verifies an exporter outside the supported
|
|
// set fails validation.
|
|
func TestLoadRejectsUnsupportedExporter(t *testing.T) {
|
|
setRequired(t)
|
|
t.Setenv("TELEGRAM_OTEL_TRACES_EXPORTER", "jaeger")
|
|
if _, err := Load(); err == nil {
|
|
t.Fatal("Load: expected an error for an unsupported exporter, got nil")
|
|
}
|
|
}
|