// Code generated by mockery v1.0.0. DO NOT EDIT.

package mocks

import (
	context "context"

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

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

// UploadBytes provides a mock function with given fields: ctx, data, fallbackSrc, dst
func (_m *GCSUploader) UploadBytes(ctx context.Context, data []byte, fallbackSrc string, dst string) error {
	ret := _m.Called(ctx, data, fallbackSrc, dst)

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, []byte, string, string) error); ok {
		r0 = rf(ctx, data, fallbackSrc, dst)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// UploadJSON provides a mock function with given fields: ctx, data, tempFileName, gcsObjectPath
func (_m *GCSUploader) UploadJSON(ctx context.Context, data interface{}, tempFileName string, gcsObjectPath string) error {
	ret := _m.Called(ctx, data, tempFileName, gcsObjectPath)

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, interface{}, string, string) error); ok {
		r0 = rf(ctx, data, tempFileName, gcsObjectPath)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}
