public void CanUseCustomPostgresQuoter()
        {
            var services = new ServiceCollection()
                           .AddFluentMigratorCore()
                           .ConfigureRunner(rb => rb.AddPostgres())
                           .AddScoped <PostgresQuoter, CustomPostgresQuoter>()
                           .BuildServiceProvider(true);

            using (var scope = services.CreateScope())
            {
                var contextMock = new Mock <IMigrationContext>();
                var expressions = new List <IMigrationExpression>();
                contextMock.SetupGet(context => context.Expressions).Returns(expressions);
                contextMock.SetupGet(context => context.ServiceProvider).Returns(scope.ServiceProvider);
                contextMock.SetupGet(context => context.QuerySchema).Throws <InvalidOperationException>();

                var generator  = scope.ServiceProvider.GetRequiredService <IMigrationGenerator>();
                var expression = new AlterTableExpressionBuilder(
                    new AlterTableExpression()
                {
                    TableName = "a-table",
                },
                    contextMock.Object);
                expression
                .AddColumn("a-column").AsDateTimeOffset().WithDefault(SystemMethods.CurrentDateTimeOffset);

                Assert.That(expressions, Is.Not.Empty);
                Assert.That(expressions.Count, Is.EqualTo(1));
                Assert.That(expressions.Single(), Is.TypeOf <CreateColumnExpression>());
                var addColumnExpression = (CreateColumnExpression)expressions.Single();
                var statement           = generator.Generate(addColumnExpression);
                Assert.That(statement, Is.EqualTo("ALTER TABLE \"public\".\"a-table\" ADD \"a-column\" timestamptz NOT NULL DEFAULT my_current_timestamp();"));
            }
        }
예제 #2
0
        public void CallingUniqueNamedAddsIndexExpressionToContext()
        {
            var collectionMock = new Mock <ICollection <IMigrationExpression> >();

            var contextMock = new Mock <IMigrationContext>();

            contextMock.Setup(x => x.Expressions).Returns(collectionMock.Object);

            var columnMock = new Mock <ColumnDefinition>();

            columnMock.SetupGet(x => x.Name).Returns("BaconId");

            var expressionMock = new Mock <AlterTableExpression>();

            expressionMock.SetupGet(x => x.SchemaName).Returns("Eggs");
            expressionMock.SetupGet(x => x.TableName).Returns("Bacon");

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object)
            {
                CurrentColumn = columnMock.Object
            };

            builder.Unique("IX_Bacon_BaconId");

            collectionMock.Verify(x => x.Add(It.Is <CreateIndexExpression>(
                                                 ix => ix.Index.Name == "IX_Bacon_BaconId" &&
                                                 ix.Index.TableName == "Bacon" &&
                                                 ix.Index.SchemaName == "Eggs" &&
                                                 ix.Index.IsUnique &&
                                                 !ix.Index.IsClustered &&
                                                 ix.Index.Columns.All(c => c.Name == "BaconId")
                                                 )));

            contextMock.VerifyGet(x => x.Expressions);
        }
예제 #3
0
        public void CallingForeignKeyAddsNewForeignKeyExpressionToContext()
        {
            var collectionMock = new Mock <ICollection <IMigrationExpression> >();

            var contextMock = new Mock <IMigrationContext>();

            contextMock.Setup(x => x.Expressions).Returns(collectionMock.Object);

            var columnMock = new Mock <ColumnDefinition>();

            columnMock.SetupGet(x => x.Name).Returns("BaconId");

            var expressionMock = new Mock <AlterTableExpression>();

            expressionMock.SetupGet(x => x.TableName).Returns("Bacon");

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object)
            {
                CurrentColumn = columnMock.Object
            };

            builder.ForeignKey("fk_foo", "FooTable", "BarColumn");

            collectionMock.Verify(x => x.Add(It.Is <CreateForeignKeyExpression>(
                                                 fk => fk.ForeignKey.Name == "fk_foo" &&
                                                 fk.ForeignKey.PrimaryTable == "FooTable" &&
                                                 fk.ForeignKey.PrimaryColumns.Contains("BarColumn") &&
                                                 fk.ForeignKey.PrimaryColumns.Count == 1 &&
                                                 fk.ForeignKey.ForeignTable == "Bacon" &&
                                                 fk.ForeignKey.ForeignColumns.Contains("BaconId") &&
                                                 fk.ForeignKey.ForeignColumns.Count == 1
                                                 )));

            contextMock.VerifyGet(x => x.Expressions);
        }
예제 #4
0
        private static ISupportAdditionalFeatures GetColumn <TNext, TNextFk>(IColumnOptionSyntax <TNext, TNextFk> expression) where TNext : IFluentSyntax where TNextFk : IFluentSyntax
        {
            CreateTableExpressionBuilder cast1 = expression as CreateTableExpressionBuilder;

            if (cast1 != null)
            {
                return(cast1.CurrentColumn);
            }

            AlterTableExpressionBuilder cast2 = expression as AlterTableExpressionBuilder;

            if (cast2 != null)
            {
                return(cast2.CurrentColumn);
            }

            AlterColumnExpressionBuilder cast3 = expression as AlterColumnExpressionBuilder;

            if (cast3 != null)
            {
                return(cast3.GetColumnForType());
            }

            CreateColumnExpressionBuilder cast4 = expression as CreateColumnExpressionBuilder;

            if (cast4 != null)
            {
                return(cast4.GetColumnForType());
            }

            throw new InvalidOperationException("The seeded identity method can only be called on a valid object.");
        }
 /// <summary>
 /// Initialize object from the <see cref="AlterTableExpressionBuilder"/> object
 /// </summary>
 /// <param name="builder">The <see cref="AlterTableExpressionBuilder"/> object</param>
 /// <param name="changeLog">The <see cref="ChangeLogContext"/> object</param>
 public ChangeLogLinkedExpression(AlterTableExpressionBuilder builder, ChangeLogContext changeLog)
     : this(changeLog, builder.Expression)
 {
     GetColumns       = () => builder.GetMigrationExpressions().GetAlterColumns(builder.Expression.TableName);
     SchemaName       = builder.Expression.SchemaName;
     TableName        = builder.Expression.TableName;
     TableDescription = builder.Expression.TableDescription;
 }
예제 #6
0
        public void ColumnHelperSetOnCreation()
        {
            var expressionMock = new Mock <AlterTableExpression>();
            var contextMock    = new Mock <IMigrationContext>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            Assert.IsNotNull(builder.ColumnHelper);
        }
예제 #7
0
        public void CallingOnDeleteOrUpdateSetsOnUpdateAndOnDeleteOnForeignKeyExpression(Rule rule)
        {
            var builder = new AlterTableExpressionBuilder(null, null)
            {
                CurrentForeignKey = new ForeignKeyDefinition()
            };

            builder.OnDeleteOrUpdate(rule);
            Assert.That(builder.CurrentForeignKey.OnUpdate, Is.EqualTo(rule));
            Assert.That(builder.CurrentForeignKey.OnDelete, Is.EqualTo(rule));
        }
예제 #8
0
        public void IColumnExpressionBuilder_UsesExpressionSchemaAndTableName()
        {
            var expressionMock = new Mock <AlterTableExpression>();
            var contextMock    = new Mock <IMigrationContext>();

            expressionMock.SetupGet(n => n.SchemaName).Returns("Fred");
            expressionMock.SetupGet(n => n.TableName).Returns("Flinstone");

            var builder            = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            var builderAsInterface = (IColumnExpressionBuilder)builder;

            Assert.AreEqual("Fred", builderAsInterface.SchemaName);
            Assert.AreEqual("Flinstone", builderAsInterface.TableName);
        }
예제 #9
0
        private void VerifyColumnHelperCall(Action <AlterTableExpressionBuilder> callToTest, System.Linq.Expressions.Expression <Action <ColumnExpressionBuilderHelper> > expectedHelperAction)
        {
            var expressionMock = new Mock <AlterTableExpression>();
            var contextMock    = new Mock <IMigrationContext>();
            var helperMock     = new Mock <ColumnExpressionBuilderHelper>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.ColumnHelper = helperMock.Object;

            callToTest(builder);

            helperMock.Verify(expectedHelperAction);
        }
예제 #10
0
        public void CallingWithDefaultSetsDefaultValue()
        {
            var contextMock = new Mock <IMigrationContext>();

            var columnMock = new Mock <ColumnDefinition>();

            var expressionMock = new Mock <AlterTableExpression>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;
            builder.WithDefault(SystemMethods.CurrentDateTime);

            columnMock.VerifySet(c => c.DefaultValue = SystemMethods.CurrentDateTime);
        }
예제 #11
0
        public void IColumnExpressionBuilder_UsesCurrentColumn()
        {
            var expressionMock = new Mock <AlterTableExpression>();
            var contextMock    = new Mock <IMigrationContext>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            var curColumn = new Mock <ColumnDefinition>().Object;

            builder.CurrentColumn = curColumn;

            var builderAsInterface = (IColumnExpressionBuilder)builder;

            Assert.AreSame(curColumn, builderAsInterface.Column);
        }
예제 #12
0
        private void VerifyColumnPrecision(int expected, Action <AlterTableExpressionBuilder> callToTest)
        {
            var columnMock = new Mock <ColumnDefinition>();

            var expressionMock = new Mock <AlterTableExpression>();

            var contextMock = new Mock <IMigrationContext>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;

            callToTest(builder);

            columnMock.VerifySet(c => c.Precision = expected);
        }
예제 #13
0
        public void CallingIdentityWithSeededIdentitySetsAdditionalProperties()
        {
            var contextMock = new Mock <IMigrationContext>();

            var columnMock = new Mock <ColumnDefinition>();

            var expressionMock = new Mock <AlterTableExpression>();
            var builder        = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;
            builder.Identity(12, 44);

            columnMock.Object.AdditionalFeatures.ShouldContain(
                new KeyValuePair <string, object>(SqlServerExtensions.IdentitySeed, 12));
            columnMock.Object.AdditionalFeatures.ShouldContain(
                new KeyValuePair <string, object>(SqlServerExtensions.IdentityIncrement, 44));
        }
        private void VerifyColumnSize(int expected, Action <AlterTableExpressionBuilder> callToTest)
        {
            var columnMock = new Mock <ColumnDefinition>();

            columnMock.SetupSet(c => c.Size = expected).AtMostOnce();

            var expressionMock = new Mock <AlterTableExpression>();

            var contextMock = new Mock <IMigrationContext>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;

            callToTest(builder);

            columnMock.VerifyAll();
        }
예제 #15
0
        private void VerifyColumnProperty(Action <ColumnDefinition> columnExpression, Action <AlterTableExpressionBuilder> callToTest)
        {
            var columnMock = new Mock <ColumnDefinition>();

            var expressionMock = new Mock <AlterTableExpression>();

            var contextMock = new Mock <IMigrationContext>();

            contextMock.SetupGet(mc => mc.Expressions).Returns(new Collection <IMigrationExpression>());

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;

            callToTest(builder);

            columnMock.VerifySet(columnExpression);
        }
        private void VerifyColumnProperty <T>(T expected, Expression <Func <ColumnDefinition, T> > columnExpression, Action <AlterTableExpressionBuilder> callToTest)
        {
            var columnMock = new Mock <ColumnDefinition>();

            columnMock.SetupSet(columnExpression).AtMostOnce();

            var expressionMock = new Mock <AlterTableExpression>();

            var contextMock = new Mock <IMigrationContext>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;

            callToTest(builder);

            columnMock.VerifyAll();
            expressionMock.VerifyAll();
        }
        public void CallingWithDefaultValueSetsDefaultValue()
        {
            const int value = 42;

            var contextMock = new Mock <IMigrationContext>();

            var columnMock = new Mock <ColumnDefinition>();

            columnMock.SetupSet(c => c.DefaultValue = value).AtMostOnce();

            var expressionMock = new Mock <AlterTableExpression>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;
            builder.WithDefaultValue(42);

            columnMock.VerifyAll();
        }
예제 #18
0
        public void CallingWithDefaultValueOnNewColumnDoesNotAddDefaultConstraintExpression()
        {
            var expressions = new List <IMigrationExpression>();
            var contextMock = new Mock <IMigrationContext>();

            contextMock.Setup(x => x.Expressions).Returns(expressions);

            var columnMock = new Mock <ColumnDefinition>();

            columnMock.Setup(x => x.ModificationType).Returns(ColumnModificationType.Create);

            var expressionMock = new Mock <AlterTableExpression>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;
            builder.WithDefaultValue(42);

            Assert.That(expressions.Count(), Is.EqualTo(0));
        }
예제 #19
0
        public void CallingWithDefaultOnAlterColumnAddsDefaultConstraintExpression()
        {
            var expressions = new List <IMigrationExpression>();
            var contextMock = new Mock <IMigrationContext>();

            contextMock.Setup(x => x.Expressions).Returns(expressions);

            var columnMock = new Mock <ColumnDefinition>();

            columnMock.Setup(x => x.ModificationType).Returns(ColumnModificationType.Alter);

            var expressionMock = new Mock <AlterTableExpression>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            builder.CurrentColumn = columnMock.Object;
            builder.WithDefault(SystemMethods.CurrentDateTime);

            Assert.That(expressions.Count(), Is.EqualTo(1));
        }
        public void CallingForeignKeyAddsNewForeignKeyExpressionToContext()
        {
            var collectionMock = new Mock<ICollection<IMigrationExpression>>();

            var contextMock = new Mock<IMigrationContext>();
            contextMock.Setup(x => x.Expressions).Returns(collectionMock.Object);

            var columnMock = new Mock<ColumnDefinition>();
            columnMock.SetupGet(x => x.Name).Returns("BaconId");

            var expressionMock = new Mock<AlterTableExpression>();
            expressionMock.SetupGet(x => x.TableName).Returns("Bacon");

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object)
            {
                CurrentColumn = columnMock.Object
            };

            builder.ForeignKey("fk_foo", "FooTable", "BarColumn");

            collectionMock.Verify(x => x.Add(It.Is<CreateForeignKeyExpression>(
                fk => fk.ForeignKey.Name == "fk_foo" &&
                        fk.ForeignKey.PrimaryTable == "FooTable" &&
                        fk.ForeignKey.PrimaryColumns.Contains("BarColumn") &&
                        fk.ForeignKey.PrimaryColumns.Count == 1 &&
                        fk.ForeignKey.ForeignTable == "Bacon" &&
                        fk.ForeignKey.ForeignColumns.Contains("BaconId") &&
                        fk.ForeignKey.ForeignColumns.Count == 1
                                                )));

            contextMock.VerifyGet(x => x.Expressions);
        }
        public void IColumnExpressionBuilder_UsesExpressionSchemaAndTableName()
        {
            var expressionMock = new Mock<AlterTableExpression>();
            var contextMock = new Mock<IMigrationContext>();
            expressionMock.SetupGet(n => n.SchemaName).Returns("Fred");
            expressionMock.SetupGet(n => n.TableName).Returns("Flinstone");

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            var builderAsInterface = (IColumnExpressionBuilder)builder;

            Assert.AreEqual("Fred", builderAsInterface.SchemaName);
            Assert.AreEqual("Flinstone", builderAsInterface.TableName);
        }
        public void ColumnHelperSetOnCreation()
        {
            var expressionMock = new Mock<AlterTableExpression>();
            var contextMock = new Mock<IMigrationContext>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            Assert.IsNotNull(builder.ColumnHelper);
        }
        public void CallingWithDefaultValueSetsDefaultValue()
        {
            const int value = 42;

            var expressions = new List<IMigrationExpression>();
            var contextMock = new Mock<IMigrationContext>();
            contextMock.Setup(x => x.Expressions).Returns(expressions);

            var columnMock = new Mock<ColumnDefinition>();

            var expressionMock = new Mock<AlterTableExpression>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            builder.CurrentColumn = columnMock.Object;
            builder.WithDefaultValue(42);

            columnMock.VerifySet(c => c.DefaultValue = value);
        }
        private void VerifyColumnHelperCall(Action<AlterTableExpressionBuilder> callToTest, System.Linq.Expressions.Expression<Action<ColumnExpressionBuilderHelper>> expectedHelperAction)
        {
            var expressionMock = new Mock<AlterTableExpression>();
            var contextMock = new Mock<IMigrationContext>();
            var helperMock = new Mock<ColumnExpressionBuilderHelper>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            builder.ColumnHelper = helperMock.Object;

            callToTest(builder);

            helperMock.Verify(expectedHelperAction);
        }
        public void CallingWithDefaultValueOnAlterColumnAddsDefaultConstraintExpression() {
            const int value = 42;

            var expressions = new List<IMigrationExpression>();
            var contextMock = new Mock<IMigrationContext>();
            contextMock.Setup(x => x.Expressions).Returns(expressions);

            var columnMock = new Mock<ColumnDefinition>();
            columnMock.Setup(x => x.ModificationType).Returns(ColumnModificationType.Alter);

            var expressionMock = new Mock<AlterTableExpression>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            builder.CurrentColumn = columnMock.Object;
            builder.WithDefaultValue(42);

            Assert.That(expressions.Count(), Is.EqualTo(1));
        }
        public void CallingIdentityWithSeededIdentitySetsAdditionalProperties()
        {
            var contextMock = new Mock<IMigrationContext>();

            var columnMock = new Mock<ColumnDefinition>();

            var expressionMock = new Mock<AlterTableExpression>();
            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            builder.CurrentColumn = columnMock.Object;
            builder.Identity(12, 44);

            columnMock.Object.AdditionalFeatures.ShouldContain(
                new KeyValuePair<string, object>(SqlServerExtensions.IdentitySeed, 12));
            columnMock.Object.AdditionalFeatures.ShouldContain(
                new KeyValuePair<string, object>(SqlServerExtensions.IdentityIncrement, 44));
        }
        private void VerifyColumnProperty(Action<ColumnDefinition> columnExpression, Action<AlterTableExpressionBuilder> callToTest)
        {
            var columnMock = new Mock<ColumnDefinition>();

            var expressionMock = new Mock<AlterTableExpression>();

            var contextMock = new Mock<IMigrationContext>();
            contextMock.SetupGet(mc => mc.Expressions).Returns(new Collection<IMigrationExpression>());

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            builder.CurrentColumn = columnMock.Object;

            callToTest(builder);

            columnMock.VerifySet(columnExpression);

        }
        public void CallingUniqueNamedAddsIndexExpressionToContext()
        {
            var collectionMock = new Mock<ICollection<IMigrationExpression>>();

            var contextMock = new Mock<IMigrationContext>();
            contextMock.Setup(x => x.Expressions).Returns(collectionMock.Object);

            var columnMock = new Mock<ColumnDefinition>();
            columnMock.SetupGet(x => x.Name).Returns("BaconId");

            var expressionMock = new Mock<AlterTableExpression>();
            expressionMock.SetupGet(x => x.SchemaName).Returns("Eggs");
            expressionMock.SetupGet(x => x.TableName).Returns("Bacon");

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object) { CurrentColumn = columnMock.Object };

            builder.Unique("IX_Bacon_BaconId");

            collectionMock.Verify(x => x.Add(It.Is<CreateIndexExpression>(
                ix => ix.Index.Name == "IX_Bacon_BaconId"
                      && ix.Index.TableName == "Bacon"
                      && ix.Index.SchemaName == "Eggs"
                      && ix.Index.IsUnique
                      && !ix.Index.IsClustered
                      && ix.Index.Columns.All(c => c.Name == "BaconId")
                                                 )));

            contextMock.VerifyGet(x => x.Expressions);
        }
        private void VerifyColumnPrecision(int expected, Action<AlterTableExpressionBuilder> callToTest)
        {
            var columnMock = new Mock<ColumnDefinition>();

            var expressionMock = new Mock<AlterTableExpression>();

            var contextMock = new Mock<IMigrationContext>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            builder.CurrentColumn = columnMock.Object;

            callToTest(builder);

            columnMock.VerifySet(c => c.Precision = expected);
        }
        public void CallingWithDefaultOnNewColumnDoesNotAddDefaultConstraintExpression()
        {
            var expressions = new List<IMigrationExpression>();
            var contextMock = new Mock<IMigrationContext>();
            contextMock.Setup(x => x.Expressions).Returns(expressions);

            var columnMock = new Mock<ColumnDefinition>();
            columnMock.Setup(x => x.ModificationType).Returns(ColumnModificationType.Create);

            var expressionMock = new Mock<AlterTableExpression>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            builder.CurrentColumn = columnMock.Object;
            builder.WithDefault(SystemMethods.CurrentDateTime);

            Assert.That(expressions.Count(), Is.EqualTo(0));
        }
        public void CallingWithDefaultSetsDefaultValue()
        {
            var contextMock = new Mock<IMigrationContext>();

            var columnMock = new Mock<ColumnDefinition>();

            var expressionMock = new Mock<AlterTableExpression>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);
            builder.CurrentColumn = columnMock.Object;
            builder.WithDefault(SystemMethods.CurrentDateTime);

            columnMock.VerifySet(c => c.DefaultValue = SystemMethods.CurrentDateTime);
        }
        public void IColumnExpressionBuilder_UsesCurrentColumn()
        {
            var expressionMock = new Mock<AlterTableExpression>();
            var contextMock = new Mock<IMigrationContext>();

            var builder = new AlterTableExpressionBuilder(expressionMock.Object, contextMock.Object);

            var curColumn = new Mock<ColumnDefinition>().Object;
            builder.CurrentColumn = curColumn;

            var builderAsInterface = (IColumnExpressionBuilder)builder;

            Assert.AreSame(curColumn, builderAsInterface.Column);
        }
 public void CallingOnDeleteOrUpdateSetsOnUpdateAndOnDeleteOnForeignKeyExpression(Rule rule)
 {
     var builder = new AlterTableExpressionBuilder(null, null) { CurrentForeignKey = new ForeignKeyDefinition() };
     builder.OnDeleteOrUpdate(rule);
     Assert.That(builder.CurrentForeignKey.OnUpdate, Is.EqualTo(rule));
     Assert.That(builder.CurrentForeignKey.OnDelete, Is.EqualTo(rule));
 }