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

package mocks

import (
	context "context"

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

	testing "testing"
)

// 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
}

// NewGCSUploader creates a new instance of GCSUploader. It also registers a cleanup function to assert the mocks expectations.
func NewGCSUploader(t testing.TB) *GCSUploader {
	mock := &GCSUploader{}

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

	return mock
}
