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

package mocks

import (
	http "net/http"

	io "io"

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

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

// Get provides a mock function with given fields: url
func (_m *HTTPClient) Get(url string) (*http.Response, error) {
	ret := _m.Called(url)

	var r0 *http.Response
	if rf, ok := ret.Get(0).(func(string) *http.Response); ok {
		r0 = rf(url)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*http.Response)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(url)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// Post provides a mock function with given fields: url, contentType, body
func (_m *HTTPClient) Post(url string, contentType string, body io.Reader) (*http.Response, error) {
	ret := _m.Called(url, contentType, body)

	var r0 *http.Response
	if rf, ok := ret.Get(0).(func(string, string, io.Reader) *http.Response); ok {
		r0 = rf(url, contentType, body)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*http.Response)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string, string, io.Reader) error); ok {
		r1 = rf(url, contentType, body)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}
