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

package mocks

import (
	context "context"

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

	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
}
