4e077d878e
категории
147 lines
4.4 KiB
Go
147 lines
4.4 KiB
Go
package worker
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"git.vakhrushev.me/av/jellybit/internal/qbt"
|
|
"git.vakhrushev.me/av/jellybit/internal/store"
|
|
)
|
|
|
|
const ihDisc = "7931aa3ed6666746012f5739d099b5bc64d72a16"
|
|
|
|
func emptyStore() *fakeStore {
|
|
return &fakeStore{downloads: map[int64]*store.Download{}}
|
|
}
|
|
|
|
// findByInfohash возвращает усыновлённую задачу по infohash.
|
|
func findByInfohash(st *fakeStore, infohash string) *store.Download {
|
|
for _, d := range st.downloads {
|
|
if d.Infohash.String == infohash {
|
|
return d
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func TestDiscover_AdoptsByCategory(t *testing.T) {
|
|
st := emptyStore()
|
|
w := newTestWorker(st, &fakeQbt{})
|
|
w.discover(context.Background(), []qbt.Torrent{
|
|
{Hash: ihDisc, Name: "Avatar", Category: "jellybit", State: "stalledUP"},
|
|
})
|
|
|
|
d := findByInfohash(st, ihDisc)
|
|
if d == nil {
|
|
t.Fatal("раздача с категорией jellybit не усыновлена")
|
|
}
|
|
if d.State != store.StateDownloading || d.SourceType != store.SourceMagnet {
|
|
t.Errorf("adopted = %+v", d)
|
|
}
|
|
if d.IdempotencyKey.String != ihDisc {
|
|
t.Errorf("idempotency_key = %q", d.IdempotencyKey.String)
|
|
}
|
|
}
|
|
|
|
func TestDiscover_AdoptsByTag(t *testing.T) {
|
|
st := emptyStore()
|
|
w := newTestWorker(st, &fakeQbt{})
|
|
w.cfg.Tag = "jellybit"
|
|
// Категория чужая, но тег наш — усыновляем (не трогая категорию).
|
|
w.discover(context.Background(), []qbt.Torrent{
|
|
{Hash: ihDisc, Name: "Fargo", Category: "movies", Tags: "hd, jellybit, rus", State: "uploading"},
|
|
})
|
|
if findByInfohash(st, ihDisc) == nil {
|
|
t.Fatal("раздача с тегом jellybit не усыновлена")
|
|
}
|
|
}
|
|
|
|
func TestDiscover_SkipsUntracked(t *testing.T) {
|
|
st := emptyStore()
|
|
w := newTestWorker(st, &fakeQbt{})
|
|
w.cfg.Tag = "jellybit"
|
|
w.discover(context.Background(), []qbt.Torrent{
|
|
{Hash: ihDisc, Category: "movies", Tags: "hd, rus"},
|
|
})
|
|
if len(st.downloads) != 0 {
|
|
t.Errorf("чужая раздача не должна усыновляться: %+v", st.downloads)
|
|
}
|
|
}
|
|
|
|
func TestDiscover_SkipsExisting(t *testing.T) {
|
|
st := emptyStore()
|
|
// Уже есть задача (напр. терминальная done) — не переусыновляем.
|
|
st.downloads[1] = &store.Download{
|
|
ID: 1, State: store.StateDone, Infohash: store.NullString(ihDisc),
|
|
}
|
|
w := newTestWorker(st, &fakeQbt{})
|
|
w.discover(context.Background(), []qbt.Torrent{
|
|
{Hash: ihDisc, Category: "jellybit"},
|
|
})
|
|
if len(st.downloads) != 1 {
|
|
t.Errorf("существующий infohash не должен порождать новую задачу: %d", len(st.downloads))
|
|
}
|
|
}
|
|
|
|
func TestDiscover_SkipsNoInfohash(t *testing.T) {
|
|
st := emptyStore()
|
|
w := newTestWorker(st, &fakeQbt{})
|
|
w.discover(context.Background(), []qbt.Torrent{{Category: "jellybit"}})
|
|
if len(st.downloads) != 0 {
|
|
t.Error("без infohash усыновлять нечего")
|
|
}
|
|
}
|
|
|
|
// TestPoll_AdoptsAndCompletes — сценарий пользователя целиком: помеченная и
|
|
// уже скачанная раздача за один тик усыновляется и доходит до completed.
|
|
func TestPoll_AdoptsAndCompletes(t *testing.T) {
|
|
st := emptyStore()
|
|
qb := &fakeQbt{torrents: []qbt.Torrent{
|
|
{Hash: ihDisc, Name: "Avatar", Category: "other", Tags: "jellybit", State: "stalledUP"},
|
|
}}
|
|
w := newTestWorker(st, qb)
|
|
w.cfg.Tag = "jellybit"
|
|
|
|
if err := w.Poll(context.Background()); err != nil {
|
|
t.Fatalf("Poll: %v", err)
|
|
}
|
|
d := findByInfohash(st, ihDisc)
|
|
if d == nil {
|
|
t.Fatal("не усыновлено")
|
|
}
|
|
if d.State != store.StateCompleted {
|
|
t.Errorf("state = %q, want completed (готовая раздача)", d.State)
|
|
}
|
|
}
|
|
|
|
func TestHasTag(t *testing.T) {
|
|
cases := []struct {
|
|
tags, tag string
|
|
want bool
|
|
}{
|
|
{"jellybit", "jellybit", true},
|
|
{"hd, jellybit, rus", "jellybit", true},
|
|
{"hd,rus", "jellybit", false},
|
|
{"jellybit-extra", "jellybit", false},
|
|
{"", "jellybit", false},
|
|
{"jellybit", "", false},
|
|
}
|
|
for _, c := range cases {
|
|
if got := hasTag(c.tags, c.tag); got != c.want {
|
|
t.Errorf("hasTag(%q,%q) = %v, want %v", c.tags, c.tag, got, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFirstInfohash(t *testing.T) {
|
|
if got := firstInfohash(qbt.Torrent{Hash: "ABC"}); got != "abc" {
|
|
t.Errorf("got %q", got)
|
|
}
|
|
if got := firstInfohash(qbt.Torrent{InfohashV2: "DEF"}); got != "def" {
|
|
t.Errorf("got %q", got)
|
|
}
|
|
if got := firstInfohash(qbt.Torrent{}); got != "" {
|
|
t.Errorf("got %q, want empty", got)
|
|
}
|
|
}
|