fix bot safety and tgapi edge cases
This commit is contained in:
@@ -10,8 +10,8 @@ const (
|
||||
ParseHTML ParseMode = "HTML"
|
||||
// ParseMD enables legacy Markdown style parsing.
|
||||
ParseMD ParseMode = "Markdown"
|
||||
// ParseNone disables any parsing.
|
||||
ParseNone ParseMode = "None"
|
||||
// ParseNone disables parse_mode and leaves plain-text requests unannotated.
|
||||
ParseNone ParseMode = ""
|
||||
)
|
||||
|
||||
// EmptyParams is a placeholder for methods that take no parameters.
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package tgapi
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestParseNoneOmitsParseModeInJSON(t *testing.T) {
|
||||
data, err := json.Marshal(SendMessageP{
|
||||
ChatID: 42,
|
||||
Text: "hello",
|
||||
ParseMode: ParseNone,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Marshal returned error: %v", err)
|
||||
}
|
||||
|
||||
if strings.Contains(string(data), `"parse_mode"`) {
|
||||
t.Fatalf("expected parse_mode to be omitted, got %s", string(data))
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseModeStillSerializesExplicitModes(t *testing.T) {
|
||||
data, err := json.Marshal(SendMessageP{
|
||||
ChatID: 42,
|
||||
Text: "hello",
|
||||
ParseMode: ParseMDV2,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Marshal returned error: %v", err)
|
||||
}
|
||||
|
||||
if !strings.Contains(string(data), `"parse_mode":"MarkdownV2"`) {
|
||||
t.Fatalf("expected MarkdownV2 parse_mode, got %s", string(data))
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.nix13.pw/scuroneko/laniakea/utils"
|
||||
@@ -241,7 +242,7 @@ func prepareMultipart[P any](files []UploaderFile, params P) (*bytes.Buffer, str
|
||||
// uploaderTypeByExt infers the Telegram upload field name from a file extension.
|
||||
// Falls back to UploaderDocumentType for unrecognized extensions.
|
||||
func uploaderTypeByExt(filename string) UploaderFileType {
|
||||
ext := filepath.Ext(filename)
|
||||
ext := strings.ToLower(filepath.Ext(filename))
|
||||
switch ext {
|
||||
case ".jpg", ".jpeg", ".png", ".webp", ".bmp":
|
||||
return UploaderPhotoType
|
||||
|
||||
@@ -104,6 +104,27 @@ func TestUploaderEncodesJSONFieldsAndLeavesAcceptEncodingToHTTPTransport(t *test
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewUploaderFileDetectsFileTypeCaseInsensitively(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
filename string
|
||||
want UploaderFileType
|
||||
}{
|
||||
{name: "uppercase photo", filename: "PHOTO.JPG", want: UploaderPhotoType},
|
||||
{name: "uppercase voice", filename: "voice.OGG", want: UploaderVoiceType},
|
||||
{name: "unknown defaults to document", filename: "archive.BIN", want: UploaderDocumentType},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
file := NewUploaderFile(tt.filename, []byte("x"))
|
||||
if file.field != tt.want {
|
||||
t.Fatalf("unexpected uploader field: got %q want %q", file.field, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func readMultipartRequest(req *http.Request) (map[string]string, string, []byte, error) {
|
||||
_, params, err := mime.ParseMediaType(req.Header.Get("Content-Type"))
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user