From 6cc0c519d288723b3164fd2e22b2017fb78da4a2 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Mon, 20 Apr 2026 00:35:51 +0100 Subject: [PATCH] tests OK --- .gitignore | 2 + Directory.Packages.props | 1 - src/Api/Program.cs | 3 +- src/Yavsc.Blogs/Program.cs | 2 +- src/Yavsc.Org/Extensions/HostingExtensions.cs | 88 +++++++------------ src/Yavsc.Org/Yavsc.Org.csproj | 2 - src/Yavsc.Server/Services/MailSender.cs | 7 +- src/Yavsc.Server/Services/TestMailSender.cs | 30 ------- src/Yavsc.Server/Settings/SmtpSettings.cs | 8 +- test/yavscTests/Mandatory/BatchTests.cs | 2 - test/yavscTests/NonRegression/EMailling.cs | 26 +++--- test/yavscTests/TestHelpers.cs | 37 -------- test/yavscTests/WebServerFixture.cs | 25 ++---- test/yavscTests/appsettings.json | 28 +++--- test/yavscTests/yavscTests.csproj | 9 +- 15 files changed, 82 insertions(+), 188 deletions(-) delete mode 100644 src/Yavsc.Server/Services/TestMailSender.cs delete mode 100644 test/yavscTests/TestHelpers.cs 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 @@ +