public async Task CreateTableWithForeignKey(OrmConnectionFactory factory)
        {
            using (var c = factory.OpenConnection())
            {
                Assert.False(await c.TableExistsAsync <OnePk>());
                Assert.False(await c.TableExistsAsync <OneFk>());

                await c.CreateTableAsync <OnePk>(true);

                await c.CreateTableAsync <OneFk>(true);

                Assert.True(await c.TableExistsAsync <OnePk>());
                Assert.True(await c.TableExistsAsync <OneFk>());
                Assert.Equal(1, await c.InsertAsync(new OnePk {
                    Pk = "1"
                }));
                Assert.Equal(1, await c.InsertAsync(new OneFk {
                    Fk = "1"
                }));

                await Assert.ThrowsAsync <OrmException>(async() => await c.InsertAsync(new OneFk {
                    Fk = "2"
                }));
            }
        }
        public async Task CreateTableWithoutPrimaryKeys(OrmConnectionFactory factory)
        {
            using (var c = factory.OpenConnection())
            {
                Assert.False(await c.TableExistsAsync <NoPk>());
                await c.CreateTableAsync <NoPk>(true);

                Assert.Equal(1, await c.InsertAsync(new NoPk()));
                Assert.True(await c.TableExistsAsync <NoPk>());
            }
        }
        public void GetTableColumnInfo(OrmConnectionFactory factory)
        {
            using (var conn = factory.OpenConnection())
            {
                conn.CreateTable <WithAttributes>(true);

                var t = conn.GetTableColumnsInformation("WithAttributes").ToList();

                Assert.NotNull(t);
                Assert.NotEmpty(t);
                Assert.Equal(8, t.Count);
                Assert.True(t[0].PrimaryKey);
            }
        }
        public async Task CreateTableWithAliases(OrmConnectionFactory factory)
        {
            using (var c = factory.OpenConnection())
            {
                await c.CreateTableAsync <WithAlias>(true);

                Assert.True(await c.TableExistsAsync <WithAlias>());

                c.Select <WithAlias>(x =>
                {
                    Assert.Equal(c.DialectProvider.GetQuotedTableName("withaliasrenamed"), x.Statement.TableName);
                    Assert.Equal(c.DialectProvider.GetQuotedColumnName("columnAlias") + " AS Column1", x.Statement.Columns[0]);
                });
            }
        }
        public async Task CreateTableAndDropTable(OrmConnectionFactory factory)
        {
            using (var c = await factory.OpenConnectionAsync())
            {
                await c.CreateTableAsync <NoPk>(false);

                Assert.True(await c.TableExistsAsync <NoPk>());

                await c.DropTableIfExistsAsync <NoPk>();

                Assert.False(await c.TableExistsAsync <NoPk>());

                await c.CreateTableAsync <NoPk>(false);

                Assert.True(await c.TableExistsAsync <NoPk>());
            }
        }
        public async Task CreateTableWithAliasAndSchema(OrmConnectionFactory factory)
        {
            using (var c = factory.OpenConnection())
            {
                await c.CreateSchemaIfNotExistsAsync("TS");

                await c.CreateTableAsync <WithSchemaAndAlias>(true);

                Assert.True(await c.TableExistsAsync <WithSchemaAndAlias>());

                Assert.NotEmpty(c.GetTablesInformation("TS", false)
                                .Select(x => x.SchemaName == "TS" && x.Name == "withaliasansschema"));

                c.Select <WithSchemaAndAlias>(x =>
                {
                    Assert.Equal(c.DialectProvider.GetQuotedTableName("withaliasansschema", "TS"), x.Statement.TableName);
                    Assert.Equal(c.DialectProvider.GetQuotedColumnName("columnAlias") + " AS Column1", x.Statement.Columns[0]);
                });
            }
        }
        public async Task CreateTableThatAlreadyExistThrowError(OrmConnectionFactory factory)
        {
            using (var c = await factory.OpenConnectionAsync())
            {
                await c.CreateTableAsync <NoPk>(true);

                Assert.True(await c.TableExistsAsync <NoPk>());
                c.Insert(new NoPk {
                    StringCol = "1"
                });
                c.Insert(new NoPk {
                    StringCol = "2"
                });
                c.Insert(new NoPk {
                    StringCol = "3"
                });

                await Assert.ThrowsAsync <OrmException>(async() => await c.CreateTableAsync <NoPk>(false));

                //Ensure table has not been dropped
                Assert.True(await c.TableExistsAsync <NoPk>());
                Assert.Equal(3, await c.CountAsync <NoPk>());
            }
        }
        public async Task CreateTableWithColumnsAndAttributes(OrmConnectionFactory factory)
        {
            using (var c = await factory.OpenConnectionAsync())
            {
                Assert.False(await c.TableExistsAsync <WithAttributes>());
                await c.CreateTableAsync <WithAttributes>(false);

                Assert.True(await c.TableExistsAsync <WithAttributes>());

                await c.InsertAsync(new WithAttributes
                {
                    DecimalCol          = 1234.56m,
                    NotNullString       = "this is not null",
                    UniqueIndexedString = "val1",
                    TenCharsStringCol   = "max10chars",
                    DecimalColLimited   = 90.12m,
                    IgnoredCol          = "this should be ignored",
                    ComputedField       = 0
                });

                var r1 = await c.FirstOrDefaultAsync <WithAttributes>(x => x.Id == 1);

                Assert.NotNull(r1);
                Assert.Equal(1, r1.Id);
                Assert.Null(r1.IgnoredCol);
                Assert.Equal("N/A", r1.DefaultValueCol);
                Assert.Equal(5, r1.ComputedField);
                Assert.Null(r1.NullableDecimalCol);

                c.Insert(new WithAttributes
                {
                    DefaultValueCol     = "Not default this time",
                    UniqueIndexedString = "val2",
                    NotNullString       = "this is not null either",
                    NullableDecimalCol  = 123
                });

                var r2 = await c.FirstOrDefaultAsync <WithAttributes>(x => x.Id == 2);

                Assert.NotNull(r2);
                Assert.Equal(2, r2.Id);
                Assert.Equal("Not default this time", r2.DefaultValueCol);
                Assert.Equal(123, r2.NullableDecimalCol);

                // NotNullString cannot be null
                await Assert.ThrowsAsync <OrmException>(() => c.InsertAsync(new WithAttributes()));

                // UniqueIndexString duplicate
                await Assert.ThrowsAsync <OrmException>(() => c.InsertAsync(new WithAttributes {
                    NotNullString = "1234", UniqueIndexedString = "val1"
                }));

                // No truncation tests with SQLite
                if (!c.DialectProvider.GetType().Name.ToLower().Contains("sqlite"))
                {
                    // Data truncated
                    await Assert.ThrowsAsync <OrmException>(() => c.InsertAsync(new WithAttributes {
                        NotNullString = "1234", TenCharsStringCol = "1234567890A"
                    }));
                }
            }
        }
 protected ExpressionTests(IDialectProvider dialectProvider, string connectionString)
 {
     _connectionFactory = new OrmConnectionFactory(dialectProvider, connectionString);
     _connectionFactory.LoggerFactory = new ConsoleLoggerFactory();
 }