// Code generated by mockery v0.0.0-dev. DO NOT EDIT.

package mocks

import (
	config "go.chromium.org/luci/common/api/luci_config/config/v1"

	mock "github.com/stretchr/testify/mock"
)

// ApiClient is an autogenerated mock type for the ApiClient type
type ApiClient struct {
	mock.Mock
}

// GetProjectConfigs provides a mock function with given fields: path
func (_m *ApiClient) GetProjectConfigs(path string) ([]*config.LuciConfigGetConfigMultiResponseMessageConfigEntry, error) {
	ret := _m.Called(path)

	if len(ret) == 0 {
		panic("no return value specified for GetProjectConfigs")
	}

	var r0 []*config.LuciConfigGetConfigMultiResponseMessageConfigEntry
	var r1 error
	if rf, ok := ret.Get(0).(func(string) ([]*config.LuciConfigGetConfigMultiResponseMessageConfigEntry, error)); ok {
		return rf(path)
	}
	if rf, ok := ret.Get(0).(func(string) []*config.LuciConfigGetConfigMultiResponseMessageConfigEntry); ok {
		r0 = rf(path)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*config.LuciConfigGetConfigMultiResponseMessageConfigEntry)
		}
	}

	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(path)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// NewApiClient creates a new instance of ApiClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewApiClient(t interface {
	mock.TestingT
	Cleanup(func())
}) *ApiClient {
	mock := &ApiClient{}
	mock.Mock.Test(t)

	t.Cleanup(func() { mock.AssertExpectations(t) })

	return mock
}
