- выбор → поимённое подтверждение → отчёт: пачка до 20 загрузок, гарды входа на обеих границах, потолок времени и остановка после трёх подряд отказов внешнего сервиса - допуск полного удаления сведён в единую точку store.State.CanDelete() — worker, страница загрузки и Telegram больше не держат своих перечней
44 lines
1.4 KiB
Go
44 lines
1.4 KiB
Go
package tgbot
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.vakhrushev.me/av/jellybit/internal/store"
|
|
)
|
|
|
|
// Кнопка «Удалить» приходит ровно в тех состояниях, где домен допускает полное
|
|
// удаление. Транспорт своего перечня состояний не держит: разъехавшись с
|
|
// доменом, он показал бы кнопку, ведущую в конфликт, — или спрятал бы
|
|
// доступное действие.
|
|
func TestRenderCard_DeleteButtonFollowsCanDelete(t *testing.T) {
|
|
b, _, _, _ := newTestBot(t, []int64{7})
|
|
|
|
all := []store.State{
|
|
store.StateCatched, store.StateDownloading, store.StateCompleted,
|
|
store.StateRecognizing, store.StateReview, store.StateLinking,
|
|
store.StateDone, store.StateDeferred, store.StateStuck,
|
|
store.StateFailed, store.StateCancelled, store.StateReverted,
|
|
store.StateTargetMissing, store.StateOrphaned, store.StateDeleted,
|
|
}
|
|
|
|
for _, st := range all {
|
|
rd := reviewData(st)
|
|
_, kb := b.renderCard(rd)
|
|
|
|
found := false
|
|
if kb != nil {
|
|
for _, row := range kb.InlineKeyboard {
|
|
for _, btn := range row {
|
|
if btn.CallbackData != nil && strings.HasPrefix(*btn.CallbackData, "delete:") {
|
|
found = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if want := st.CanDelete(); found != want {
|
|
t.Errorf("%s: кнопка удаления=%v, CanDelete=%v", st, found, want)
|
|
}
|
|
}
|
|
}
|