// Code generated by mockery v2.4.0. DO NOT EDIT.

package mocks

import (
	context "context"

	baseline "go.skia.org/infra/golden/go/baseline"

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

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

// FetchBaseline provides a mock function with given fields: ctx, clID, crs, issueOnly
func (_m *BaselineFetcher) FetchBaseline(ctx context.Context, clID string, crs string, issueOnly bool) (*baseline.Baseline, error) {
	ret := _m.Called(ctx, clID, crs, issueOnly)

	var r0 *baseline.Baseline
	if rf, ok := ret.Get(0).(func(context.Context, string, string, bool) *baseline.Baseline); ok {
		r0 = rf(ctx, clID, crs, issueOnly)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*baseline.Baseline)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(context.Context, string, string, bool) error); ok {
		r1 = rf(ctx, clID, crs, issueOnly)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}
