- Implemented a retry mechanism for external calls, allowing up to 3 attempts before failing. - Enhanced error handling to send failure notifications when setup steps fail, including detailed error messages. - Updated RunSummary model to include status, error step, and error message fields for better tracking of run outcomes. - Modified database schema to store failure metadata for runs. - Updated README.md to reflect changes in error handling and notification behavior.
85 lines
2.1 KiB
Go
85 lines
2.1 KiB
Go
package store
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"ncore-hnr/internal/model"
|
|
)
|
|
|
|
func TestMarkResolvedResolvesManualNeededTorrent(t *testing.T) {
|
|
db, err := Open(t.TempDir() + "/state.sqlite")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
now := time.Date(2026, 5, 7, 1, 0, 0, 0, time.UTC)
|
|
torrent := model.Torrent{ID: 123, Name: "The Black Dagger Brotherhood S01E01 720p"}
|
|
if _, err := db.UpsertSeen(torrent, now); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := db.MarkManualNeeded(torrent.ID, now.Add(time.Hour)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
resolvedAt := now.Add(2 * time.Hour)
|
|
if err := db.MarkResolved(map[int64]bool{}, resolvedAt); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
status, err := db.Status()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(status.Torrents) != 1 {
|
|
t.Fatalf("expected 1 tracked torrent, got %d", len(status.Torrents))
|
|
}
|
|
got := status.Torrents[0]
|
|
if got.Status != "resolved" {
|
|
t.Fatalf("expected status resolved, got %q", got.Status)
|
|
}
|
|
if got.LastResolvedAt != resolvedAt.Format(time.RFC3339) {
|
|
t.Fatalf("expected last_resolved_at %q, got %q", resolvedAt.Format(time.RFC3339), got.LastResolvedAt)
|
|
}
|
|
}
|
|
|
|
func TestInsertRunRecordsFailureMetadata(t *testing.T) {
|
|
db, err := Open(t.TempDir() + "/state.sqlite")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
startedAt := time.Date(2026, 5, 7, 11, 0, 0, 0, time.UTC)
|
|
if err := db.InsertRun(model.RunSummary{
|
|
StartedAt: startedAt,
|
|
Status: "failed",
|
|
ErrorStep: "fetch nCore HnR page",
|
|
ErrorMessage: "timeout",
|
|
DryRun: true,
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
stats, err := db.Stats()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if stats.LastRun == nil {
|
|
t.Fatal("expected last run")
|
|
}
|
|
if stats.LastRun.Status != "failed" {
|
|
t.Fatalf("expected status failed, got %q", stats.LastRun.Status)
|
|
}
|
|
if stats.LastRun.ErrorStep != "fetch nCore HnR page" {
|
|
t.Fatalf("expected error step to be recorded, got %q", stats.LastRun.ErrorStep)
|
|
}
|
|
if stats.LastRun.ErrorMessage != "timeout" {
|
|
t.Fatalf("expected error message to be recorded, got %q", stats.LastRun.ErrorMessage)
|
|
}
|
|
if !stats.LastRun.DryRun {
|
|
t.Fatal("expected dry-run to be recorded")
|
|
}
|
|
}
|