// 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"

	testing "testing"

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

// NewCapacityClient creates a new instance of CapacityClient. It also registers a cleanup function to assert the mocks expectations.
func NewCapacityClient(t testing.TB) *CapacityClient {
	mock := &CapacityClient{}

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

	return mock
}
