|
1 | 1 | package organize |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "os" |
| 5 | + "path/filepath" |
4 | 6 | "testing" |
| 7 | + |
| 8 | + "github.com/JeremiahM37/librarr/internal/config" |
5 | 9 | ) |
6 | 10 |
|
7 | 11 | func TestParseAudioFilename(t *testing.T) { |
@@ -95,3 +99,69 @@ func TestExtractAudioMetaFromDir_NonexistentDir(t *testing.T) { |
95 | 99 | t.Error("expected nil for nonexistent directory") |
96 | 100 | } |
97 | 101 | } |
| 102 | + |
| 103 | +func TestOrganizeAudiobookMissingSourceDoesNotCreateDestDir(t *testing.T) { |
| 104 | + root := t.TempDir() |
| 105 | + cfg := &config.Config{ |
| 106 | + FileOrgEnabled: true, |
| 107 | + AudiobookDir: filepath.Join(root, "audiobooks"), |
| 108 | + } |
| 109 | + o := NewOrganizer(cfg) |
| 110 | + |
| 111 | + missing := filepath.Join(root, "incoming", "missing.m4b") |
| 112 | + _, err := o.OrganizeAudiobook(missing, "Missing Book", "Missing Author") |
| 113 | + if err == nil { |
| 114 | + t.Fatal("expected error") |
| 115 | + } |
| 116 | + |
| 117 | + destDir := filepath.Join(cfg.AudiobookDir, "Missing Author", "Missing Book") |
| 118 | + if _, statErr := os.Stat(destDir); !os.IsNotExist(statErr) { |
| 119 | + t.Fatalf("expected no dest dir on failure, stat err=%v", statErr) |
| 120 | + } |
| 121 | +} |
| 122 | + |
| 123 | +func TestOrganizeAudiobookMovesNestedTreeRecursively(t *testing.T) { |
| 124 | + root := t.TempDir() |
| 125 | + src := filepath.Join(root, "incoming", "book") |
| 126 | + cd1 := filepath.Join(src, "CD1") |
| 127 | + cd2 := filepath.Join(src, "CD2", "Extras") |
| 128 | + |
| 129 | + if err := os.MkdirAll(cd1, 0755); err != nil { |
| 130 | + t.Fatal(err) |
| 131 | + } |
| 132 | + if err := os.MkdirAll(cd2, 0755); err != nil { |
| 133 | + t.Fatal(err) |
| 134 | + } |
| 135 | + if err := os.WriteFile(filepath.Join(cd1, "track01.m4b"), []byte("cd1"), 0644); err != nil { |
| 136 | + t.Fatal(err) |
| 137 | + } |
| 138 | + if err := os.WriteFile(filepath.Join(cd2, "track02.m4b"), []byte("cd2"), 0644); err != nil { |
| 139 | + t.Fatal(err) |
| 140 | + } |
| 141 | + |
| 142 | + cfg := &config.Config{ |
| 143 | + FileOrgEnabled: true, |
| 144 | + AudiobookDir: filepath.Join(root, "audiobooks"), |
| 145 | + } |
| 146 | + o := NewOrganizer(cfg) |
| 147 | + |
| 148 | + dest, err := o.OrganizeAudiobook(src, "Nested Book", "Recursive Author") |
| 149 | + if err != nil { |
| 150 | + t.Fatalf("organize failed: %v", err) |
| 151 | + } |
| 152 | + |
| 153 | + wantRoot := filepath.Join(cfg.AudiobookDir, "Recursive Author", "Nested Book") |
| 154 | + if dest != wantRoot { |
| 155 | + t.Fatalf("dest = %q, want %q", dest, wantRoot) |
| 156 | + } |
| 157 | + |
| 158 | + if _, err := os.Stat(filepath.Join(wantRoot, "CD1", "track01.m4b")); err != nil { |
| 159 | + t.Fatalf("expected CD1 track at destination: %v", err) |
| 160 | + } |
| 161 | + if _, err := os.Stat(filepath.Join(wantRoot, "CD2", "Extras", "track02.m4b")); err != nil { |
| 162 | + t.Fatalf("expected nested track at destination: %v", err) |
| 163 | + } |
| 164 | + if _, err := os.Stat(src); !os.IsNotExist(err) { |
| 165 | + t.Fatalf("expected source tree removed, stat err=%v", err) |
| 166 | + } |
| 167 | +} |
0 commit comments