Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.
package tests
import (
"errors"
"time"
"github.com/deluan/rest"
"github.com/navidrome/navidrome/model"
)
func CreateMockPluginRepo() *MockPluginRepo {
return &MockPluginRepo{
Data: make(map[string]*model.Plugin),
IsAdmin: true, // Default to admin access
Permitted: true,
}
type MockPluginRepo struct {
Data map[string]*model.Plugin
All model.Plugins
Err bool
Options model.QueryOptions
IsAdmin bool
Permitted bool
func (m *MockPluginRepo) SetError(err bool) {
m.Err = err
func (m *MockPluginRepo) ClearErrors() error {
if m.Err {
return errors.New("unexpected error")
for i := range m.All {
m.All[i].LastError = ""
for k, p := range m.Data {
p.LastError = ""
m.Data[k] = p
return nil
func (m *MockPluginRepo) SetData(plugins model.Plugins) {
m.Data = make(map[string]*model.Plugin, len(plugins))
m.All = plugins
for i, p := range m.All {
m.Data[p.ID] = &m.All[i]
func (m *MockPluginRepo) SetPermitted(permitted bool) {
m.Permitted = permitted
func (m *MockPluginRepo) Get(id string) (*model.Plugin, error) {
if !m.Permitted {
return nil, rest.ErrPermissionDenied
return nil, errors.New("unexpected error")
if d, ok := m.Data[id]; ok {
return d, nil
return nil, model.ErrNotFound
func (m *MockPluginRepo) Read(id string) (any, error) {
p, err := m.Get(id)
if errors.Is(err, model.ErrNotFound) {
return nil, rest.ErrNotFound
return p, err
func (m *MockPluginRepo) Put(p *model.Plugin) error {
return rest.ErrPermissionDenied
if p.ID == "" {
return errors.New("plugin ID cannot be empty")
now := time.Now()
if existing, ok := m.Data[p.ID]; ok {
p.CreatedAt = existing.CreatedAt
} else {
p.CreatedAt = now
p.UpdatedAt = now
m.Data[p.ID] = p
// Update All slice
found := false
for i, existing := range m.All {
if existing.ID == p.ID {
m.All[i] = *p
found = true
break
if !found {
m.All = append(m.All, *p)
func (m *MockPluginRepo) Delete(id string) error {
delete(m.Data, id)
if p.ID == id {
m.All = append(m.All[:i], m.All[i+1:]...)
func (m *MockPluginRepo) GetAll(qo ...model.QueryOptions) (model.Plugins, error) {
if len(qo) > 0 {
m.Options = qo[0]
return m.All, nil
func (m *MockPluginRepo) CountAll(qo ...model.QueryOptions) (int64, error) {
return 0, rest.ErrPermissionDenied
return 0, errors.New("unexpected error")
return int64(len(m.All)), nil
// rest.Repository interface methods
func (m *MockPluginRepo) Count(options ...rest.QueryOptions) (int64, error) {
func (m *MockPluginRepo) EntityName() string {
return "plugin"
func (m *MockPluginRepo) NewInstance() any {
return &model.Plugin{}
func (m *MockPluginRepo) ReadAll(options ...rest.QueryOptions) (any, error) {
return m.GetAll()
func (m *MockPluginRepo) Save(entity any) (string, error) {
p := entity.(*model.Plugin)
err := m.Put(p)
return p.ID, err
func (m *MockPluginRepo) Update(id string, entity any, cols ...string) error {
p.ID = id
return m.Put(p)
var _ model.PluginRepository = (*MockPluginRepo)(nil)