🏡 index : quine-global/quintodrome.git

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{}}
}

// MockPlayerRepo keeps API keys in plaintext (key -> player ID); hashing belongs to the real repository.
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 })
}