package repository
import (
"context"
"database/sql"
"testing"
"time"
"codeberg.org/snonux/player/internal/model"
)
func newTestStore(t *testing.T) *SQLite {
t.Helper()
s, err := Open(":memory:")
if err != nil {
t.Fatalf("open in-memory db: %v", err)
}
return s
}
func TestSQLite_UserRepo(t *testing.T) {
tests := []struct {
name string
run func(t *testing.T, ctx context.Context, s *SQLite)
}{
{
name: "create and get by id",
run: func(t *testing.T, ctx context.Context, s *SQLite) {
now := time.Now().Truncate(time.Second)
id, err := s.CreateUser(ctx, &model.User{Username: "alice", PasswordHash: "h", IsAdmin: true, CreatedAt: now})
if err != nil {
t.Fatalf("create: %v", err)
}
u, err := s.GetUserByID(ctx, id)
if err != nil {
t.Fatalf("get by id: %v", err)
}
if u.Username != "alice" || !u.IsAdmin {
t.Fatalf("unexpected user: %+v", u)
}
},
},
{
name: "get by username",
run: func(t *testing.T, ctx context.Context, s *SQLite) {
now := time.Now().Truncate(time.Second)
id, _ := s.CreateUser(ctx, &model.User{Username: "bob", PasswordHash: "h", CreatedAt: now})
u, err := s.GetUserByUsername(ctx, "bob")
if err != nil {
t.Fatalf("get by username: %v", err)
}
if u.ID != id {
t.Fatalf("id mismatch")
}
},
},
{
name: "list and count",
run: func(t *testing.T, ctx context.Context, s *SQLite) {
now := time.Now().Truncate(time.Second)
_, _ = s.CreateUser(ctx, &model.User{Username: "u1", PasswordHash: "h", CreatedAt: now})
_, _ = s.CreateUser(ctx, &model.User{Username: "u2", PasswordHash: "h", CreatedAt: now})
cnt, err := s.CountUsers(ctx)
if err != nil {
t.Fatalf("count: %v", err)
}
if cnt != 2 {
t.Fatalf("expected 2, got %d", cnt)
}
users, err := s.ListUsers(ctx)
if err != nil {
t.Fatalf("list: %v", err)
}
if len(users) != 2 {
t.Fatalf("expected 2, got %d", len(users))
}
},
},
{
name: "delete",
run: func(t *testing.T, ctx context.Context, s *SQLite) {
now := time.Now().Truncate(time.Second)
id, _ := s.CreateUser(ctx, &model.User{Username: "del", PasswordHash: "h", CreatedAt: now})
if err := s.DeleteUser(ctx, id); err != nil {
t.Fatalf("delete: %v", err)
}
u, err := s.GetUserByID(ctx, id)
if err != nil {
t.Fatalf("expected no error after delete, got %v", err)
}
if u != nil {
t.Fatal("expected nil user after delete")
}
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := newTestStore(t)
defer s.Close()
tt.run(t, context.Background(), s)
})
}
}
func TestSQLite_SetRepo(t *testing.T) {
tests := []struct {
name string
run func(t *testing.T, ctx context.Context, s *SQLite)
}{
{
name: "create and get",
run: func(t *testing.T, ctx context.Context, s *SQLite) {
now := time.Now().Truncate(time.Second)
id, err := s.CreateSet(ctx, &model.Set{Name: "vids", RootPath: "/vids", CreatedAt: now})
if err != nil {
t.Fatalf("create: %v", err)
}
st, err := s.GetSetByID(ctx, id)
if err != nil {
t.Fatalf("get: %v", err)
}
if st.Name != "vids" {
t.Fatalf("unexpected name: %s", st.Name)
}
},
},
{
name: "updat
|