media_test.go
Rama main · réplica de lectura del repositorio original.
package main
import (
"errors"
"os"
"path/filepath"
"strings"
"testing"
"github.com/go-telegram/bot/models"
"github.com/max-messenger/max-bot-api-client-go/v2/model"
)
func TestMaxMediaLimits(t *testing.T) {
for _, tc := range []struct {
name string
m media
size int64
valid bool
}{
{"video at limit", media{upload: model.UploadVideo}, 250_000_000, true},
{"large video", media{upload: model.UploadVideo}, 250_000_001, false},
{"large audio", media{upload: model.UploadAudio}, 256_000_001, false},
{"long voice", media{upload: model.UploadAudio, duration: 3601}, 100, false},
{"voice at duration limit", media{upload: model.UploadAudio, duration: 3600}, 100, true},
{"large image", media{upload: model.UploadImage}, 50_000_001, false},
{"wide image", media{upload: model.UploadImage, width: 7681}, 100, false},
{"tall image", media{upload: model.UploadImage, height: 7681}, 100, false},
{"large document", media{upload: model.UploadFile}, 4_000_000_001, false},
} {
t.Run(tc.name, func(t *testing.T) {
err := tc.m.validate(tc.size)
if (err == nil) != tc.valid || err != nil && !errors.Is(err, errMaxMediaInvalid) {
t.Fatalf("valid=%t err=%v", tc.valid, err)
}
})
}
}
func TestInvalidVoiceIsRejectedBeforeDownloading(t *testing.T) {
f := fakes(t)
f.forward(&models.Message{ID: 1, Caption: "Запись", Voice: &models.Voice{FileID: "must-not-download", Duration: 3601}})
got := f.messages()
if f.uploads.Load() != 0 || len(got) != 1 || !strings.Contains(got[0].body.Text, "Открыть пост в Telegram") {
t.Fatalf("messages %+v uploads %d", got, f.uploads.Load())
}
if alerts := f.alerted(); len(alerts) != 1 || !strings.Contains(alerts[0], "60 минут") {
t.Fatalf("alerts %v", alerts)
}
}
func TestActualSizeRejectsUnknownLargeVideoAndRemovesDownload(t *testing.T) {
f := fakes(t)
f.relay.fileLimit = 0
path := filepath.Join(t.TempDir(), "large.mp4")
file, err := os.Create(path)
if err != nil {
t.Fatal(err)
}
if err := file.Truncate(250_000_001); err != nil {
t.Fatal(err)
}
if err := file.Close(); err != nil {
t.Fatal(err)
}
f.forward(&models.Message{ID: 1, Caption: "Запись", Video: &models.Video{FileID: path}})
if f.uploads.Load() != 0 {
t.Fatal("oversized file uploaded")
}
if _, err := os.Stat(path); !errors.Is(err, os.ErrNotExist) {
t.Fatalf("download remains: %v", err)
}
if got := f.messages(); len(got) != 1 || !strings.Contains(got[0].body.Text, "Открыть пост в Telegram") {
t.Fatalf("got %+v", got)
}
}
func TestGIFHeaderOverridesMisleadingExtension(t *testing.T) {
m := media{upload: model.UploadVideo, attach: model.AttachVideo, name: "renamed.mp4"}
got, err := m.prepared(tgFile{data: []byte("GIF89a"), size: 6})
if err != nil || got.upload != model.UploadImage || got.name != "renamed.gif" {
t.Fatalf("got %+v %v", got, err)
}
}
func TestConvertedGIFRemainsMP4DespiteOriginalFilename(t *testing.T) {
md, ok := mediaOf(&models.Message{Animation: &models.Animation{FileID: "converted", FileName: "original.gif", MimeType: "video/mp4"}})
if !ok || md.upload != model.UploadVideo {
t.Fatalf("converted GIF mapped as %+v", md)
}
}