Exemplo n.º 1
0
        public bool Process(WebTestConfig config, bool dropExisting)
        {
            DropExisting = dropExisting;
            Server       = config.DatabaseManager ?? throw new Exception("Database manager is not specified for WebTestConfig");
            LoadMetaDirectory();

            TempDatabaseName = DatabaseManager.GetDatabaseName().Or("Default.Temp");
            if (!TempDatabaseName.ToLower().EndsWith(".temp"))
            {
                Debug.WriteLine($"Temp databae creation aborted as '{TempDatabaseName}' does not end in '.Temp'.");
                return(false);
            }

            EnsurePermissions();
            CreateDatabaseFilesPath();

            lock (SyncLock)
            {
                if (!EstablishDatabaseFromScripts())
                {
                    return(false);
                }
                CopyFiles();
            }

            Task.Factory.RunSync(() => Context.Current.Database().Refresh());

            return(true);
        }
Exemplo n.º 2
0
        public static async Task Create(bool dropExisting = false)
        {
            if (!WebTestConfig.IsActive())
            {
                Debug.WriteLine("Creating temp database aborted. Test mode is not active.");
                return;
            }

            try
            {
                if (new TestDatabaseGenerator().Process(Config, dropExisting))
                {
                    try { await(WebTestConfig.ReferenceDataCreator?.Invoke() ?? Task.CompletedTask); }
                    catch (Exception ex)
                    {
                        throw new Exception("Failed to run the reference data.", ex);
                    }
                }
                Status = CreationStatus.Created;
            }
            catch
            {
                Status = CreationStatus.Failed;
                throw;
            }
            finally
            {
                DatabaseChangeWatcher.Restart();
            }
        }
Exemplo n.º 3
0
        internal static IDevCommandsConfig AddDatabaseManager(this IDevCommandsConfig config)
        {
            config.Add("dbChanges", () => DatabaseChangeWatcher.DispatchChanges());

            async Task <bool> startDatabase(bool shouldRedirect = false)
            {
                var redirect = Context.Current.Request().ToAbsoluteUri().AsUri().RemoveQueryString("Web.Test.Command").ToString();

                WebTestConfig.SetRunner();
                await TempDatabase.Restart();

                if (shouldRedirect)
                {
                    Debug.WriteLine("All done. Redirecting to: " + redirect);
                    Context.Current.Response().Redirect(redirect);
                }

                return(shouldRedirect);
            }

            foreach (var command in new[] { "start", "run", "ran", "cancel" })
            {
                config.Add(command, () => startDatabase());
            }

            config.Add("restart", () => startDatabase(shouldRedirect: true), "Restart DB");

            return(config);
        }
Exemplo n.º 4
0
        public static IApplicationBuilder UseWebTest(this IApplicationBuilder app,
                                                     Func <Task> createReferenceData,
                                                     Action <IWebTestConfig> config = null)
        {
            if (!WebTestConfig.IsActive())
            {
                return(app);
            }

            WebTestConfig.ReferenceDataCreator = createReferenceData;

            var settings = new WebTestConfig();

            config?.Invoke(settings);

            if (settings.AddDefaultHandlers)
            {
                settings.AddDatabaseManager().AddSnapshot().AddTimeInjector().AddSqlProfile();
            }

            app.UseMiddleware <WebTestMiddleware>();

            Task.Factory.RunSync(() => TempDatabase.Create(enforceRestart: false, mustRenew: false));

            return(app);
        }
Exemplo n.º 5
0
        async Task <bool> ProcessAsWebCommand()
        {
            if (TempDatabase.Config?.DatabaseManager == null)
            {
                return(false);
            }

            await TempDatabase.AwaitReadiness();

            var command = Context.Current.Request().Param("Web.Test.Command");

            if (command.IsEmpty())
            {
                return(false);
            }

            try
            {
                return(await WebTestConfig.Run(command));
            }
            catch (Exception ex)
            {
                await Context.Current.Response().EndWith(ex.ToLogString().ToHtmlLines());

                return(false);
            }
        }
Exemplo n.º 6
0
        public static async Task InitializeTempDatabase <TDatabaseManager>(this IApplicationBuilder app, Func <Task> createReferenceData)
            where TDatabaseManager : DatabaseManager, new()
        {
            if (!WebTestConfig.IsActive())
            {
                return;
            }

            TempDatabase.Config.DatabaseManager = new TDatabaseManager();
            WebTestConfig.ReferenceDataCreator  = createReferenceData;
            await TempDatabase.AwaitReadiness();
        }
Exemplo n.º 7
0
        public static async Task Create(bool enforceRestart, bool mustRenew)
        {
            if (!WebTestConfig.IsActive())
            {
                Debug.WriteLine("Creating temp database aborted. Test mode is not active.");
                return;
            }

            IsDatabaseBeingCreated = true;
            var createdNew = false;

            try
            {
                SqlConnection.ClearAllPools();
                if (enforceRestart)
                {
                    TempDatabaseInitiated = null;
                }
                if (TempDatabaseInitiated.HasValue)
                {
                    return;
                }

                var generator = new TestDatabaseGenerator(isTempDatabaseOptional: true, mustRenew: mustRenew);
                TempDatabaseInitiated = generator.Process();
                createdNew            = generator.CreatedNewDatabase;

                await Database.Instance.Refresh();

                SqlConnection.ClearAllPools();
            }
            finally { IsDatabaseBeingCreated = false; }

            if (createdNew)
            {
                // A new database is created. Add the reference data
                try
                {
                    await(WebTestConfig.ReferenceDataCreator?.Invoke() ?? Task.CompletedTask);
                }
                catch (Exception ex)
                {
                    throw new Exception("Failed to run the reference data.", ex);
                }
            }
        }
Exemplo n.º 8
0
        public static IApplicationBuilder UseWebTest(this IApplicationBuilder app,
                                                     Action <IDevCommandsConfig> config = null)
        {
            if (!WebTestConfig.IsActive())
            {
                return(app);
            }

            config?.Invoke(TempDatabase.Config);

            if (TempDatabase.Config.AddDefaultHandlers)
            {
                TempDatabase.Config.AddDatabaseManager()
                .AddTimeInjector()
                .AddSqlProfile()
                .AddClearDatabaseCache();
            }

            app.UseMiddleware <WebTestMiddleware>();
            return(app);
        }