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

package mocks

import (
	context "context"

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

	secretmanagerpb "cloud.google.com/go/secretmanager/apiv1/secretmanagerpb"
)

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

// Close provides a mock function with no fields
func (_m *Client) Close() error {
	ret := _m.Called()

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

	var r0 error
	if rf, ok := ret.Get(0).(func() error); ok {
		r0 = rf()
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// Describe provides a mock function with given fields: ctx, project, name
func (_m *Client) Describe(ctx context.Context, project string, name string) (*secretmanagerpb.Secret, error) {
	ret := _m.Called(ctx, project, name)

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

	var r0 *secretmanagerpb.Secret
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, string, string) (*secretmanagerpb.Secret, error)); ok {
		return rf(ctx, project, name)
	}
	if rf, ok := ret.Get(0).(func(context.Context, string, string) *secretmanagerpb.Secret); ok {
		r0 = rf(ctx, project, name)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*secretmanagerpb.Secret)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok {
		r1 = rf(ctx, project, name)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// Get provides a mock function with given fields: ctx, project, _a2, version
func (_m *Client) Get(ctx context.Context, project string, _a2 string, version string) (string, error) {
	ret := _m.Called(ctx, project, _a2, version)

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

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

	if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok {
		r1 = rf(ctx, project, _a2, version)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// Update provides a mock function with given fields: ctx, project, name, value
func (_m *Client) Update(ctx context.Context, project string, name string, value string) (string, error) {
	ret := _m.Called(ctx, project, name, value)

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

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

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