Ejemplo n.º 1
0
        static IModel BuildModel(ConstructInstance <TDbContext> constructInstance)
        {
            var builder = DefaultOptionsBuilder.Build <TDbContext>();

            builder.UseSqlServer("Fake");
            return(constructInstance(builder).Model);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Instantiate a <see cref="SqlInstance{TDbContext}"/>.
        /// Should usually be scoped as once instance per appdomain. So all tests use the same instance of <see cref="SqlInstance{TDbContext}"/>.
        /// </summary>
        /// <param name="constructInstance"></param>
        /// <param name="buildTemplate"></param>
        /// <param name="storage">Disk storage convention for where the mdb and the ldf files will be located. Optional.</param>
        /// <param name="timestamp"></param>
        /// <param name="templateSize">The size in MB for the template. Optional.</param>
        /// <param name="existingTemplate">Existing mdb and the ldf files to use when building the template. Optional.</param>
        /// <param name="callback">Callback that is executed after the template database has been created. Optional.</param>
        /// <param name="sqlOptionsBuilder">Passed to <see cref="SqlServerDbContextOptionsExtensions.UseSqlServer(DbContextOptionsBuilder,string,Action{SqlServerDbContextOptionsBuilder})"/>.</param>
        public SqlInstance(
            ConstructInstance <TDbContext> constructInstance,
            TemplateFromConnection <TDbContext> buildTemplate,
            Storage?storage     = null,
            DateTime?timestamp  = null,
            ushort templateSize = 3,
            ExistingTemplate?existingTemplate = null,
            Callback <TDbContext>?callback    = null,
            Action <SqlServerDbContextOptionsBuilder>?sqlOptionsBuilder = null)
        {
            storage ??= DefaultStorage;
            var resultTimestamp = GetTimestamp(timestamp, buildTemplate);

            Guard.AgainstNull(nameof(buildTemplate), buildTemplate);
            Guard.AgainstNull(nameof(constructInstance), constructInstance);
            Model = BuildModel(constructInstance);
            this.constructInstance = constructInstance;
            this.sqlOptionsBuilder = sqlOptionsBuilder;

            var storageValue = storage.Value;

            DirectoryCleaner.CleanInstance(storageValue.Directory);

            Task BuildTemplate(DbConnection connection)
            {
                var builder = DefaultOptionsBuilder.Build <TDbContext>();

                builder.UseSqlServer(connection, sqlOptionsBuilder);
                return(buildTemplate(connection, builder));
            }

            Func <DbConnection, Task>?wrapperCallback = null;

            if (callback != null)
            {
                wrapperCallback = async connection =>
                {
                    var builder = DefaultOptionsBuilder.Build <TDbContext>();
                    builder.UseSqlServer(connection, sqlOptionsBuilder);
#if NET5_0
                    await using var context = constructInstance(builder);
#else
                    using var context = constructInstance(builder);
#endif
                    await callback(connection, context);
                };
            }

            Wrapper = new(
                s => new SqlConnection(s),
                storageValue.Name,
                storageValue.Directory,
                templateSize,
                existingTemplate,
                wrapperCallback);

            Wrapper.Start(resultTimestamp, BuildTemplate);
        }
Ejemplo n.º 3
0
 private IEnumerable <T> ExecuteReaderSync(IDataReader reader, ConstructInstance map)
 {
     using (reader)
     {
         while (reader.Read())
         {
             object row = map(reader);
             yield return((T)row);
         }
     }
 }
Ejemplo n.º 4
0
 internal SqlDatabase(
     string connectionString,
     string name,
     ConstructInstance <TDbContext> constructInstance,
     Func <Task> delete,
     IEnumerable <object>?data)
 {
     Name = name;
     this.constructInstance = constructInstance;
     this.delete            = delete;
     this.data        = data;
     ConnectionString = connectionString;
     Connection       = new(connectionString);
 }
Ejemplo n.º 5
0
 internal SqlDatabase(
     string connectionString,
     string name,
     ConstructInstance <TDbContext> constructInstance,
     Func <Task> delete,
     IEnumerable <object>?data,
     Action <SqlServerDbContextOptionsBuilder>?sqlOptionsBuilder)
 {
     Name = name;
     this.constructInstance = constructInstance;
     this.delete            = delete;
     this.data = data;
     this.sqlOptionsBuilder = sqlOptionsBuilder;
     ConnectionString       = connectionString;
     Connection             = new(connectionString);
 }
Ejemplo n.º 6
0
 public SqlInstance(
     ConstructInstance <TDbContext> constructInstance,
     TemplateFromContext <TDbContext>?buildTemplate = null,
     Storage?storage     = null,
     DateTime?timestamp  = null,
     ushort templateSize = 3,
     ExistingTemplate?existingTemplate = null,
     Callback <TDbContext>?callback    = null) :
     this(
         constructInstance,
         BuildTemplateConverter.Convert(constructInstance, buildTemplate),
         storage,
         GetTimestamp(timestamp, buildTemplate),
         templateSize,
         existingTemplate,
         callback)
 {
 }
Ejemplo n.º 7
0
 public static TemplateFromConnection Convert <TDbContext>(
     ConstructInstance <TDbContext> constructInstance,
     TemplateFromContext <TDbContext>?buildTemplate)
     where TDbContext : DbContext
 {
     return(async connection =>
     {
         using var context = constructInstance(connection);
         if (buildTemplate == null)
         {
             await context.CreateOnExistingDb();
         }
         else
         {
             await buildTemplate(context);
         }
     });
 }
Ejemplo n.º 8
0
 public static TemplateFromConnection <TDbContext> Convert <TDbContext>(
     ConstructInstance <TDbContext> constructInstance,
     TemplateFromContext <TDbContext>?buildTemplate)
     where TDbContext : DbContext
 {
     return(async(_, builder) =>
     {
         await using var data = constructInstance(builder);
         if (buildTemplate == null)
         {
             await data.Database.EnsureCreatedAsync();
         }
         else
         {
             await buildTemplate(data);
         }
     });
 }
Ejemplo n.º 9
0
        public SqlInstance(
            ConstructInstance <TDbContext> constructInstance,
            TemplateFromConnection buildTemplate,
            Storage?storage     = null,
            DateTime?timestamp  = null,
            ushort templateSize = 3,
            ExistingTemplate?existingTemplate = null,
            Callback <TDbContext>?callback    = null)
        {
            storage ??= DefaultStorage;

            var resultTimestamp = GetTimestamp(timestamp, buildTemplate);

            Guard.AgainstNull(nameof(constructInstance), constructInstance);
            this.constructInstance = constructInstance;

            var storageValue = storage.Value;

            DirectoryCleaner.CleanInstance(storageValue.Directory);

            Func <DbConnection, Task>?wrapperCallback = null;

            if (callback != null)
            {
                wrapperCallback = async connection =>
                {
                    using var context = constructInstance(connection);
                    await callback(connection, context);
                };
            }
            Wrapper = new(
                s => new SqlConnection(s),
                storageValue.Name,
                storageValue.Directory,
                templateSize,
                existingTemplate,
                wrapperCallback);
            Wrapper.Start(resultTimestamp, connection => buildTemplate(connection));
        }