// Code generated by mockery v2.4.0. 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()

	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)

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