package subsonic import ( "database/sql" "io" "log/slog" "net/http/httptest" "path/filepath" "testing" vsauth "git.noroutes.net/NoRoutes/vibetunes/internal/auth" "git.noroutes.net/NoRoutes/vibetunes/internal/config" "git.noroutes.net/NoRoutes/vibetunes/internal/coverart" "git.noroutes.net/NoRoutes/vibetunes/internal/database" "git.noroutes.net/NoRoutes/vibetunes/internal/jukebox" "git.noroutes.net/NoRoutes/vibetunes/internal/metadata" "git.noroutes.net/NoRoutes/vibetunes/internal/podcasts" "git.noroutes.net/NoRoutes/vibetunes/internal/scanner" "git.noroutes.net/NoRoutes/vibetunes/internal/transcoding" ) func newTestServer(t *testing.T) (*Server, *sql.DB) { t.Helper() db, err := database.Open(filepath.Join(t.TempDir(), "test.db")) if err != nil { t.Fatalf("database.Open: %v", err) } t.Cleanup(func() { db.Close() }) key, err := vsauth.EncryptionKey(db, "test-secret") if err != nil { t.Fatalf("EncryptionKey: %v", err) } log := slog.New(slog.NewTextHandler(io.Discard, nil)) s := &Server{ DB: db, Config: config.Config{}, EncryptionKey: key, Scanner: scanner.New(db, &metadata.Prober{}, log), CoverArt: coverart.New(t.TempDir(), ""), Transcoder: transcoding.NewManager(""), Podcasts: podcasts.NewManager(db, t.TempDir(), "", log), Jukebox: jukebox.New(""), Log: log, } t.Cleanup(s.Jukebox.Close) return s, db } // createTestUser creates a user with the given password (via // auth.SetUserPassword, so both the Argon2id hash and the encrypted // Subsonic-token-auth secret are populated, matching production). func createTestUser(t *testing.T, s *Server, username, password string, isAdmin bool) *database.User { t.Helper() u, err := database.CreateUser(s.DB, username, "", "", isAdmin) if err != nil { t.Fatalf("CreateUser: %v", err) } if err := vsauth.SetUserPassword(s.DB, s.EncryptionKey, u.ID, password); err != nil { t.Fatalf("SetUserPassword: %v", err) } u, err = database.GetUserByID(s.DB, u.ID) if err != nil { t.Fatalf("GetUserByID: %v", err) } return u } func newTestRecorderServer(t *testing.T) (*Server, *httptest.Server) { t.Helper() s, _ := newTestServer(t) srv := httptest.NewServer(s.Router()) t.Cleanup(srv.Close) return s, srv }