package telegram import ( "encoding/json" "io" "log/slog" "net/http" "net/http/httptest" "strings" "testing" "git.yeij.top/AskaEth/Cyrene_v2/internal/logger" ) // discardLogger returns a silent, source-tagged logger for tests. func discardLogger() *slog.Logger { return logger.WithSource(logger.New(logger.Options{Out: io.Discard}), "plugins/channels/telegram") } // newTestAdapter wires a Telegram adapter to an httptest server whose handler // answers the Bot API methods. The server is closed on test cleanup. func newTestAdapter(t *testing.T, h http.Handler) (*Adapter, *httptest.Server) { t.Helper() srv := httptest.NewServer(h) t.Cleanup(srv.Close) a := New( Config{BotToken: "123456:TESTTOKEN"}, WithBaseURL(srv.URL), WithHTTPClient(srv.Client()), WithLogger(discardLogger()), ) return a, srv } // methodOf extracts the Bot API method name from the request path, which takes // the form /bot/. func methodOf(r *http.Request) string { parts := strings.Split(r.URL.Path, "/") return parts[len(parts)-1] } // decodeBody unmarshals an incoming JSON request body into a map for assertions. func decodeBody(r *http.Request) map[string]any { var m map[string]any if err := json.NewDecoder(r.Body).Decode(&m); err != nil { return nil } return m } // okResponse writes a generic Bot API success envelope with the given result. func okResponse(w http.ResponseWriter, result any) { body := map[string]any{"ok": true, "result": result} _ = json.NewEncoder(w).Encode(body) } // failResponse writes a Bot API error envelope. func failResponse(w http.ResponseWriter, desc string, code int) { body := map[string]any{"ok": false, "description": desc, "error_code": code} _ = json.NewEncoder(w).Encode(body) }