X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/6b21fcf78372995c6d8130c63f2f8aa2609bf7fe..b2fc2d6a737dd5bab25e57ba822dd07258de93e6:/telegram_fake_helper_test.go?ds=sidebyside diff --git a/telegram_fake_helper_test.go b/telegram_fake_helper_test.go index a70a199..6a89054 100644 --- a/telegram_fake_helper_test.go +++ b/telegram_fake_helper_test.go @@ -45,11 +45,13 @@ type TelegramFake struct { stall func(call TelegramFakeCall) bool added chan struct{} stopped chan struct{} + images map[string][]byte } // Add makes update available to getUpdates. func (f *TelegramFake) Add(update TelegramUpdate) { f.mutex.Lock() + f.updates = append(f.updates, update) f.mutex.Unlock() @@ -71,6 +73,7 @@ func (f *TelegramFake) Calls() []TelegramFakeCall { // sendRichMessage calls that succeeded, in order. func (f *TelegramFake) Sent() []string { var texts []string + for _, call := range f.Calls() { switch { case !call.ok: @@ -84,17 +87,49 @@ func (f *TelegramFake) Sent() []string { return texts } +func (f *TelegramFake) Image(id string, data []byte) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if f.images == nil { + f.images = make(map[string][]byte) + } + + f.images[id] = data +} + func (f *TelegramFake) serve(w http.ResponseWriter, r *http.Request) { + id, file := strings.CutPrefix(r.URL.Path, "/file/bot"+telegramTestToken+"/") + if file { + f.mutex.Lock() + + data, exists := f.images[id] + f.mutex.Unlock() + + if !exists { + http.NotFound(w, r) + + return + } + + _, _ = w.Write(data) + + return + } + method, found := strings.CutPrefix(r.URL.Path, "/bot"+telegramTestToken+"/") if !found { http.Error(w, `{"ok":false,"error_code":404,"description":"Not Found"}`, http.StatusNotFound) + return } var params map[string]any + err := json.NewDecoder(r.Body).Decode(¶ms) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) + return } @@ -104,6 +139,7 @@ func (f *TelegramFake) serve(w http.ResponseWriter, r *http.Request) { } f.mutex.Lock() + status, description := 0, "" if f.fail != nil { status, description = f.fail(call) @@ -114,6 +150,7 @@ func (f *TelegramFake) serve(w http.ResponseWriter, r *http.Request) { if stall { f.record(call) + select { case <-r.Context().Done(): case <-f.stopped: @@ -125,6 +162,7 @@ func (f *TelegramFake) serve(w http.ResponseWriter, r *http.Request) { if status != 0 { f.record(call) w.WriteHeader(status) + wait := 0 if status == http.StatusTooManyRequests { wait = 1 @@ -137,6 +175,16 @@ func (f *TelegramFake) serve(w http.ResponseWriter, r *http.Request) { call.ok = true f.record(call) + + if method == "getFile" { + _ = json.NewEncoder(w).Encode(map[string]any{ + "ok": true, + "result": map[string]any{"file_path": params["file_id"]}, + }) + + return + } + if method != "getUpdates" { _, _ = io.WriteString(w, `{"ok":true,"result":true}`) return @@ -175,6 +223,7 @@ func (f *TelegramFake) from(offset int64) []TelegramUpdate { defer f.mutex.Unlock() var updates []TelegramUpdate + kept := f.updates[:0] for _, update := range f.updates { if update.UpdateID >= offset {