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

package mocks

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

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

// Emails provides a mock function with given fields:
func (_m *Allow) Emails() []string {
	ret := _m.Called()

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

	var r0 []string
	if rf, ok := ret.Get(0).(func() []string); ok {
		r0 = rf()
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]string)
		}
	}

	return r0
}

// Member provides a mock function with given fields: email
func (_m *Allow) Member(email string) bool {
	ret := _m.Called(email)

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

	var r0 bool
	if rf, ok := ret.Get(0).(func(string) bool); ok {
		r0 = rf(email)
	} else {
		r0 = ret.Get(0).(bool)
	}

	return r0
}

// NewAllow creates a new instance of Allow. 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 NewAllow(t interface {
	mock.TestingT
	Cleanup(func())
}) *Allow {
	mock := &Allow{}
	mock.Mock.Test(t)

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

	return mock
}
