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

package mocks

import (
	context "context"

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

	testing "testing"

	time "time"
)

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

// SetIngested provides a mock function with given fields: ctx, fileName, ts
func (_m *Store) SetIngested(ctx context.Context, fileName string, ts time.Time) error {
	ret := _m.Called(ctx, fileName, ts)

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, string, time.Time) error); ok {
		r0 = rf(ctx, fileName, ts)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// WasIngested provides a mock function with given fields: ctx, fileName
func (_m *Store) WasIngested(ctx context.Context, fileName string) (bool, error) {
	ret := _m.Called(ctx, fileName)

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

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

	return r0, r1
}

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

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

	return mock
}
