diff --git a/.gitignore b/.gitignore
index 5fbdcfed..d3e3de9f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,3 +45,5 @@ yavsc-pre
*.env
generated/
*.lscache
+*.Development.json
+*.log
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 26bd0ea5..3b2164c8 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -33,7 +33,6 @@
-
diff --git a/src/Api/Program.cs b/src/Api/Program.cs
index a9d08352..c88951b6 100644
--- a/src/Api/Program.cs
+++ b/src/Api/Program.cs
@@ -65,8 +65,9 @@ internal class Program
new() { ValidateAudience = false, RoleClaimType = Constants.RoleClaimType };
options.MapInboundClaims = true;
});
-
+
services.AddDbContext(options =>
+
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient()
diff --git a/src/Yavsc.Blogs/Program.cs b/src/Yavsc.Blogs/Program.cs
index f5d7e2be..96918dc5 100644
--- a/src/Yavsc.Blogs/Program.cs
+++ b/src/Yavsc.Blogs/Program.cs
@@ -70,7 +70,7 @@ internal class Program
new() { ValidateAudience = false, RoleClaimType = Constants.RoleClaimType };
options.MapInboundClaims = true;
});
-
+
services.AddDbContext(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString(Constants.YavscConnectionStringName)));
diff --git a/src/Yavsc.Org/Extensions/HostingExtensions.cs b/src/Yavsc.Org/Extensions/HostingExtensions.cs
index 1eb53c84..67a7f2f7 100644
--- a/src/Yavsc.Org/Extensions/HostingExtensions.cs
+++ b/src/Yavsc.Org/Extensions/HostingExtensions.cs
@@ -85,18 +85,9 @@ public static class HostingExtensions
options.ResourcesPath = "Resources";
}).AddDataAnnotationsLocalization();
- bool useTestEmailSender = builder.Configuration.GetValue("UseTestEmailSender", false);
-
- if (useTestEmailSender)
- {
- services.AddTransient()
- .AddTransient();
- }
- else
- {
services.AddTransient()
.AddTransient();
- }
+
services.AddTransient()
.AddTransient()
@@ -147,21 +138,12 @@ public static class HostingExtensions
public static IdentityBuilder AddIdentityDBAndStores(this WebApplicationBuilder builder)
{
IServiceCollection services = builder.Services;
- bool useInMemory = builder.Configuration.GetValue("UseInMemoryDatabase", false);
-
- if (useInMemory)
+
+ services.AddDbContext(options =>
{
- services.AddDbContext(options =>
- options.UseSqlite("Data Source=file::memory:?cache=shared"));
- }
- else
- {
- services.AddDbContext(options =>
- {
- options.UseNpgsql(builder.Configuration.GetConnectionString(Constants.YavscConnectionStringName),
- options => options.MigrationsAssembly(typeof(Program).Assembly));
- });
- }
+ options.UseNpgsql(builder.Configuration.GetConnectionString(Constants.YavscConnectionStringName),
+ options => options.MigrationsAssembly(typeof(Program).Assembly));
+ });
var identityBuilder = services.AddIdentity(
options =>
@@ -280,8 +262,8 @@ public static class HostingExtensions
});
var migrationsAssembly = typeof(Program).GetTypeInfo().Assembly.GetName().Name;
var connectionString = builder.Configuration.GetConnectionString(Constants.YavscConnectionStringName);
- bool useInMemory = builder.Configuration.GetValue("UseInMemoryDatabase", false);
- string sqliteInMemoryConnectionString = "Data Source=file::memory:?cache=shared";
+
+ string sqliteConnectionString = $"Data Source={Path.Combine(Path.GetTempPath(), "yavsc_test.db")}";
var identityServerBuilder = builder.Services.AddIdentityServer(options =>
{
@@ -301,40 +283,15 @@ public static class HostingExtensions
.AddResourceStore()
.AddConfigurationStore(options =>
{
- if (useInMemory)
- {
- options.ConfigureDbContext = b => b.UseSqlite(sqliteInMemoryConnectionString);
- }
- else
- {
- options.ConfigureDbContext = b => b.UseNpgsql(connectionString,
- sql => sql.MigrationsAssembly(migrationsAssembly))
- .UseSeeding((context, _) =>
- {
- foreach (String scope in new string[] { "blog", "admin", "contract", "com"})
- {
- var testBlog = context.Set().FirstOrDefault(b => b.Name == scope);
- if (testBlog == null)
- {
- context.Set().Add(new ApiScope { Name = scope });
- context.SaveChanges();
- }
- }
-
- });
- }
+ options.ConfigureDbContext = b => b.UseNpgsql(connectionString,
+ sql => sql.MigrationsAssembly(migrationsAssembly))
+ .UseSeeding(EnsureDefaultApplicationScopes());
})
.AddOperationalStore(options =>
{
- if (useInMemory)
- {
- options.ConfigureDbContext = b => b.UseSqlite(sqliteInMemoryConnectionString);
- }
- else
- {
- options.ConfigureDbContext = b => b.UseNpgsql(connectionString,
- sql => sql.MigrationsAssembly(migrationsAssembly));
- }
+ options.ConfigureDbContext = b => b.UseNpgsql(connectionString,
+ sql => sql.MigrationsAssembly(migrationsAssembly));
+
});
if (builder.Environment.IsDevelopment())
@@ -344,6 +301,23 @@ public static class HostingExtensions
return identityServerBuilder;
}
+ private static Action EnsureDefaultApplicationScopes()
+ {
+ return (context, _) =>
+ {
+ foreach (String scope in new string[] { "blog", "admin", "contract", "com" })
+ {
+ var existentScope = context.Set().FirstOrDefault(b => b.Name == scope);
+ if (existentScope == null)
+ {
+ context.Set().Add(new ApiScope { Name = scope });
+ context.SaveChanges();
+ }
+ }
+
+ };
+ }
+
private static void ConfigureRequestLocalization(IServiceCollection services)
{
services.Configure(options =>
diff --git a/src/Yavsc.Org/Yavsc.Org.csproj b/src/Yavsc.Org/Yavsc.Org.csproj
index a1867d41..60d06a07 100644
--- a/src/Yavsc.Org/Yavsc.Org.csproj
+++ b/src/Yavsc.Org/Yavsc.Org.csproj
@@ -31,8 +31,6 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
-
-
diff --git a/src/Yavsc.Server/Services/MailSender.cs b/src/Yavsc.Server/Services/MailSender.cs
index b61dbd6b..14cb17ba 100644
--- a/src/Yavsc.Server/Services/MailSender.cs
+++ b/src/Yavsc.Server/Services/MailSender.cs
@@ -47,9 +47,9 @@ namespace Yavsc.Services
/// a MessageWithPayloadResponse,
/// bool somethingsent = (response.failure == 0 && response.success > 0)
///
- public async Task SendEmailAsync(string email, string subject, string htmlMessage)
+ public Task SendEmailAsync(string email, string subject, string htmlMessage)
{
- await SendEmailAsync("", email, subject, htmlMessage);
+ return SendEmailAsync("", email, subject, htmlMessage);
}
public async Task SendEmailAsync(string name, string email, string subject, string htmlMessage)
@@ -71,8 +71,9 @@ namespace Yavsc.Services
);
using (SmtpClient sc = new())
{
+ sc.Timeout = 30000;
sc.Connect(
- smtpSettings.Server,
+ smtpSettings.Host,
smtpSettings.Port,
SecureSocketOptions.Auto
);
diff --git a/src/Yavsc.Server/Services/TestMailSender.cs b/src/Yavsc.Server/Services/TestMailSender.cs
deleted file mode 100644
index 9e91dfef..00000000
--- a/src/Yavsc.Server/Services/TestMailSender.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Identity.UI.Services;
-using Microsoft.Extensions.Logging;
-using Yavsc.Interface;
-
-namespace Yavsc.Services
-{
- public class TestMailSender : ITrueEmailSender, IEmailSender
- {
- private readonly ILogger logger;
-
- public TestMailSender(ILoggerFactory loggerFactory)
- {
- logger = loggerFactory.CreateLogger();
- }
-
- public Task SendEmailAsync(string email, string subject, string htmlMessage)
- {
- logger.LogInformation("[TestMailSender] SendEmailAsync to {Email} subject={Subject}", email, subject);
- return Task.CompletedTask;
- }
-
- public Task SendEmailAsync(string name, string email, string subject, string htmlMessage)
- {
- logger.LogInformation("[TestMailSender] SendEmailAsync to {Email} subject={Subject} name={Name}", email, subject, name);
- return Task.FromResult($"test-message-{Guid.NewGuid()}");
- }
- }
-}
diff --git a/src/Yavsc.Server/Settings/SmtpSettings.cs b/src/Yavsc.Server/Settings/SmtpSettings.cs
index ca0cdd1d..7f1e3616 100644
--- a/src/Yavsc.Server/Settings/SmtpSettings.cs
+++ b/src/Yavsc.Server/Settings/SmtpSettings.cs
@@ -2,17 +2,13 @@ namespace Yavsc.Settings
{
public class SmtpSettings
{
- public string Server { get; set; }
public string Host
{
- get => Server;
- set => Server = value;
+ get ;
+ set ;
}
public int Port { get; set; }
-
- public string SenderName { get; set; }
- public string SenderEmail { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
diff --git a/test/yavscTests/Mandatory/BatchTests.cs b/test/yavscTests/Mandatory/BatchTests.cs
index e16bd368..c0e9990e 100644
--- a/test/yavscTests/Mandatory/BatchTests.cs
+++ b/test/yavscTests/Mandatory/BatchTests.cs
@@ -53,8 +53,6 @@ namespace yavscTests
public void HaveConfigurationRoot()
{
var builder = new ConfigurationBuilder();
- builder.AddJsonFile( "appsettings.json", false);
- builder.AddJsonFile( "appsettings.Development.json", true);
configurationRoot = builder.Build();
}
diff --git a/test/yavscTests/NonRegression/EMailling.cs b/test/yavscTests/NonRegression/EMailling.cs
index eab947eb..8e35f953 100644
--- a/test/yavscTests/NonRegression/EMailling.cs
+++ b/test/yavscTests/NonRegression/EMailling.cs
@@ -25,20 +25,18 @@ namespace yavscTests
[Fact]
public void SendEMailSynchrone()
{
- AssertAsync.CompletesIn(2, () =>
- {
- using IServiceScope scope = _serverFixture.Services.CreateScope();
- ITrueEmailSender mailSender = scope.ServiceProvider.GetRequiredService();
-
- output.WriteLine("SendEMailSynchrone ...");
- mailSender.SendEmailAsync
- (
- _serverFixture.SiteSettings.Owner.Name,
- _serverFixture.SiteSettings.Owner.EMail,
- $"monthly email",
- "test boby monthly email").Wait();
- });
- }
+ using IServiceScope scope = _serverFixture.Services.CreateScope();
+ ITrueEmailSender mailSender = scope.ServiceProvider.GetRequiredService();
+
+ output.WriteLine("SendEMailSynchrone ...");
+ mailSender.SendEmailAsync
+ (
+ _serverFixture.SiteSettings.Owner.Name,
+ _serverFixture.SiteSettings.Owner.EMail,
+ $"monthly email",
+ "test boby monthly email").Wait();
+
+ }
}
}
diff --git a/test/yavscTests/TestHelpers.cs b/test/yavscTests/TestHelpers.cs
deleted file mode 100644
index e44957d4..00000000
--- a/test/yavscTests/TestHelpers.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Threading.Tasks;
-
-namespace yavscTests {
-
- public static class AssertAsync {
- ///
- /// Completes In
- ///
- ///
- ///
- public static void CompletesIn(int timeoutFromSecond, Action action)
- {
- var task = Task.Run(action);
- var completedInTime = Task.WaitAll(new[] { task }, TimeSpan.FromSeconds(timeoutFromSecond));
-
- if (task.Exception != null)
- {
- if (task.Exception.InnerExceptions.Count == 1)
- {
- throw task.Exception.InnerExceptions[0];
- }
-
- throw task.Exception;
- }
-
- if (!completedInTime)
- {
- throw new TimeoutException($"Task did not complete in {timeoutFromSecond} seconds.");
- }
- }
- }
-
-}
-
-
-
diff --git a/test/yavscTests/WebServerFixture.cs b/test/yavscTests/WebServerFixture.cs
index e0a9549b..a569b29f 100644
--- a/test/yavscTests/WebServerFixture.cs
+++ b/test/yavscTests/WebServerFixture.cs
@@ -1,4 +1,4 @@
-using IdentityServer8.EntityFramework.DbContexts;
+
using IdentityServer8.EntityFramework.Entities;
using IdentityServer8.Models;
using Microsoft.AspNetCore.Builder;
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Server.Kestrel.Core;
+using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@@ -137,28 +137,16 @@ namespace isnd.tests
var builder = WebApplication.CreateBuilder();
builder.Environment.EnvironmentName = "Development";
-
// Set ContentRoot to the Yavsc.Org project directory so WebRootPath resolves correctly
var testAssemblyLocation = AppDomain.CurrentDomain.BaseDirectory;
var yavscOrgPath = Path.GetFullPath(Path.Combine(testAssemblyLocation, "../../src/Yavsc.Org"));
builder.Environment.ContentRootPath = yavscOrgPath;
ConfigureLogger();
- builder.Configuration
+ var config = builder.Configuration
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false)
- .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: false)
- .AddEnvironmentVariables()
- .AddInMemoryCollection(new Dictionary
- {
- ["UseInMemoryDatabase"] = "true",
- ["UseTestEmailSender"] = "true",
- ["Smtp:Host"] = "localhost",
- ["Smtp:Port"] = "25",
- ["Smtp:SenderName"] = "Yavsc Test",
- ["Smtp:SenderEmail"] = "test@example.com",
- ["Site:Audience"] = "https://localhost",
- ["Site:Authority"] = "https://localhost"
- });
+ .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: false, reloadOnChange: false)
+ .AddEnvironmentVariables().Build();
// Configure Kestrel for HTTPS with self-signed certificate on a dynamic port
builder.WebHost.ConfigureKestrel(options =>
@@ -174,6 +162,7 @@ namespace isnd.tests
_app = builder.ConfigureWebAppServices();
Services = _app.Services;
SiteSettings = _app.Services.GetRequiredService>().Value;
+ String cxStr = config.GetConnectionString(Constants.YavscConnectionStringName) ?? throw new InvalidOperationException("DefaultConnection string is not configured.");
using (var migrationScope = _app.Services.CreateScope())
{
@@ -181,7 +170,7 @@ namespace isnd.tests
db.Database.EnsureDeleted();
db.Database.EnsureCreated();
TestingUserName = "Tester";
- TestingUserPassword = "tesT456+*";
+ TestingUserPassword = "Test123!";
TestClientId = "testClientId";
TestingUserEmail = "test@no-reply.com";
TestingUser = null;
diff --git a/test/yavscTests/appsettings.json b/test/yavscTests/appsettings.json
index 28b36a57..107dae86 100644
--- a/test/yavscTests/appsettings.json
+++ b/test/yavscTests/appsettings.json
@@ -1,6 +1,7 @@
{
"Site": {
- "Authority": "https://localhost",
+ "Audience": "https://localhost",
+ "Authority": "https://mercure.pschneider.fr",
"Title": "Yavsc dev",
"Slogan": "Yavsc : WIP.",
"Banner": "/images/yavsc.png",
@@ -26,14 +27,11 @@
}
},
"Smtp": {
- "Host": "localhost",
- "Port": 25,
- "EnableSSL": false
+ "Server": "localhost",
+ "Port": 465
},
"Logging": {
- "IncludeScopes": {
-
- },
+ "IncludeScopes": {},
"LogLevel": {
"Default": "Debug",
"System": "Warning",
@@ -41,8 +39,8 @@
}
},
"ConnectionStrings": {
- "YavscConnection": "Server=lame-NpgsqlHostName;Port=5432;Database=lame-DataBase;Username=lame-Username;Password=lame-dbPassword;"
- },
+ "YavscConnection": "Server=localhost;Port=5432;Database=testingYavsc;Username=lame-Username;Password=lame-dbPassword;"
+ },
"DataProtection": {
"Keys": {
"Dir": "DataProtection-Keys"
@@ -56,14 +54,14 @@
"Default": "lame-default-connection-string",
"DatabaseCtor": "lame-database-ctor-connection-string"
},
- "YavscWebPath": "../../src/Yavsc",
+ "YavscWebPath": "../../src/Yavsc",
"ValidCreds": {
- "UserName": "lame-user",
- "Password": "lame-password"
+ "UserName": "lame-user",
+ "Password": "lame-password"
},
"InvalidCreds": {
- "UserName": "fakeuser",
- "Password": "f/\\kePassw0rd"
+ "UserName": "fakeuser",
+ "Password": "f/\\kePassw0rd"
}
}
-}
+}
\ No newline at end of file
diff --git a/test/yavscTests/yavscTests.csproj b/test/yavscTests/yavscTests.csproj
index df1ff580..6fd4a752 100644
--- a/test/yavscTests/yavscTests.csproj
+++ b/test/yavscTests/yavscTests.csproj
@@ -1,10 +1,11 @@
-
+
net10.0
enable
enable
false
Yavsc.Tests
+ 78a4efec-68dc-4745-ba06-d8545ef9ee91
@@ -29,6 +30,11 @@
Always
+
+
+ Always
+
+
@@ -37,4 +43,5 @@
+