public void ExecuteReader_SimpleCommand_ResultOk_LoggedAsDebug()
        {
            var logSpy = new StringLogger();

            using var connection = new SqliteConnection(connectionString);

            connection.Open();
            var queryCommand = connection.CreateCommand();

            queryCommand.CommandText = @"
SELECT 1
UNION 
SELECT 2";

            // act
            var loggedCmd = new LoggedDbCommand(queryCommand, logSpy);

            using var reader = loggedCmd.ExecuteReader();

            Assert.True(reader.Read());
            Assert.Equal(1, reader.GetInt64(0));
            Assert.True(reader.Read());
            Assert.Equal(2, reader.GetInt64(0));
            Assert.False(reader.Read());

            Assert.Contains(queryCommand.CommandText, logSpy.Logs[LogLevel.Debug]);
        }
        public void ExecuteScalar_CommandWithParameter_ResultOk_LoggedAsDebug()
        {
            var logSpy = new StringLogger();

            using var connection = new SqliteConnection(connectionString);

            connection.Open();
            var queryCommand = connection.CreateCommand();

            queryCommand.CommandText = "SELECT @myparameter";
            var param = queryCommand.CreateParameter();

            param.SqliteType    = SqliteType.Text;
            param.ParameterName = "@myparameter";
            param.Value         = "SomeText";
            queryCommand.Parameters.Add(param);

            // act
            var loggedCmd = new LoggedDbCommand(queryCommand, logSpy);
            var result    = (string)loggedCmd.ExecuteScalar();

            var debugLogs = logSpy.Logs[LogLevel.Debug];

            Assert.Equal("SomeText", result);
            Assert.Contains(queryCommand.CommandText, debugLogs);
            Assert.Contains("myparameter", debugLogs);
            Assert.Contains("SomeText", debugLogs);
        }
        public void Ensure_Passthrough_Properties()
        {
            var innerCommand = new SqliteCommand();
            var loggedCmd    = new LoggedDbCommand(innerCommand, new StringLogger());

            loggedCmd.CommandText = "abc";
            Assert.Equal(loggedCmd.CommandText, innerCommand.CommandText);

            loggedCmd.CommandTimeout = 75;
            Assert.Equal(loggedCmd.CommandTimeout, innerCommand.CommandTimeout);

            loggedCmd.CommandType = CommandType.Text;
            Assert.Equal(loggedCmd.CommandType, innerCommand.CommandType);

            loggedCmd.UpdatedRowSource = UpdateRowSource.OutputParameters;
            Assert.Equal(loggedCmd.UpdatedRowSource, innerCommand.UpdatedRowSource);

            loggedCmd.DesignTimeVisible = !loggedCmd.DesignTimeVisible;
            Assert.Equal(loggedCmd.DesignTimeVisible, innerCommand.DesignTimeVisible);

            Assert.Equal(loggedCmd.Parameters, innerCommand.Parameters);

            using var cnx = new SqliteConnection(connectionString);
            cnx.Open();
            loggedCmd.Transaction = cnx.BeginTransaction();
            Assert.Equal(loggedCmd.Transaction, innerCommand.Transaction);
        }
        public void ExecuteScalar_SyntaxError_LoggedAsError()
        {
            var logSpy = new StringLogger();

            using var connection = new SqliteConnection(connectionString);

            connection.Open();
            var queryCommand = connection.CreateCommand();

            queryCommand.CommandText = "SELEC_error 1";

            // act
            var loggedCmd = new LoggedDbCommand(queryCommand, logSpy);

            try
            {
                var result = (long)loggedCmd.ExecuteScalar();
            }
            catch (Exception ex)
            {
                Assert.Contains("syntax error", ex.Message);
            }

            Assert.Contains(queryCommand.CommandText, logSpy.Logs[LogLevel.Debug]);
            Assert.Contains(queryCommand.CommandText, logSpy.Logs[LogLevel.Error]);
        }
        public void Ensure_Passthrough_Properties_And_Methods_Called()
        {
            var logger   = new Mock <ILogger>();
            var dbCmdSpy = new Mock <DbCommand>()
            {
                CallBase = true, DefaultValue = DefaultValue.Mock
            };

            dbCmdSpy.SetupAllProperties();
            var loggedCmd = new LoggedDbCommand(dbCmdSpy.Object, logger.Object);

            loggedCmd.Cancel();
            dbCmdSpy.Verify(p => p.Cancel(), Times.Once);

            loggedCmd.Prepare();
            dbCmdSpy.Verify(p => p.Prepare(), Times.Once);

            loggedCmd.ExecuteNonQuery();
            dbCmdSpy.Verify(p => p.ExecuteNonQuery(), Times.Once);

            loggedCmd.ExecuteScalar();
            dbCmdSpy.Verify(p => p.ExecuteScalar(), Times.Once);

            loggedCmd.CommandText = "abc";
            dbCmdSpy.VerifySet(p => p.CommandText = "abc", Times.Once);
            Assert.Equal("abc", loggedCmd.CommandText);

            loggedCmd.CommandTimeout = 75;
            dbCmdSpy.VerifySet(p => p.CommandTimeout = 75, Times.Once);
            Assert.Equal(75, loggedCmd.CommandTimeout);

            loggedCmd.CommandType = CommandType.TableDirect;
            dbCmdSpy.VerifySet(p => p.CommandType = CommandType.TableDirect, Times.Once);
            Assert.Equal(CommandType.TableDirect, loggedCmd.CommandType);

            loggedCmd.UpdatedRowSource = UpdateRowSource.OutputParameters;
            dbCmdSpy.VerifySet(p => p.UpdatedRowSource = UpdateRowSource.OutputParameters, Times.Once);
            Assert.Equal(UpdateRowSource.OutputParameters, loggedCmd.UpdatedRowSource);

            loggedCmd.DesignTimeVisible = true;
            dbCmdSpy.VerifySet(p => p.DesignTimeVisible = true, Times.Once);
            Assert.True(loggedCmd.DesignTimeVisible);

            var protectedMock = dbCmdSpy.Protected().As <DbCommandProtectedMembers>();

            var expectedDbParam = new Mock <DbParameter>().Object;

            protectedMock.Setup(p => p.CreateDbParameter()).Returns(expectedDbParam);
            var resultedDbParam = loggedCmd.CreateParameter();

            Assert.Equal(expectedDbParam, resultedDbParam);
            protectedMock.Verify(p => p.CreateDbParameter(), Times.Once());
        }
        public void ExecuteNonQuery_SimpleCommand_ResultOk_LoggedAsDebug()
        {
            var logSpy = new StringLogger();

            using var connection = new SqliteConnection(connectionString);
            connection.Open();
            var queryCommand = connection.CreateCommand();

            queryCommand.CommandText = "DROP TABLE IF EXISTS People";

            // act
            var loggedCmd = new LoggedDbCommand(queryCommand, logSpy);

            loggedCmd.ExecuteNonQuery();

            Assert.Contains(queryCommand.CommandText, logSpy.Logs[LogLevel.Debug]);
        }
        public void ExecuteScalar_SimpleCommand_ResultOk_LoggedAsDebug()
        {
            var logSpy = new StringLogger();

            using var connection = new SqliteConnection(connectionString);

            connection.Open();
            var queryCommand = connection.CreateCommand();

            queryCommand.CommandText = "SELECT 1";

            // act
            var loggedCmd = new LoggedDbCommand(queryCommand, logSpy);
            var result    = (long)loggedCmd.ExecuteScalar();

            Assert.Equal(1, result);
            Assert.Contains(queryCommand.CommandText, logSpy.Logs[LogLevel.Debug]);
        }