using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using DatabaseUnitTesting.Utilities;
using DatabaseUnitTesting.Utilities.Results;
namespace DatabaseUnitTesting
{
public class DatabaseModificationTester : IDisposable
{
private readonly DatabaseComparer _dataComparer;
private SqlTransaction _transaction;
private SqlConnection _connection;
private readonly string _snapshotName;
private readonly DatabaseAdapter _databaseAdapter;
private bool _activeSnapshot = false;
///
/// Used to establish the objects required to create a unit test running compares between a stored XML database file and an SQL transaction.
///
///
///
///
public DatabaseModificationTester(SqlConnection connection, string databaseName, string snapshotName)
{
_connection = connection;
_snapshotName = snapshotName;
_dataComparer = new DatabaseComparer(connection, databaseName, snapshotName);
_databaseAdapter = new DatabaseAdapter(connection);
_databaseAdapter.CreateSnapshot(databaseName, snapshotName);
_activeSnapshot = true;
}
///
/// establishes the command transaction to be compared and rolled back on end
///
///
public SqlTransaction BeginTestTransaction()
{
if (_transaction != null)
EndTestTransaction();
return (_transaction = _connection.BeginTransaction());
}
///
/// Once the compare is complete this method cleans up, rollsback, and disposes the transaction
///
public void EndTestTransaction()
{
if (_transaction == null)
throw new InvalidOperationException("Transaction does not exist");
_dataComparer.CleanUp();
_transaction.Rollback();
_transaction.Dispose();
_transaction = null;
}
///
/// Method to write XML file to use during unit testing. Writes differences between current database and the completed transaction.
/// The file generated here should be manually verified
///
///
public void WriteDiffsToXml(string filename)
{
XmlFileAdapter.Write(filename, _dataComparer.GenerateDifferences(_transaction));
}
///
/// Return true/false based on compare of transaction and stored XML expected test results.
///
///
///
public bool CompareDiffsToXml(string filename)
{
return XmlFileAdapter.Read(filename).Equals(_dataComparer.GenerateDifferences(_transaction));
}
public bool AreEqual()
{
return _dataComparer.GenerateDifferences(_transaction).TableCount == 0;
}
///
/// Enables test to ignore defined columns in database tables
///
///
///
///
public void AddColumnToIgnore(string schemaName, string objectName, string columnName)
{
_dataComparer.AddColumnToIgnore(schemaName, objectName, columnName);
}
///
/// Enables test to ignore defined columns in database tables
///
///
///
///
public void AddColumnsToIgnore(string schema1, string name1, List columnNames)
{
_dataComparer.AddColumnsToIgnore(schema1, name1, columnNames);
}
public void AddObjectComparison(string schemaName, string tableName)
{
_dataComparer.AddObjectComparison(schemaName, tableName, schemaName, tableName);
}
public void Dispose()
{
if (_activeSnapshot)
{
_activeSnapshot = false;
_databaseAdapter.DropSnapshot(_snapshotName);
}
}
}
}