Приём/UI: пачка фиксов границ и парсинга (F7–F10, N2)
Пять независимых bugfix'ов из ревью приёма (docs/backlog/review-f7-f10-ingest-ui-fixes.md): - F7: oversized .torrent через веб отдавал 500. Введён sentinel ingest.ErrTorrentTooLarge, classifyErr транслирует его в 400. - F8: гонка fast-path attach с cancel. Пред-рид FindReingestBlockingByInfohash больше не короткозамыкает активную запись — авторитетное дедуп-решение принимает CreateDownloadIfNoActive под BEGIN IMMEDIATE; короткозамыкание оставлено только для терминальных desync-записей (target_missing/orphaned). F6-апгрейд сохранён. - F9: magnet — регистронезависимый URN-префикс xt (RFC 2141); tgbot.ParseMessage срезает хвостовую пунктуацию, приклеенную жадным matchем. - F10: cap контекста до 16 KiB в ingest.Ingest (единственное место слияния — покрывает все транспорты), рунобезопасная обрезка + маркер. - N2: httpapi.shorten режет по рунам, не байтам — кириллица не рвётся в U+FFFD. Добавлены юнит-тесты на каждое исправленное поведение. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -75,3 +75,30 @@ func TestParseMessage_NoMagnet(t *testing.T) {
|
||||
t.Error("ожидалось ok=false без magnet")
|
||||
}
|
||||
}
|
||||
|
||||
// F9: жадный magnetRe приклеивает хвостовую пунктуацию (magnet в конце
|
||||
// предложения/в скобках) — ParseMessage её срезает, иначе последний xt сдвигается
|
||||
// и длина btih ломается.
|
||||
func TestParseMessage_TrimsTrailingPunct(t *testing.T) {
|
||||
const want = "magnet:?xt=urn:btih:7931AA3ED6666746012F5739D099B5BC64D72A16"
|
||||
cases := []struct {
|
||||
name string
|
||||
text string
|
||||
}{
|
||||
{"точка", "Смотри: " + want + "."},
|
||||
{"скобка", "(" + want + ")"},
|
||||
{"кавычка-ёлочка", "«" + want + "»"},
|
||||
{"несколько", want + ").,"},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
src, _, ok := ParseMessage(tc.text)
|
||||
if !ok {
|
||||
t.Fatal("magnet не найден")
|
||||
}
|
||||
if src != want {
|
||||
t.Errorf("src = %q, want %q", src, want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user