예제 #1
0
        private DbTestSqlResult ExecuteAct(IDbTestRunnerContext context, DbTestRunnerResult result, IDisposable dbHandle)
        {
            var request = OnAct(context, dbHandle, this.TestOutputHelper);

            result.TestPhase = "ACT";
            return(ExecuteTestPhase(result, "ACT", request));
        }
예제 #2
0
        /// <summary>
        /// public method for running this test
        /// </summary>
        protected DbTestRunnerResult ExecuteArrangeActAssert()
        {
            var context = this.TestFixture.Context;
            var result  = new DbTestRunnerResult {
                TestName = this.Name
            };
            TransactionScope transactionScope = null;

            try
            {
                using (transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    try
                    {
                        using (var handle = ProduceDbHandle())
                        {
                            this.handleInstance = handle;
                            var arrangeResult = ExecuteArrange(context, result, handle);
                            if (arrangeResult.IsSuccessful)
                            {
                                var actResult = ExecuteAct(context, result, handle);

                                if (actResult.IsSuccessful)
                                {
                                    ExecuteAssert(context, result, actResult.Data, handle);
                                }
                            }

                            this.handleInstance = null;
                        }
                    }
                    finally
                    {
                        this.handleInstance = null;
                        if (context.CommitTransactionScope)
                        {
                            transactionScope.Complete();
                        }
                    }
                }
            }
            // catch and re-throw assertions
            catch (XunitException)
            {
                throw;
            }
            catch (Exception e)
            {
                result = DbTestRunnerResult.Failure("Error running DbTest", e);
            }
            finally
            {
                transactionScope?.Dispose();
            }

            DumpRunLog(result);

            return(result);
        }
예제 #3
0
        public static DbTestRunnerResult Failure(string message, Exception e = null)
        {
            var result = new DbTestRunnerResult
            {
                Exception    = e,
                IsSuccessful = false
            };

            result.Logs.Add($"Error - {message}");
            return(result);
        }
예제 #4
0
        /// <summary>
        /// used when the CommandType is TableDirect.
        /// </summary>
        private DbTestSqlResult ExecuteSqlTableDirectRequest(SqlRequest request, DbTestRunnerResult result, string phaseName)
        {
            var sqlResult = new DbTestSqlResult();

            try
            {
                // Create a new command using the same connection as the data context
                using (var cmd = this.GetDbConnection().CreateCommand())
                {
                    // Set the command parameters
                    foreach (var p in request.Parameters.Select(i => i.Value))
                    {
                        result.Logs.Add($"{phaseName} Sql Parameter:{p.ParameterName} = {p.Value}");
                        cmd.Parameters.Add(p);
                    }

                    if (cmd.Connection.State != ConnectionState.Open)
                    {
                        cmd.Connection.Open();
                    }

                    // build up the sql command object
                    cmd.CommandText = $"Select * From {request.SqlToExecute}";
                    result.Logs.Add($"{phaseName} Table Direct Sql: {cmd.CommandText}");
                    cmd.CommandType = CommandType.Text;



                    // Execute the command via a data reader and use it to load data tables; one for each result set returned from the sql.
                    using (var rdr = cmd.ExecuteReader())
                    {
                        do
                        {
                            var dt = new DataTable();
                            dt.Load(rdr);
                            sqlResult.Data.Add(dt);
                            result.Logs.Add($"{phaseName} Phase: DataTable[{sqlResult.Data.Count - 1}] read {dt.Rows.Count} rows(s).");
                        } while (!rdr.IsClosed && rdr.NextResult());
                    }

                    result.Logs.Add($"{phaseName} Phase: Read {sqlResult.Data.Count} result set(s).");
                }

                sqlResult.IsSuccessful = true;
            }
            catch (Exception e)
            {
                sqlResult.Exception    = e;
                sqlResult.IsSuccessful = false;
            }

            return(sqlResult);
        }
예제 #5
0
        public static DbTestRunnerResult Success(string message = null)
        {
            var result = new DbTestRunnerResult
            {
                IsSuccessful = true,
            };

            if (!string.IsNullOrEmpty(message))
            {
                result.Logs.Add(message);
            }

            return(result);
        }
예제 #6
0
        /// <summary>
        /// Used when CommandType is StoredProcedure
        /// </summary>
        private DbTestSqlResult ExecuteSqlStoredProcedureRequest(SqlRequest request, DbTestRunnerResult result, string phaseName)
        {
            var sqlResult = new DbTestSqlResult();

            try
            {
                //   var dataTable = new DataTable();
                var dataset = new DataSet();
                // Create a new command using the same connection as the data context
                using (var cmd = GetDbConnection().CreateCommand())
                {
                    if (cmd.Connection.State != ConnectionState.Open)
                    {
                        cmd.Connection.Open();
                    }

                    // build up the sql command object
                    cmd.CommandText = request.SqlToExecute;
                    cmd.CommandType = CommandType.StoredProcedure;

                    // Set the command parameters
                    foreach (var p in request.Parameters.Select(i => i.Value))
                    {
                        cmd.Parameters.Add(p);
                    }
                    result.Logs.Add($"{phaseName} Stored Procedure: {cmd.CommandText}");
                    // Execute the command via a data adapter and use it to load a data set
                    using (var dataAdapter = new SqlDataAdapter(cmd))
                    {
                        //dataAdapter.Fill(dataTable);
                        dataAdapter.Fill(dataset);
                    }
                }

                // populate the sqlResult data tables with the tables filled by the adapter
                sqlResult.Data.AddRange(dataset.Tables.Cast <DataTable>());
                //sqlResult.Data.Add(dataTable);
                sqlResult.IsSuccessful = true;
            }
            catch (Exception e)
            {
                sqlResult.Exception    = e;
                sqlResult.IsSuccessful = false;
            }

            return(sqlResult);
        }
예제 #7
0
        protected void DumpRunLog(DbTestRunnerResult result)
        {
            if (result == null)
            {
                return;
            }

            this.TestOutputHelper?.WriteLine($"[{DateTime.Now:s}]{result.TestName}");
            foreach (var msg in result.Logs)
            {
                TestOutputHelper?.WriteLine(msg);
            }

            if (result.Exception != null)
            {
                TestOutputHelper?.WriteLine(result.Exception.ToString());
            }
        }
예제 #8
0
 /// <summary>
 /// Invokes the ASSERT hook method
 /// </summary>
 // ReSharper disable once UnusedParameter.Local
 private void ExecuteAssert(IDbTestRunnerContext context, DbTestRunnerResult result, List <DataTable> data, IDisposable dbHandle)
 {
     try
     {
         result.TestPhase    = "ASSERT";
         result.IsSuccessful = true;
         result.Logs.Add("ASSERT Phase: Running test Assertions.");
         this.OnAssert(data == null || !data.Any() ? null : data[0], dbHandle, data?.ToArray(), this.TestOutputHelper);
         result.Logs.Add("ASSERT Phase: All assertions passed.");
     }
     catch (XunitException)
     {
         // we actually just want to re-throw the current exception to maintain the stack trace
         throw;
     }
     catch (Exception e)
     {
         // non-assertion exception occurred.
         result.Logs.Add($"Error asserting state of data. {e}");
         result.Exception    = e;
         result.IsSuccessful = false;
     }
 }
예제 #9
0
        /// <summary>
        /// Executes the sql requests
        /// </summary>
        protected DbTestSqlResult ExecuteTestPhase(DbTestRunnerResult result, string phaseName, SqlRequest request)
        {
            var phaseResult = new DbTestSqlResult();

            try
            {
                if (request == null)
                {
                    return(DbTestSqlResult.Success);
                }

                // if we're supposed to commit the data context changes before running the sql, do so now.
                if (request.DataContextCommitPoint == DataContextCommitPoint.BeforeRunningSql)
                {
                    var contextRowsAffected = this.CommitChanges();
                    result.Logs.Add($"{phaseName} Phase: Commited Data Context prior to executing sql.  Rows Affected: {contextRowsAffected}");
                }

                if (request.IsEmpty)
                {
                    return(DbTestSqlResult.Success);
                }


                // Run the sql, we have different execution strategies based on the command types
                switch (request.CommandType)
                {
                case CommandType.Text:
                    phaseResult = this.ExecuteSqlTextRequest(request, result, phaseName);
                    break;

                case CommandType.StoredProcedure:
                    phaseResult = this.ExecuteSqlStoredProcedureRequest(request, result, phaseName);
                    break;

                case CommandType.TableDirect:
                    phaseResult = this.ExecuteSqlTableDirectRequest(request, result, phaseName);
                    break;

                default:
                    throw new Exception("Unsupported Command Type");
                }

                // if there was a problem running the sql command, stop executing now
                if (!phaseResult.IsSuccessful)
                {
                    return(phaseResult);
                }


                // if we're supposed to commit the data context changes after running the sql, do so now.
                if (request.DataContextCommitPoint == DataContextCommitPoint.AfterRunningSql)
                {
                    var contextRowsAffected = this.CommitChanges();
                    result.Logs.Add($"{phaseName} Phase: Commited Data Context prior to executing sql.  Rows Affected: {contextRowsAffected}");
                }

                // if we got this far, the test executed successfully, set the return value
                phaseResult.IsSuccessful = true;
            }
            catch (Exception e)
            {
                // runtime exception executing the test.
                result.Exception = e;
                result.Logs.Add($"Error attempting to execute {phaseName} sql. {e.GetType().Name} - {e.Message}");
                phaseResult.IsSuccessful = false;
                throw;
            }

            // set the overall result success status based on how this command was executed
            result.IsSuccessful = phaseResult.IsSuccessful;
            result.TestPhase    = phaseName;
            return(phaseResult);
        }