package backup import ( "errors" "fmt" "net/http" "testing" ) func TestCommonRootIsTheFolderHoldingEveryLibraryRoot(t *testing.T) { for _, c := range []struct { roots []string want string }{ {nil, ""}, {[]string{"/music"}, "/music"}, {[]string{"/music/"}, "/music"}, {[]string{"/data/music/a", "/data/music/b"}, "/data/music"}, {[]string{"/data/music", "/data/musicals"}, "/data"}, {[]string{"/music", "/audiobooks"}, "/"}, } { if got := commonRoot(c.roots); got != c.want { t.Errorf("commonRoot(%q) = %q, want %q", c.roots, got, c.want) } } } func TestMusicPathIsTheFileUnderTheCommonRoot(t *testing.T) { for _, c := range []struct{ root, file, want string }{ {"/data/music", "/data/music/a/Artist/01 Song.flac", "music/a/Artist/01 Song.flac"}, {"/", "/music/x.mp3", "music/music/x.mp3"}, {"/data/music", "/elsewhere/x.mp3", "music/elsewhere/x.mp3"}, {"", "/music/x.mp3", "music/music/x.mp3"}, } { if got := musicPath(c.root, c.file); got != c.want { t.Errorf("musicPath(%q, %q) = %q, want %q", c.root, c.file, got, c.want) } } } func TestObjectRefusedIsOneObjectNotTheWholeBucket(t *testing.T) { for _, c := range []struct { err error want bool }{ {&Refusal{Status: http.StatusForbidden, Code: "AccessDenied"}, true}, {&Refusal{Status: http.StatusConflict, Code: "ObjectLocked"}, true}, {fmt.Errorf("put: %w", &Refusal{Status: http.StatusBadRequest, Code: "InvalidObjectName"}), true}, {&Refusal{Status: http.StatusForbidden, Code: "SignatureDoesNotMatch"}, false}, {&Refusal{Status: http.StatusNotFound, Code: "NoSuchBucket"}, false}, {&Refusal{Status: http.StatusTooManyRequests}, false}, {&Refusal{Status: http.StatusServiceUnavailable, Code: "SlowDown"}, false}, {&Refusal{Status: http.StatusInternalServerError}, false}, {errors.New("connection refused"), false}, } { if got := ObjectRefused(c.err); got != c.want { t.Errorf("ObjectRefused(%v %+v) = %v, want %v", c.err, c.err, got, c.want) } } }