Добавил ручную перепривязку
This commit is contained in:
@@ -97,6 +97,80 @@ func TestScanner_FiresOnDone(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func revertedDownload(id int64) *store.Download {
|
||||
d := completedDownload(id)
|
||||
d.State = store.StateReverted
|
||||
return d
|
||||
}
|
||||
|
||||
func TestRelink_RevertedToRecognizing(t *testing.T) {
|
||||
st := newMemStore()
|
||||
st.put(revertedDownload(1))
|
||||
qb := &fakeQbt{torrents: []qbt.Torrent{{Hash: ihTest, Name: "Show", SavePath: "/d"}}}
|
||||
w := testWorkerWith(st, qb, &fakeRecognizer{result: seriesResult()}, nil)
|
||||
|
||||
if err := w.Relink(context.Background(), 1); err != nil {
|
||||
t.Fatalf("Relink: %v", err)
|
||||
}
|
||||
if st.downloads[1].State != store.StateRecognizing {
|
||||
t.Fatalf("state = %q, want recognizing", st.downloads[1].State)
|
||||
}
|
||||
if st.overrides[1][ovrForceReview] != "1" {
|
||||
t.Errorf("force_review override = %q, want 1", st.overrides[1][ovrForceReview])
|
||||
}
|
||||
}
|
||||
|
||||
func TestRelink_RejectsNonReverted(t *testing.T) {
|
||||
st := newMemStore()
|
||||
st.put(completedDownload(1)) // не reverted
|
||||
qb := &fakeQbt{torrents: []qbt.Torrent{{Hash: ihTest}}}
|
||||
w := testWorkerWith(st, qb, &fakeRecognizer{}, nil)
|
||||
|
||||
if err := w.Relink(context.Background(), 1); err == nil {
|
||||
t.Fatal("ожидали ошибку для не-reverted задачи, получили nil")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRelink_TorrentMissing(t *testing.T) {
|
||||
st := newMemStore()
|
||||
st.put(revertedDownload(1))
|
||||
qb := &fakeQbt{torrents: nil} // раздачи в qBittorrent нет
|
||||
w := testWorkerWith(st, qb, &fakeRecognizer{}, nil)
|
||||
|
||||
if err := w.Relink(context.Background(), 1); err == nil {
|
||||
t.Fatal("ожидали ошибку при отсутствии торрента, получили nil")
|
||||
}
|
||||
if st.downloads[1].State != store.StateReverted {
|
||||
t.Errorf("state = %q, want reverted (без изменений)", st.downloads[1].State)
|
||||
}
|
||||
}
|
||||
|
||||
// TestRelink_ForceReviewSkipsAuto проверяет, что после перепривязки даже
|
||||
// уверенный матч не уходит в авто-раскладку, а ждёт подтверждения в review.
|
||||
func TestRelink_ForceReviewSkipsAuto(t *testing.T) {
|
||||
f := newApplyFixture(t, seriesResult().Plan)
|
||||
// Готовим состояние «как после Relink»: reverted, force_review выставлен.
|
||||
f.st.downloads[1].State = store.StateReverted
|
||||
_ = f.st.SetOverride(context.Background(), 1, ovrForceReview, "1")
|
||||
|
||||
auto := seriesResult()
|
||||
auto.Decision.Auto = true
|
||||
auto.Match = &recognize.Match{Provider: "tvdb", ProviderID: "42"}
|
||||
f.w.recognizer = &fakeRecognizer{result: auto}
|
||||
|
||||
if err := f.w.Relink(context.Background(), 1); err != nil {
|
||||
t.Fatalf("Relink: %v", err)
|
||||
}
|
||||
f.w.recognizeOne(context.Background(), 1)
|
||||
|
||||
if f.st.downloads[1].State != store.StateReview {
|
||||
t.Fatalf("state = %q, want review (авто-раскладка не должна сработать)", f.st.downloads[1].State)
|
||||
}
|
||||
if len(f.st.links) != 0 {
|
||||
t.Errorf("file_links = %d, want 0 (ничего не линковали)", len(f.st.links))
|
||||
}
|
||||
}
|
||||
|
||||
// memStore — полноценный in-memory store для тестов Ф3.
|
||||
type memStore struct {
|
||||
downloads map[int64]*store.Download
|
||||
@@ -138,6 +212,16 @@ func (m *memStore) ExistsByInfohash(_ context.Context, infohash string) (bool, e
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func (m *memStore) FindActiveByInfohash(_ context.Context, infohash string) (*store.Download, error) {
|
||||
for _, d := range m.downloads {
|
||||
if d.Infohash.Valid && d.Infohash.String == infohash && !d.State.IsTerminal() {
|
||||
cp := *d
|
||||
return &cp, nil
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (m *memStore) CreateDownload(_ context.Context, d *store.Download) (int64, error) {
|
||||
id := int64(len(m.downloads) + 1)
|
||||
cp := *d
|
||||
|
||||
Reference in New Issue
Block a user