diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/model/scan.go | 7 | ||||
| -rw-r--r-- | internal/model/scan_test.go | 11 | ||||
| -rw-r--r-- | internal/scanner/scanner.go | 2 | ||||
| -rw-r--r-- | internal/scanner/scanner_test.go | 56 |
4 files changed, 75 insertions, 1 deletions
diff --git a/internal/model/scan.go b/internal/model/scan.go index 7fb4e8d..aeec15e 100644 --- a/internal/model/scan.go +++ b/internal/model/scan.go @@ -47,6 +47,13 @@ func (p *ScanProgress) SetFilesTotal(total int) { p.FilesTotal = total } +// AddFilesTotal adds to the total number of files discovered during the scan. +func (p *ScanProgress) AddFilesTotal(total int) { + p.mu.Lock() + defer p.mu.Unlock() + p.FilesTotal += total +} + // IncrementSet increments the completed set count. func (p *ScanProgress) IncrementSet() { p.mu.Lock() diff --git a/internal/model/scan_test.go b/internal/model/scan_test.go index acd1dd1..7d370c3 100644 --- a/internal/model/scan_test.go +++ b/internal/model/scan_test.go @@ -50,6 +50,17 @@ func TestScanProgress_SetFilesTotal(t *testing.T) { } } +func TestScanProgress_AddFilesTotal(t *testing.T) { + var p ScanProgress + p.Start(2) + p.AddFilesTotal(10) + p.AddFilesTotal(15) + cp := p.Copy() + if cp.FilesTotal != 25 { + t.Errorf("FilesTotal = %d, want 25", cp.FilesTotal) + } +} + func TestScanProgress_IncrementFile(t *testing.T) { var p ScanProgress p.Start(1) diff --git a/internal/scanner/scanner.go b/internal/scanner/scanner.go index dc5f34f..d1e50ba 100644 --- a/internal/scanner/scanner.go +++ b/internal/scanner/scanner.go @@ -347,7 +347,7 @@ func (s *FSScanner) scanSet(ctx context.Context, root, setPath string, progress } if progress != nil { - progress.SetFilesTotal(len(files)) + progress.AddFilesTotal(len(files)) } pathChan := make(chan string, len(files)) diff --git a/internal/scanner/scanner_test.go b/internal/scanner/scanner_test.go index ad6ddd7..0738709 100644 --- a/internal/scanner/scanner_test.go +++ b/internal/scanner/scanner_test.go @@ -268,6 +268,62 @@ func TestFSScanner_Scan(t *testing.T) { } }) + t.Run("progress accumulates file totals across sets", func(t *testing.T) { + mfs := &mockFS{ + entries: map[string][]os.DirEntry{ + "/media": { + mockDirEntry{name: "Music", isDir: true}, + mockDirEntry{name: "Movies", isDir: true}, + }, + }, + fileInfos: map[string]os.FileInfo{ + "/media/Music/a.mp3": mockFileInfo{name: "a.mp3", size: 100}, + "/media/Music/b.mp3": mockFileInfo{name: "b.mp3", size: 200}, + "/media/Movies/c.mp3": mockFileInfo{name: "c.mp3", size: 300}, + }, + walkList: []walkEntry{ + {path: "/media/Music", isDir: true}, + {path: "/media/Music/a.mp3", isDir: false}, + {path: "/media/Music/b.mp3", isDir: false}, + {path: "/media/Movies", isDir: true}, + {path: "/media/Movies/c.mp3", isDir: false}, + {path: "/media/Movies/readme", isDir: false}, + }, + } + store := repository.NewMockStore() + store.SetRepo.ListSetsFunc = func(_ context.Context) ([]model.Set, error) { + return []model.Set{ + {ID: 1, Name: "Music", RootPath: "Music"}, + {ID: 2, Name: "Movies", RootPath: "Movies"}, + }, nil + } + store.MediaRepo.ListMediaFunc = func(_ context.Context, filter repository.MediaFilter) ([]model.Media, error) { + return nil, nil + } + store.MediaRepo.CreateMediaFunc = func(_ context.Context, m *model.Media) (int64, error) { + return 1, nil + } + prober := &probe.MockProber{ + ProbeFunc: func(_ context.Context, path string) (*model.Metadata, error) { + return &model.Metadata{Duration: 1, Codec: "mp3"}, nil + }, + } + + var progress model.ScanProgress + s := newTestScanner(store, prober, &thumb.MockGenerator{}, clk, mfs) + if err := s.Scan(ctx, "/media", &progress); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + cp := progress.Copy() + if cp.SetsTotal != 2 || cp.SetsDone != 2 { + t.Fatalf("expected 2/2 sets, got %d/%d", cp.SetsDone, cp.SetsTotal) + } + if cp.FilesTotal != 3 || cp.FilesDone != 3 { + t.Fatalf("expected 3/3 files, got %d/%d", cp.FilesDone, cp.FilesTotal) + } + }) + t.Run("scans all top-level dirs and marks canonical podcast root", func(t *testing.T) { mfs := &mockFS{ entries: map[string][]os.DirEntry{ |
