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

package mocks

import (
	context "context"

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

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

// GetTryJob provides a mock function with given fields: ctx, id
func (_m *Client) GetTryJob(ctx context.Context, id string) (continuous_integration.TryJob, error) {
	ret := _m.Called(ctx, id)

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

	var r0 continuous_integration.TryJob
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, string) (continuous_integration.TryJob, error)); ok {
		return rf(ctx, id)
	}
	if rf, ok := ret.Get(0).(func(context.Context, string) continuous_integration.TryJob); ok {
		r0 = rf(ctx, id)
	} else {
		r0 = ret.Get(0).(continuous_integration.TryJob)
	}

	if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
		r1 = rf(ctx, id)
	} 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
}
