public void CorrectlyExecutesScriptIfItHasntAlreadyBeenExecuted()
{
ConnectionSettings settings = getConnectionSettings();
string scriptFile = @"c:\scripts\Update\01_Test.sql";
string fileContents = "file contents...";
MockRepository mocks = new MockRepository();
IScriptExecutionTracker executionTracker = mocks.StrictMock<IScriptExecutionTracker>();
IFileSystem fileSystem = mocks.StrictMock<IFileSystem>();
IQueryExecutor queryExecutor = mocks.StrictMock<IQueryExecutor>();
ITaskObserver taskObserver = mocks.StrictMock<ITaskObserver>();
Expect.Call(executionTracker.ScriptAlreadyExecuted(settings, "01_Test.sql")).Return(false);
taskObserver.Log("Executing: 01_Test.sql in a transaction");
Expect.Call(fileSystem.ReadTextFile(scriptFile)).Return(fileContents);
Expect.Call(queryExecutor.ScriptSupportsTransactions(fileContents)).Return(true);
queryExecutor.ExecuteNonQueryTransactional(settings, fileContents);
executionTracker.MarkScriptAsExecuted(settings, "01_Test.sql", taskObserver);
mocks.ReplayAll();
IChangeScriptExecutor executor = new ChangeScriptExecutor(executionTracker, queryExecutor, fileSystem);
executor.Execute(scriptFile, settings, taskObserver);
mocks.VerifyAll();
}