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

package mocks

import (
	context "context"

	capacity "go.skia.org/infra/status/go/capacity"

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

	time "time"
)

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

// CapacityMetrics provides a mock function with given fields:
func (_m *CapacityClient) CapacityMetrics() map[string]capacity.BotConfig {
	ret := _m.Called()

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

	var r0 map[string]capacity.BotConfig
	if rf, ok := ret.Get(0).(func() map[string]capacity.BotConfig); ok {
		r0 = rf()
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(map[string]capacity.BotConfig)
		}
	}

	return r0
}

// QueryAll provides a mock function with given fields: ctx
func (_m *CapacityClient) QueryAll(ctx context.Context) error {
	ret := _m.Called(ctx)

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

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context) error); ok {
		r0 = rf(ctx)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// StartLoading provides a mock function with given fields: ctx, interval
func (_m *CapacityClient) StartLoading(ctx context.Context, interval time.Duration) {
	_m.Called(ctx, interval)
}

// NewCapacityClient creates a new instance of CapacityClient. 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 NewCapacityClient(t interface {
	mock.TestingT
	Cleanup(func())
}) *CapacityClient {
	mock := &CapacityClient{}
	mock.Mock.Test(t)

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

	return mock
}
