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

package mocks

import (
	context "context"

	appsv1 "k8s.io/api/apps/v1"

	corev1 "k8s.io/api/core/v1"

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

	testing "testing"

	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

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

// DeletePod provides a mock function with given fields: ctx, namespace, name, opts
func (_m *Client) DeletePod(ctx context.Context, namespace string, name string, opts v1.DeleteOptions) error {
	ret := _m.Called(ctx, namespace, name, opts)

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, string, string, v1.DeleteOptions) error); ok {
		r0 = rf(ctx, namespace, name, opts)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// GetStatefulSet provides a mock function with given fields: ctx, namespace, name, opts
func (_m *Client) GetStatefulSet(ctx context.Context, namespace string, name string, opts v1.GetOptions) (*appsv1.StatefulSet, error) {
	ret := _m.Called(ctx, namespace, name, opts)

	var r0 *appsv1.StatefulSet
	if rf, ok := ret.Get(0).(func(context.Context, string, string, v1.GetOptions) *appsv1.StatefulSet); ok {
		r0 = rf(ctx, namespace, name, opts)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*appsv1.StatefulSet)
		}
	}

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

	return r0, r1
}

// ListNamespaces provides a mock function with given fields: ctx, opts
func (_m *Client) ListNamespaces(ctx context.Context, opts v1.ListOptions) ([]corev1.Namespace, error) {
	ret := _m.Called(ctx, opts)

	var r0 []corev1.Namespace
	if rf, ok := ret.Get(0).(func(context.Context, v1.ListOptions) []corev1.Namespace); ok {
		r0 = rf(ctx, opts)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]corev1.Namespace)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(context.Context, v1.ListOptions) error); ok {
		r1 = rf(ctx, opts)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListPods provides a mock function with given fields: ctx, namespace, opts
func (_m *Client) ListPods(ctx context.Context, namespace string, opts v1.ListOptions) ([]corev1.Pod, error) {
	ret := _m.Called(ctx, namespace, opts)

	var r0 []corev1.Pod
	if rf, ok := ret.Get(0).(func(context.Context, string, v1.ListOptions) []corev1.Pod); ok {
		r0 = rf(ctx, namespace, opts)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]corev1.Pod)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(context.Context, string, v1.ListOptions) error); ok {
		r1 = rf(ctx, namespace, opts)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListStatefulSets provides a mock function with given fields: ctx, namespace, opts
func (_m *Client) ListStatefulSets(ctx context.Context, namespace string, opts v1.ListOptions) ([]appsv1.StatefulSet, error) {
	ret := _m.Called(ctx, namespace, opts)

	var r0 []appsv1.StatefulSet
	if rf, ok := ret.Get(0).(func(context.Context, string, v1.ListOptions) []appsv1.StatefulSet); ok {
		r0 = rf(ctx, namespace, opts)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]appsv1.StatefulSet)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(context.Context, string, v1.ListOptions) error); ok {
		r1 = rf(ctx, namespace, opts)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

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

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

	return mock
}
