Ctrl K
ComunidadGuías…

media_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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)
	}
}