public void EnsureBaseline_ShouldCallCreateJournalAndSetBaseline()
        {
            var journal = new Mock <IJournal>();

            journal.Setup(j => j.GetDeployedMigrations()).Returns(new List <DeployedMigration>());

            var availableMigrations = new[]
            {
                _offlineMigration,
                _onlineMigration,
                new Migration(3, "SomeMigration", "0987654321", false, pr => { }),
                new Migration(4, "Later Migration", "111111111111111", false, pr => { }),
            };
            var migrationsProvider = new FakeMigrationsProvider().WithMigrations(availableMigrations);

            var subject = new Migrator(journal.Object, migrationsProvider, Mock.Of <IProgressReporter>());

            subject.EnsureBaseline("SomeMigration");

            journal.Verify(j => j.CreateJournal(),
                           Times.Once);

            journal.Verify(
                j => j.SetBaseline(It.Is <IEnumerable <Migration> >(actual => actual.SequenceEqual(availableMigrations.Take(3)))),
                Times.Once,
                "the first three migrations should have been sent to the journal"
                );
        }
        public void Plan_ShouldReturnAnError_WhenTheLastDeployedMigrationIsAnIncompleteOfflineMigration()
        {
            var mockProvider = new FakeMigrationsProvider().WithMigrations(new[] { _offlineMigration });
            var journal      = new FakeJournal().Created().WithMigrations(new[] { _offlineMigration.AsDeployedMigration(false) });

            // even if we tell it to include online migrations during an offline migration.
            var subject = new Migrator(journal, mockProvider, Mock.Of <IProgressReporter>(), true);

            var planResult = subject.Plan();

            Assert.That(planResult.OfflineErrorMessage, Is.Not.Null.And.Contains("incomplete prior offline migration."));
            Assert.That(planResult.OnlineErrorMessage, Is.EqualTo(planResult.OfflineErrorMessage));
        }
        public void Plan_ShouldNotReturnAnyError_WhenTheLastDeployedMigrationIsAnIncompleteOnlineMigration_AndThereAreNoOfflineMigrationsToRun()
        {
            var mockProvider = new FakeMigrationsProvider().WithMigrations(new [] { _onlineMigration });
            var journal      = new FakeJournal().Created().WithMigrations(new [] { _onlineMigration.AsDeployedMigration(false) });

            var subject = new Migrator(journal, mockProvider, Mock.Of <IProgressReporter>());

            var planResult = subject.Plan();

            Assert.That(planResult.OnlineErrorMessage, Is.Null);
            Assert.That(planResult.OfflineErrorMessage, Is.Null);
            Assert.That(planResult.HasOfflineMigrations, Is.False);
            Assert.That(planResult.HasOnlineMigrations, Is.True, "there should be an online migration that needs to resume");
            Assert.That(planResult.HasStoredCodeChanges, Is.False);
        }
        public void Plan_ShouldNotReturnAnyError_WhenThereAreNoMigrations()
        {
            // return empty lists
            var mockProvider = new FakeMigrationsProvider();
            var emptyJournal = new FakeJournal().Created();

            var subject = new Migrator(emptyJournal, mockProvider, Mock.Of <IProgressReporter>());

            var planResult = subject.Plan();

            Assert.That(planResult.OnlineErrorMessage, Is.Null);
            Assert.That(planResult.OfflineErrorMessage, Is.Null);
            Assert.That(planResult.HasOfflineMigrations, Is.False);
            Assert.That(planResult.HasOnlineMigrations, Is.False);
            Assert.That(planResult.HasStoredCodeChanges, Is.False);
        }