public async Task ShouldFormatExceptionAsUnHandlerExceptionResult()
        {
            // Arrange
            LogSettings logSettings = new LogSettings();

            Mock <IOptionsSnapshot <LogSettings> > mockOptions = new Mock <IOptionsSnapshot <LogSettings> >();

            mockOptions.Setup(x => x.Value).Returns(logSettings);

            Mock <IRequestLogger>       mockRequestLogger = new Mock <IRequestLogger>();
            Mock <ILogger <TestQuery> > mockLogger        = new Mock <ILogger <TestQuery> >();
            Mock <IQueryHandler <TestQuery, string> > mockQueryHandler = new Mock <IQueryHandler <TestQuery, string> >();
            var query = new TestQuery();

            mockQueryHandler
            .Setup(x => x.Handle(query, It.IsAny <RequestContext>()))
            .ThrowsAsync(new Exception());

            var decorator = new LogQueryHandlerDecorator <TestQuery, string>(mockRequestLogger.Object, mockQueryHandler.Object, mockOptions.Object, mockLogger.Object);

            // Act
            var result = await decorator.Handle(query, Helper.Context);

            // Assert
            Assert.True(result.HasError);
            Assert.Equal(Constants.UnhandledException, result.Errors[0].Code);
        }
        public async Task ShouldNotLogIfQueryIsInExcludeList()
        {
            // Arrange
            LogSettings logSettings = new LogSettings
            {
                Exclude = new List <string> {
                    typeof(TestQuery).Name
                }
            };

            Mock <IOptionsSnapshot <LogSettings> > mockOptions = new Mock <IOptionsSnapshot <LogSettings> >();

            mockOptions.Setup(x => x.Value).Returns(logSettings);

            Mock <IRequestLogger>       mockRequestLogger = new Mock <IRequestLogger>();
            Mock <ILogger <TestQuery> > mockLogger        = new Mock <ILogger <TestQuery> >();
            Mock <IQueryHandler <TestQuery, string> > mockQueryHandler = new Mock <IQueryHandler <TestQuery, string> >();
            var query = new TestQuery();

            mockQueryHandler
            .Setup(x => x.Handle(query, It.IsAny <RequestContext>()))
            .ReturnsAsync(new QueryResult <string>("OK"));

            var decorator = new LogQueryHandlerDecorator <TestQuery, string>(mockRequestLogger.Object, mockQueryHandler.Object, mockOptions.Object, mockLogger.Object);

            // Act
            var result = await decorator.Handle(query, Helper.Context);

            // Assert
            mockRequestLogger.Verify(x => x.Log(It.IsAny <RequestLog>()), Times.Exactly(0));
            Assert.Equal(Messages.Success, result.Code);
        }
        public async Task ShouldLogIfSettingsIsNotProvided()
        {
            // Arrange
            LogSettings logSettings = new LogSettings();

            // Mock<LogSettings> mockOptions = new Mock<LogSettings>;
            // mockOptions.

            Mock <IRequestLogger>       mockRequestLogger = new Mock <IRequestLogger>();
            Mock <ILogger <TestQuery> > mockLogger        = new Mock <ILogger <TestQuery> >();
            Mock <IQueryHandler <TestQuery, string> > mockQueryHandler = new Mock <IQueryHandler <TestQuery, string> >();
            var query = new TestQuery();

            mockQueryHandler
            .Setup(x => x.Handle(query, It.IsAny <RequestContext>()))
            .ReturnsAsync(new QueryResult <string>("OK"));

            var decorator = new LogQueryHandlerDecorator <TestQuery, string>(mockRequestLogger.Object, mockQueryHandler.Object, logSettings, mockLogger.Object);

            // Act
            var result = await decorator.Handle(query, Helper.Context);

            // Assert
            mockRequestLogger.Verify(x => x.Log(It.IsAny <RequestLog>()), Times.Exactly(1));
            Assert.Equal(Messages.Success, result.Code);
        }