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

package mocks

import (
	context "context"

	mock "github.com/stretchr/testify/mock"
	email "go.skia.org/infra/go/email"
)

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

// SendMail provides a mock function with given fields: ctx, in
func (_m *Client) SendMail(ctx context.Context, in *email.SendMailRequest) (*email.SendMailResponse, error) {
	ret := _m.Called(ctx, in)

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

	var r0 *email.SendMailResponse
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, *email.SendMailRequest) (*email.SendMailResponse, error)); ok {
		return rf(ctx, in)
	}
	if rf, ok := ret.Get(0).(func(context.Context, *email.SendMailRequest) *email.SendMailResponse); ok {
		r0 = rf(ctx, in)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*email.SendMailResponse)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, *email.SendMailRequest) error); ok {
		r1 = rf(ctx, in)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

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

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

	return mock
}
