public DatabaseManager(string connectionString)
 {
     _connectionString = connectionString;
     _scriptExecutor = new SqlScriptExecutor();
     _versionTracker = new SchemaVersionsTableSqlVersionTracker();
     _scriptProvider = new EmbeddedSqlScriptProvider(
         Assembly.GetExecutingAssembly(),
         versionNumber => string.Format(
                              "PaulStovell.Database.Scripts.Sequential.Script{0}.sql",
                              versionNumber.ToString().PadLeft(4, '0')));
     _upgrader = new DatabaseUpgrader(connectionString, _scriptProvider, _versionTracker, _scriptExecutor);
 }
        public void MockUpgradeProcessTest()
        {
            using (var temporary = new TemporarySqlDatabase())
            {
                var executor = new SqlScriptExecutor();
                var versionTracker = new SchemaVersionsTableSqlVersionTracker();
                var scriptProvider = new EmbeddedSqlScriptProvider(
                    Assembly.GetExecutingAssembly(),
                    versionNumber => string.Format(
                                         "PaulStovell.Tests.Database.Management.TestScripts.Script{0}.sql",
                                         versionNumber.ToString().PadLeft(4, '0')));

                var upgrader = new DatabaseUpgrader(temporary.ConnectionString, scriptProvider, versionTracker, executor);

                var upgrade1 = upgrader.PerformUpgrade();
                Assert.AreEqual(0, upgrade1.OriginalVersion);
                Assert.AreEqual(3, upgrade1.UpgradedVersion);
                Assert.AreEqual(3, upgrade1.Scripts.Count());

                var upgrade2 = upgrader.PerformUpgrade();
                Assert.AreEqual(3, upgrade2.OriginalVersion);
                Assert.AreEqual(3, upgrade2.UpgradedVersion);
                Assert.AreEqual(0, upgrade2.Scripts.Count());

                // Script 2 creates a "Foo" table, and script 2 adds a couple of records to it. Let's
                // see if it worked. This also proves that the final script isn't called twice -
                // otherwise there would be four records rather than two.
                var fooNames = new List<string>();
                using (var connection = new SqlConnection(temporary.ConnectionString))
                {
                    using (var command = connection.CreateCommand())
                    {
                        command.CommandText = "select FooName from Foo order by FooName";
                        command.CommandType = CommandType.Text;

                        connection.Open();
                        var reader = command.ExecuteReader();
                        while (reader.Read())
                        {
                            fooNames.Add(reader[0].ToString());
                        }
                    }
                }
                Assert.AreEqual(2, fooNames.Count);
                Assert.AreEqual("Goodbye", fooNames[0]);
                Assert.AreEqual("Hello", fooNames[1]);
            }
        }