package tests
import (
"context"
"maps"
"slices"
"github.com/navidrome/navidrome/model"
"github.com/navidrome/navidrome/model/id"
)
func CreateMockPlayerRepo() *MockPlayerRepo {
return &MockPlayerRepo{Data: map[string]*model.Player{}, APIKeys: map[string]string{}}
}
type MockPlayerRepo struct {
model.PlayerRepository
Error error
Data map[string]*model.Player
APIKeys map[string]string
}
func (m *MockPlayerRepo) Get(_ context.Context, id string) (*model.Player, error) {
if m.Error != nil {
return nil, m.Error
}
p, ok := m.Data[id]
if !ok {
return nil, model.ErrNotFound
}
cp := *p
cp.HasAPIKey = slices.Contains(slices.Collect(maps.Values(m.APIKeys)), id)
return &cp, nil
}
func (m *MockPlayerRepo) Put(_ context.Context, p *model.Player) error {
if m.Error != nil {
return m.Error
}
if p.ID == "" {
p.ID = id.NewRandom()
}
cp := *p
m.Data[p.ID] = &cp
return nil
}
func (m *MockPlayerRepo) FindByAPIKey(ctx context.Context, key string) (*model.Player, error) {
if m.Error != nil {
return nil, m.Error
}
if playerID, ok := m.APIKeys[key]; ok {
return m.Get(ctx, playerID)
}
return nil, model.ErrNotFound
}
func (m *MockPlayerRepo) SetAPIKey(_ context.Context, playerID, key string) error {
if m.Error != nil {
return m.Error
}
if _, ok := m.Data[playerID]; !ok {
return model.ErrNotFound
}
m.removeKeys(playerID)
if key != "" {
m.APIKeys[key] = playerID
}
return nil
}
func (m *MockPlayerRepo) removeKeys(playerID string) {
maps.DeleteFunc(m.APIKeys, func(_ string, v string) bool { return v == playerID })
}