using System;
using System.Linq.Expressions;
using Microsoft.Extensions.Logging;
using Moq;
using Moq.Language.Flow;

namespace YourProject.Unit.Tests
{
    internal static class MockHelper
    {
        // from https://stackoverflow.com/questions/43424095/how-to-unit-test-with-ilogger-in-asp-net-core/56728528#56728528
        // removed type params for logger to match our usage
        public static ISetup<ILogger> MockLog(this Mock<ILogger> logger, LogLevel level)
        {
            return logger.Setup(x => x.Log(level, It.IsAny<EventId>(), It.IsAny<object>(), It.IsAny<Exception>(), It.IsAny<Func<object, Exception, string>>()));
        }

        private static Expression<Action<ILogger>> Verify(LogLevel level)
        {
            return x => x.Log(level, 0, It.IsAny<object>(), It.IsAny<Exception>(), It.IsAny<Func<object, Exception, string>>());
        }

        public static void Verify(this Mock<ILogger> mock, LogLevel level, Times times)
        {
            mock.Verify(Verify(level), times);
        }
    }
}