package worker import ( "context" "testing" "git.vakhrushev.me/av/jellybit/internal/qbt" "git.vakhrushev.me/av/jellybit/internal/store" ) // TestPollBuildsLiveSnapshot: после Poll снимок несёт телеметрию качающейся и // сидирующей задач (с верным Seeding), доступную по любому из infohash; // неизвестный/пустой infohash → ok=false. func TestPollBuildsLiveSnapshot(t *testing.T) { qb := &fakeQbt{torrents: []qbt.Torrent{ // Качается (Category пуст → discover не усыновляет, store не мешает). {Hash: "aaa", State: "downloading", Progress: 0.5, Dlspeed: 1000, Eta: 120, TotalSize: 4096}, // Сидирует, гибридный торрент: t.Hash дублирует v1 (как отдаёт qBittorrent), // индексируем по infohash_v1/v2 (усечённый t.Hash не индексируем — NIT-11). { Hash: "bbb1", InfohashV1: "bbb1", InfohashV2: "BBB2", State: "uploading", Progress: 1.0, TotalSize: 8192, Ratio: 2.5, NumSeeds: 3, NumLeechs: 1, Uploaded: 999, Upspeed: 50, }, }} w := newTestWorker(&fakeStore{downloads: map[string]*store.Download{}}, qb) if err := w.Poll(context.Background()); err != nil { t.Fatalf("Poll: %v", err) } dl, ok := w.Live("aaa") if !ok { t.Fatal("нет телеметрии качающейся задачи") } if dl.Seeding { t.Error("качающаяся задача помечена Seeding") } if dl.Progress != 0.5 || dl.DlSpeed != 1000 || dl.ETA != 120 { t.Errorf("телеметрия качания неверна: %+v", dl) } if dl.TotalSize != 4096 { t.Errorf("полный размер качающейся задачи: got %d, want 4096", dl.TotalSize) } // Сидирующая задача находится по любому из своих infohash (lowercase). for _, h := range []string{"bbb1", "BBB2", "bbb2"} { sd, ok := w.Live(h) if !ok { t.Fatalf("нет телеметрии раздачи по ключу %q", h) } if !sd.Seeding { t.Errorf("ключ %q: Seeding=false для uploading", h) } if sd.Ratio != 2.5 || sd.Seeds != 3 || sd.Peers != 1 || sd.Uploaded != 999 || sd.UpSpeed != 50 { t.Errorf("ключ %q: статистика раздачи неверна: %+v", h, sd) } if sd.TotalSize != 8192 { t.Errorf("ключ %q: полный размер раздачи: got %d, want 8192", h, sd.TotalSize) } } if _, ok := w.Live("unknownhash"); ok { t.Error("неизвестный infohash вернул ok=true") } if _, ok := w.Live(""); ok { t.Error("пустой infohash вернул ok=true") } }