🏡 index : quine-global/quintodrome.git

package tests

import (
	"context"

	"github.com/navidrome/navidrome/model"
	"github.com/navidrome/navidrome/utils/slice"
)

type MockPlaylistTrackRepo struct {
	model.PlaylistTrackRepository
	Data       model.PlaylistTracks
	Options    model.QueryOptions
	AddedIds   []string
	DeletedIds []string
	Reordered  bool
	AddCount   int
	InsertPos  int
	Err        error
	AlbumIDs   []string // stubbed result for GetAlbumIDs, ignoring options
}

func (m *MockPlaylistTrackRepo) SetData(tracks model.PlaylistTracks) {
	m.Data = tracks
}

// page applies Max/Offset as the real repository's SQL would.
func (m *MockPlaylistTrackRepo) page(options ...model.QueryOptions) model.PlaylistTracks {
	var opts model.QueryOptions
	if len(options) > 0 {
		opts = options[0]
		m.Options = opts
	}
	tracks := m.Data
	if opts.Offset >= len(tracks) {
		return nil
	}
	tracks = tracks[opts.Offset:]
	if opts.Max > 0 && opts.Max < len(tracks) {
		tracks = tracks[:opts.Max]
	}
	return tracks
}

func (m *MockPlaylistTrackRepo) CountAll(_ context.Context, _ ...model.QueryOptions) (int64, error) {
	if m.Err != nil {
		return 0, m.Err
	}
	return int64(len(m.Data)), nil
}

func (m *MockPlaylistTrackRepo) GetAll(_ context.Context, options ...model.QueryOptions) (model.PlaylistTracks, error) {
	if m.Err != nil {
		return nil, m.Err
	}
	return m.page(options...), nil
}

func (m *MockPlaylistTrackRepo) GetCursor(_ context.Context, options ...model.QueryOptions) (model.PlaylistTrackCursor, error) {
	if m.Err != nil {
		return nil, m.Err
	}
	tracks := m.page(options...)
	return func(yield func(model.PlaylistTrack, error) bool) {
		for _, t := range tracks {
			if !yield(t, nil) {
				return
			}
		}
	}, nil
}

func (m *MockPlaylistTrackRepo) GetAlbumIDs(context.Context, ...model.QueryOptions) ([]string, error) {
	if m.Err != nil {
		return nil, m.Err
	}
	return m.AlbumIDs, nil
}

func (m *MockPlaylistTrackRepo) GetMediaFileIDs(_ context.Context, options ...model.QueryOptions) ([]string, error) {
	if m.Err != nil {
		return nil, m.Err
	}
	return slice.Map(m.page(options...), func(t model.PlaylistTrack) string { return t.MediaFileID }), nil
}

func (m *MockPlaylistTrackRepo) Add(_ context.Context, ids []string) (int, error) {
	m.AddedIds = append(m.AddedIds, ids...)
	if m.Err != nil {
		return 0, m.Err
	}
	return m.AddCount, nil
}

func (m *MockPlaylistTrackRepo) Insert(ctx context.Context, ids []string, pos int) (int, error) {
	m.InsertPos = pos
	return m.Add(ctx, ids)
}

func (m *MockPlaylistTrackRepo) AddAlbums(_ context.Context, _ []string) (int, error) {
	if m.Err != nil {
		return 0, m.Err
	}
	return m.AddCount, nil
}

func (m *MockPlaylistTrackRepo) AddArtists(_ context.Context, _ []string) (int, error) {
	if m.Err != nil {
		return 0, m.Err
	}
	return m.AddCount, nil
}

func (m *MockPlaylistTrackRepo) AddDiscs(_ context.Context, _ []model.DiscID) (int, error) {
	if m.Err != nil {
		return 0, m.Err
	}
	return m.AddCount, nil
}

func (m *MockPlaylistTrackRepo) Delete(_ context.Context, ids ...string) error {
	m.DeletedIds = append(m.DeletedIds, ids...)
	return m.Err
}

func (m *MockPlaylistTrackRepo) Reorder(_ context.Context, _, _ int) error {
	m.Reordered = true
	return m.Err
}

var _ model.PlaylistTrackRepository = (*MockPlaylistTrackRepo)(nil)