public void GivenAMigrationHasAlreadyRun_WhenRunDeploymentScript_NoDatabaseInteractionIsInvoked()
        {
            var script = new DeploymentScript("Test", "Script");

            var mockDb = new Mock <IDatabase>();

            mockDb.Setup(x => x.Exists <MigrationHistory>(It.IsAny <string>())).Returns(true);

            var mockConfig = new Mock <INPocoLocoConfig>();

            var deployment = new DatabaseDeployment(mockDb.Object, mockConfig.Object);

            deployment.RunDeploymentScript(script);

            mockDb.Verify(x => x.BeginTransaction(), Times.Never);
        }
        public void GivenRunDeploymentScriptFails_ExceptionShouldBeCaught()
        {
            var script = new DeploymentScript("Test", "Script");

            var mockDb = new Mock <IDatabase>();

            mockDb.Setup(x => x.Exists <MigrationHistory>(It.IsAny <string>())).Returns(false);
            mockDb.Setup(x => x.Insert(It.IsAny <MigrationHistory>())).Throws <Exception>();

            var mockConfig = new Mock <INPocoLocoConfig>();

            var deployment = new DatabaseDeployment(mockDb.Object, mockConfig.Object);

            Action action = () => deployment.RunDeploymentScript(script);

            action.ShouldThrow <Exception>();
        }
        public void GivenRunningDeploymentScriptFails_TransactionIsAborted()
        {
            var script = new DeploymentScript("Test", "Script");

            var mockDb = new Mock <IDatabase>();

            mockDb.Setup(x => x.Exists <MigrationHistory>(It.IsAny <string>())).Returns(false);
            mockDb.Setup(x => x.Insert(It.IsAny <MigrationHistory>())).Throws <Exception>();
            mockDb.Setup(x => x.AbortTransaction()).Verifiable();

            var mockConfig = new Mock <INPocoLocoConfig>();

            var deployment = new DatabaseDeployment(mockDb.Object, mockConfig.Object);

            Action action = () => deployment.RunDeploymentScript(script);

            action.ShouldThrow <Exception>();

            mockDb.Verify(x => x.AbortTransaction(), Times.Once);
        }