1
0
mirror of synced 2025-02-16 20:13:15 +03:00

add tests, improve receiving updates from telegram

This commit is contained in:
DmitryZagorulko 2018-05-25 15:56:31 +03:00
parent 91e1bc6a36
commit 84cf4ae56d
3 changed files with 197 additions and 98 deletions

View File

@ -14,7 +14,6 @@ type TransportConfig struct {
Database DatabaseConfig `yaml:"database"` Database DatabaseConfig `yaml:"database"`
SentryDSN string `yaml:"sentry_dsn"` SentryDSN string `yaml:"sentry_dsn"`
HTTPServer HTTPServerConfig `yaml:"http_server"` HTTPServer HTTPServerConfig `yaml:"http_server"`
TelegramConfig TelegramConfig `yaml:"telegram"`
} }
// DatabaseConfig struct // DatabaseConfig struct
@ -33,11 +32,6 @@ type HTTPServerConfig struct {
Listen string `yaml:"listen"` Listen string `yaml:"listen"`
} }
// TelegramConfig struct
type TelegramConfig struct {
Debug bool `yaml:"debug"`
}
// LoadConfig read configuration file // LoadConfig read configuration file
func LoadConfig(path string) *TransportConfig { func LoadConfig(path string) *TransportConfig {
var err error var err error

View File

@ -109,6 +109,7 @@ func connectHandler(w http.ResponseWriter, r *http.Request) {
} }
func addBotHandler(w http.ResponseWriter, r *http.Request) { func addBotHandler(w http.ResponseWriter, r *http.Request) {
setLocale(r.Header.Get("Accept-Language"))
body, err := ioutil.ReadAll(r.Body) body, err := ioutil.ReadAll(r.Body)
if err != nil { if err != nil {
raven.CaptureErrorAndWait(err, nil) raven.CaptureErrorAndWait(err, nil)
@ -312,6 +313,8 @@ func settingsHandler(w http.ResponseWriter, r *http.Request, uid string) {
} }
func saveHandler(w http.ResponseWriter, r *http.Request) { func saveHandler(w http.ResponseWriter, r *http.Request) {
setLocale(r.Header.Get("Accept-Language"))
body, err := ioutil.ReadAll(r.Body) body, err := ioutil.ReadAll(r.Body)
if err != nil { if err != nil {
raven.CaptureErrorAndWait(err, nil) raven.CaptureErrorAndWait(err, nil)
@ -385,7 +388,7 @@ func createHandler(w http.ResponseWriter, r *http.Request) {
cr, status, errr := client.APICredentials() cr, status, errr := client.APICredentials()
if errr.RuntimeErr != nil { if errr.RuntimeErr != nil {
raven.CaptureErrorAndWait(err, nil) raven.CaptureErrorAndWait(errr.RuntimeErr, nil)
http.Error(w, localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "not_found_account"}), http.StatusInternalServerError) http.Error(w, localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "not_found_account"}), http.StatusInternalServerError)
logger.Error(c.APIURL, status, errr.RuntimeErr, cr) logger.Error(c.APIURL, status, errr.RuntimeErr, cr)
return return
@ -429,7 +432,7 @@ func createHandler(w http.ResponseWriter, r *http.Request) {
data, status, errr := client.IntegrationModuleEdit(integration) data, status, errr := client.IntegrationModuleEdit(integration)
if errr.RuntimeErr != nil { if errr.RuntimeErr != nil {
raven.CaptureErrorAndWait(err, nil) raven.CaptureErrorAndWait(errr.RuntimeErr, nil)
http.Error(w, localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "error_creating_integration"}), http.StatusInternalServerError) http.Error(w, localizer.MustLocalize(&i18n.LocalizeConfig{MessageID: "error_creating_integration"}), http.StatusInternalServerError)
logger.Error(c.APIURL, status, errr.RuntimeErr, data) logger.Error(c.APIURL, status, errr.RuntimeErr, data)
return return
@ -554,6 +557,15 @@ func validate(c Connection) error {
} }
func telegramWebhookHandler(w http.ResponseWriter, r *http.Request, token string) { func telegramWebhookHandler(w http.ResponseWriter, r *http.Request, token string) {
ok := make(chan bool)
bytes, err := ioutil.ReadAll(r.Body)
if err != nil {
raven.CaptureErrorAndWait(err, nil)
logger.Error(token, err)
return
}
go func() {
b := getBotByToken(token) b := getBotByToken(token)
if b.ID == 0 { if b.ID == 0 {
logger.Error(token, "missing") logger.Error(token, "missing")
@ -565,24 +577,12 @@ func telegramWebhookHandler(w http.ResponseWriter, r *http.Request, token string
return return
} }
bot, err := GetBotInfo(token)
if err != nil {
logger.Error(token, err)
}
bot.Debug = false
bytes, err := ioutil.ReadAll(r.Body)
if err != nil {
raven.CaptureErrorAndWait(err, nil)
return
}
var update tgbotapi.Update var update tgbotapi.Update
err = json.Unmarshal(bytes, &update) err = json.Unmarshal(bytes, &update)
if err != nil { if err != nil {
raven.CaptureErrorAndWait(err, nil) raven.CaptureErrorAndWait(err, nil)
logger.Error(token, err)
return return
} }
@ -615,6 +615,8 @@ func telegramWebhookHandler(w http.ResponseWriter, r *http.Request, token string
data, status, err := client.Messages(snd) data, status, err := client.Messages(snd)
if err != nil { if err != nil {
logger.Error(token, err.Error(), status, data) logger.Error(token, err.Error(), status, data)
ok <- false
return
} }
} }
@ -633,6 +635,18 @@ func telegramWebhookHandler(w http.ResponseWriter, r *http.Request, token string
data, status, err := client.UpdateMessages(snd) data, status, err := client.UpdateMessages(snd)
if err != nil { if err != nil {
logger.Error(token, err.Error(), status, data) logger.Error(token, err.Error(), status, data)
ok <- false
return
} }
} }
ok <- true
}()
if <-ok {
w.WriteHeader(http.StatusOK)
w.Write([]byte("SendMessage"))
} else {
w.WriteHeader(http.StatusBadRequest)
}
} }

View File

@ -3,16 +3,24 @@ package main
import ( import (
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strings"
"testing" "testing"
"strings"
"encoding/json"
"github.com/h2non/gock" "github.com/h2non/gock"
"github.com/retailcrm/mg-transport-api-client-go/v1"
) )
func init() {
c := Connection{
ClientID: "123123",
APIKEY: "test",
APIURL: "https://test.retailcrm.ru",
MGURL: "https://test.retailcrm.pro",
MGToken: "test-token",
Active: true,
}
c.createConnection()
}
func TestRouting_connectHandler(t *testing.T) { func TestRouting_connectHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/", nil) req, err := http.NewRequest("GET", "/", nil)
if err != nil { if err != nil {
@ -34,40 +42,123 @@ func TestRouting_addBotHandler(t *testing.T) {
defer gock.Off() defer gock.Off()
gock.New("https://api.telegram.org"). gock.New("https://api.telegram.org").
Post("/botbot123:test/getMe"). Post("/bot123123:Qwerty/getMe").
Reply(200). Reply(200).
BodyString(`{"ok":true,"result":{"id":123,"is_bot":true,"first_name":"Test","username":"TestBot"}}`) BodyString(`{"ok":true,"result":{"id":123,"is_bot":true,"first_name":"Test","username":"TestBot"}}`)
ch := v1.Channel{ gock.New("https://api.telegram.org").
Type: "telegram", Post("/bot123123:Qwerty/setWebhook").
Events: []string{ MatchType("url").
"message_sent", BodyString("url=https%3A%2F%2Ftest.com%2Ftelegram%2F123123%3AQwerty").
"message_updated", Reply(201).
"message_deleted", BodyString(`{"ok":true}`)
"message_read",
},
}
str, _ := json.Marshal(ch)
gock.New("https://mg-test.com"). gock.New("https://api.telegram.org").
Post("/bot123123:Qwerty/getWebhookInfo").
Reply(200).
BodyString(`{"ok":true,"result":{"url":"https://test.com/telegram/123123:Qwerty","has_custom_certificate":false,"pending_update_count":0}}`)
gock.New("https://test.retailcrm.pro").
Post("/api/v1/transport/channels"). Post("/api/v1/transport/channels").
JSON(str). BodyString(`{"ID":0,"Type":"telegram","Events":["message_sent","message_updated","message_deleted","message_read"]}`).
MatchHeader("Content-Type", "application/json"). MatchHeader("Content-Type", "application/json").
MatchHeader("X-Transport-Token", "test-token"). MatchHeader("X-Transport-Token", "test-token").
Reply(200). Reply(201).
BodyString(`{"id": 1}`) BodyString(`{"id": 1}`)
req, err := http.NewRequest("POST", "/add-bot/", strings.NewReader(`{"token": "bot123:test", "clientId": "test"}`)) req, err := http.NewRequest("POST", "/add-bot/", strings.NewReader(`{"token": "123123:Qwerty", "clientId": "123123"}`))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
handler := http.HandlerFunc(addBotHandler) handler := http.HandlerFunc(addBotHandler)
handler.ServeHTTP(rr, req) handler.ServeHTTP(rr, req)
if rr.Code != http.StatusCreated { if rr.Code != http.StatusCreated {
t.Errorf("handler returned wrong status code: got %v want %v", t.Errorf("handler returned wrong status code: got %v want %v",
rr.Code, http.StatusCreated) rr.Code, http.StatusCreated)
} }
} }
func TestRouting_activityBotHandler(t *testing.T) {
defer gock.Off()
gock.New("https://test.retailcrm.pro").
Post("/api/v1/transport/channels").
BodyString(`{"ID":1,"Type":"telegram","Events":["message_sent","message_updated","message_deleted","message_read"]}`).
MatchHeader("Content-Type", "application/json").
MatchHeader("X-Transport-Token", "123123").
Reply(200).
BodyString(`{"id": 1}`)
req, err := http.NewRequest("POST", "/activity-bot/", strings.NewReader(`{"token": "123123:Qwerty", "active": false, "clientId": "123123"}`))
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(activityBotHandler)
handler.ServeHTTP(rr, req)
if rr.Code != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
rr.Code, http.StatusOK)
}
}
func TestRouting_settingsHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/settings/123123", nil)
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(makeHandler(settingsHandler))
handler.ServeHTTP(rr, req)
if rr.Code != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
rr.Code, http.StatusOK)
}
}
func TestRouting_saveHandler(t *testing.T) {
req, err := http.NewRequest("POST", "/save/",
strings.NewReader(
`{"clientId": "123123",
"api_url": "https://test.retailcrm.ru",
"api_key": "test"}`,
))
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(saveHandler)
handler.ServeHTTP(rr, req)
if rr.Code != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
rr.Code, http.StatusOK)
}
}
func TestRouting_activityHandler(t *testing.T) {
req, err := http.NewRequest("POST", "/actions/activity",
strings.NewReader(
`{"clientId": "123123","activity": {"active": true}}`,
))
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(activityHandler)
handler.ServeHTTP(rr, req)
if rr.Code != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
rr.Code, http.StatusOK)
}
}