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

package mocks

import (
	context "context"
	url "net/url"

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

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

// SendGetRequest provides a mock function with given fields: ctx, apiName, functionName, queryParams, response
func (_m *ChromePerfClient) SendGetRequest(ctx context.Context, apiName string, functionName string, queryParams url.Values, response interface{}) error {
	ret := _m.Called(ctx, apiName, functionName, queryParams, response)

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

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, string, string, url.Values, interface{}) error); ok {
		r0 = rf(ctx, apiName, functionName, queryParams, response)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// SendPostRequest provides a mock function with given fields: ctx, apiName, functionName, requestObj, responseObj, acceptedStatusCodes
func (_m *ChromePerfClient) SendPostRequest(ctx context.Context, apiName string, functionName string, requestObj interface{}, responseObj interface{}, acceptedStatusCodes []int) error {
	ret := _m.Called(ctx, apiName, functionName, requestObj, responseObj, acceptedStatusCodes)

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

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, string, string, interface{}, interface{}, []int) error); ok {
		r0 = rf(ctx, apiName, functionName, requestObj, responseObj, acceptedStatusCodes)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

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

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

	return mock
}
