yavsc/test/yavscTests/Mandatory/ServerSideFixture.cs

269 lines
7.7 KiB
C#

using System;
6 years ago
using System.Data.Common;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Internal;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.OptionsModel;
using Yavsc.Lib;
using Yavsc.Services;
6 years ago
using Yavsc;
6 years ago
using Yavsc.Models;
6 years ago
using Xunit;
using Npgsql;
4 years ago
using Microsoft.Data.Entity;
using Microsoft.Data.Entity.Metadata.Conventions;
3 years ago
using yavscTests.Settings;
3 years ago
using System.Threading.Tasks;
using System.IO;
3 years ago
namespace yavscTests
{
4 years ago
[Trait("regression", "II")]
4 years ago
public class ServerSideFixture : IDisposable
{
6 years ago
SiteSettings _siteSetup;
ILogger _logger;
IApplication _app;
4 years ago
readonly EMailer _mailer;
readonly ILoggerFactory _loggerFactory;
6 years ago
IEmailSender _mailSender;
3 years ago
public string ApiKey { get; private set; }
4 years ago
public ApplicationDbContext DbContext { get; private set; }
6 years ago
public SiteSettings SiteSetup
{
get
{
return _siteSetup;
}
set
{
_siteSetup = value;
}
}
4 years ago
/// <summary>
/// initialized by Init
/// </summary>
/// <value></value>
3 years ago
public TestingSetup TestingSetup { get; private set; }
4 years ago
6 years ago
public IEmailSender MailSender
{
get
{
return _mailSender;
}
set
{
_mailSender = value;
}
}
public IApplication App
{
get
{
return _app;
}
set
{
_app = value;
}
}
4 years ago
3 years ago
internal int UpgradeDb()
{
3 years ago
return Microsoft.Data.Entity.Commands.Program.Main(
4 years ago
new string[] { "database", "update" });
}
6 years ago
public ILogger Logger
{
get
{
return _logger;
}
set
{
_logger = value;
}
}
4 years ago
bool dbCreated;
3 years ago
public WebHostBuilder Host { get; private set; }
4 years ago
private readonly IHostingEngine hostengnine;
4 years ago
6 years ago
4 years ago
void AssertNotNull(object obj, string msg)
{
if (obj == null)
throw new Exception(msg);
}
//
public ServerSideFixture()
{
3 years ago
Host = new WebHostBuilder();
AssertNotNull(Host, nameof(Host));
6 years ago
3 years ago
hostengnine = Host
.UseEnvironment("Testing")
.UseServer("yavscTests")
.UseStartup<Startup>()
.Build();
4 years ago
AssertNotNull(hostengnine, nameof(hostengnine));
6 years ago
App = hostengnine.Start();
4 years ago
AssertNotNull(App, nameof(App));
4 years ago
// hostengnine.ApplicationServices
6 years ago
_mailer = App.Services.GetService(typeof(EMailer)) as EMailer;
4 years ago
AssertNotNull(_mailer, nameof(_mailer));
MailSender = App.Services.GetService(typeof(IEmailSender)) as IEmailSender;
AssertNotNull(MailSender, nameof(MailSender));
6 years ago
_loggerFactory = App.Services.GetService(typeof(ILoggerFactory)) as ILoggerFactory;
4 years ago
AssertNotNull(_loggerFactory, nameof(_loggerFactory));
3 years ago
6 years ago
var siteSetup = App.Services.GetService(typeof(IOptions<SiteSettings>)) as IOptions<SiteSettings>;
4 years ago
AssertNotNull(siteSetup, nameof(siteSetup));
3 years ago
var testingSetup = App.Services.GetService(typeof(IOptions<TestingSetup>)) as IOptions<TestingSetup>;
AssertNotNull(testingSetup, nameof(testingSetup));
4 years ago
DbContext = App.Services.GetService(typeof(ApplicationDbContext)) as ApplicationDbContext;
6 years ago
4 years ago
SiteSetup = siteSetup.Value;
3 years ago
AssertNotNull(SiteSetup, nameof(SiteSetup));
6 years ago
3 years ago
TestingSetup = testingSetup.Value;
AssertNotNull(TestingSetup, nameof(TestingSetup));
6 years ago
4 years ago
Logger = _loggerFactory.CreateLogger<ServerSideFixture>();
3 years ago
AssertNotNull(Logger, nameof(Logger));
4 years ago
var builder = new DbConnectionStringBuilder
{
3 years ago
ConnectionString = Startup.TestingSetup.ConnectionStrings.Default
4 years ago
};
ConventionSet conventions = new ConventionSet();
modelBuilder = new ModelBuilder(conventions);
ApplicationDbContext context = new ApplicationDbContext();
TestingDatabase = (string)builder["Database"];
3 years ago
AssertNotNull(TestingDatabase, nameof(TestingDatabase));
4 years ago
4 years ago
Logger.LogInformation("ServerSideFixture created.");
}
4 years ago
4 years ago
private readonly ModelBuilder modelBuilder;
4 years ago
6 years ago
public string TestingDatabase { get; private set; }
public void CheckDbExistence()
{
using (
3 years ago
NpgsqlConnection cx = new NpgsqlConnection(Startup.TestingSetup.ConnectionStrings.Default))
{
cx.Open();
4 years ago
_logger.LogInformation($"check db for TestingDatabase:{TestingDatabase}");
var command = cx.CreateCommand();
6 years ago
command.CommandText = $"SELECT 1 FROM pg_database WHERE datname='{TestingDatabase}';";
4 years ago
dbCreated = (command.ExecuteScalar()!=null);
_logger.LogInformation($"DbCreated:{dbCreated}");
cx.Close();
}
}
4 years ago
public bool EnsureTestDb()
{
4 years ago
if (!DbCreated)
{
3 years ago
using (NpgsqlConnection cx =
new NpgsqlConnection(Startup.TestingSetup.ConnectionStrings.DatabaseCtor))
4 years ago
{
4 years ago
_logger.LogInformation($"create database for TestingDatabase : {TestingDatabase}");
4 years ago
cx.Open();
var command = cx.CreateCommand();
3 years ago
using (NpgsqlConnection ownercx = new NpgsqlConnection(Startup.TestingSetup.ConnectionStrings.Default))
4 years ago
command.CommandText = $"create database \"{TestingDatabase}\" OWNER \"{ownercx.UserName}\";";
3 years ago
4 years ago
_logger.LogInformation(command.CommandText);
4 years ago
command.ExecuteNonQuery();
3 years ago
cx.Close();
4 years ago
}
4 years ago
dbCreated = true;
}
4 years ago
return dbCreated;
}
4 years ago
public void DropTestDb()
{
4 years ago
if (dbCreated)
DbContext.Database.EnsureDeleted();
dbCreated = false;
}
3 years ago
public bool EnsureWeb()
{
if (WebApp!=null) return true;
Task.Run(() => {
var di = new DirectoryInfo(Startup.TestingSetup.YavscWebPath);
Assert.True(di.Exists);
Environment.CurrentDirectory = di.FullName;
WebHostBuilder = new WebHostBuilder();
webhostengnine = WebHostBuilder
.UseEnvironment("Development")
3 years ago
.UseServer("yavscTests")
3 years ago
.UseStartup<Yavsc.Startup>()
.Build();
WebApp = webhostengnine.Start();
}).Wait();
return true;
}
4 years ago
public void Dispose()
{
3 years ago
if (DbCreated) DropTestDb();
if (WebApp!=null) WebApp.Dispose();
if (Logger!=null) Logger.LogInformation("Disposing");
}
4 years ago
4 years ago
public bool DbCreated { get {
3 years ago
try {
4 years ago
CheckDbExistence();
3 years ago
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
_logger.LogError(ex.StackTrace);
}
4 years ago
return dbCreated; } }
3 years ago
public WebHostBuilder WebHostBuilder { get; private set; }
private IHostingEngine webhostengnine;
public IApplication WebApp { get; private set; }
}
6 years ago
}