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/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.Abstract/Billing/BillingCodes.cs b/src/Yavsc.Abstract/Billing/BillingCodes.cs index 9ede8cf6..5c5cfde8 100644 --- a/src/Yavsc.Abstract/Billing/BillingCodes.cs +++ b/src/Yavsc.Abstract/Billing/BillingCodes.cs @@ -2,9 +2,9 @@ namespace Yavsc.Models.Billing { public static class BillingCodes { - public const string Rdv = "Rdv"; - public const string MBrush = "MBrush"; + public const string Rdv = nameof(Rdv); + public const string MBrush = nameof(MBrush); - public const string Brush = "Brush"; + public const string Brush = nameof(Brush); } } \ No newline at end of file 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 4eedb087..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.UseInMemoryDatabase("YavscInMemory")); - } - 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 inMemoryDatabaseName = "YavscInMemory"; + + 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.UseInMemoryDatabase(inMemoryDatabaseName); - } - 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.UseInMemoryDatabase(inMemoryDatabaseName); - } - 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 790838ec..60d06a07 100644 --- a/src/Yavsc.Org/Yavsc.Org.csproj +++ b/src/Yavsc.Org/Yavsc.Org.csproj @@ -31,7 +31,6 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - diff --git a/src/Yavsc.Server/Helpers/WorkflowHelpers.cs b/src/Yavsc.Server/Helpers/WorkflowHelpers.cs index c0531ae6..6814ccd0 100644 --- a/src/Yavsc.Server/Helpers/WorkflowHelpers.cs +++ b/src/Yavsc.Server/Helpers/WorkflowHelpers.cs @@ -46,26 +46,15 @@ namespace Yavsc.Helpers lock (_billingLock) { string typeName = typeof(T).Name; - - // Only add if not already present (idempotent operation) - if (!BillingService.Billing.ContainsKey(code)) - { - BillingService.Billing.Add(code, getter); - } - else if (!BillingService.GlobalBillingMap.ContainsKey(typeName) || - BillingService.GlobalBillingMap[typeName] != code) - { - throw new InvalidOperationException($"Billing setup: code '{code}' already registered"); - } - - if (!BillingService.GlobalBillingMap.ContainsKey(typeName)) - { - BillingService.GlobalBillingMap.Add(typeName, code); - } - else if (BillingService.GlobalBillingMap[typeName] != code) + if (BillingService.GlobalBillingMap.ContainsKey(typeName)) { throw new InvalidOperationException($"Billing setup: type '{typeName}' already registered with different code"); } + if (BillingService.Billing.ContainsKey(code)) + { + throw new InvalidOperationException($"Billing setup: code '{code}' already registered with different type"); + } + BillingService.Billing.Add(code, getter); } } diff --git a/src/Yavsc.Server/Models/ApplicationDbContext.cs b/src/Yavsc.Server/Models/ApplicationDbContext.cs index 9908fe74..6b73abba 100644 --- a/src/Yavsc.Server/Models/ApplicationDbContext.cs +++ b/src/Yavsc.Server/Models/ApplicationDbContext.cs @@ -42,18 +42,30 @@ namespace Yavsc.Models } public ApplicationDbContext(DbContextOptions options) : base(options) { + if (Database.IsRelational()) + { + Database.SetCommandTimeout(180); + } } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); + if (Database.IsNpgsql()) + { + NOW_SQL="LOCALTIMESTAMP"; + } + else + { + NOW_SQL="CURRENT_TIMESTAMP"; + } builder.UseIdentityByDefaultColumns(); // Customize the ASP.NET Identity model and override the defaults if needed. // For example, you can rename the ASP.NET Identity table names and more. // Add your customizations after calling base.OnModelCreating(builder); builder.Entity().HasKey(x => new { x.OwnerId, x.UserId }); - builder.Entity().Property(x => x.DeclarationDate).HasDefaultValueSql("LOCALTIMESTAMP"); + builder.Entity().Property(x => x.DeclarationDate).HasDefaultValueSql(NOW_SQL); builder.Entity().HasKey(x => new { x.PostId, x.TagId }); builder.Entity().Property(u => u.FullName).IsRequired(false); @@ -336,7 +348,6 @@ namespace Yavsc.Models public DbSet PersistedGrants { get; set; } public DbSet DeviceFlowCodes { get; set; } - public DbSet YavscApiScopes { get; set; } - + public string NOW_SQL { get; private set; } } } 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/BillingServiceTests.cs b/test/yavscTests/NonRegression/BillingServiceTests.cs index 7b4f2705..58dddcae 100644 --- a/test/yavscTests/NonRegression/BillingServiceTests.cs +++ b/test/yavscTests/NonRegression/BillingServiceTests.cs @@ -39,7 +39,7 @@ namespace yavscTests var firstRegistrar = new Func((db, id) => db.HairCutQueries.Include(q => q.Prestation).Include(q => q.Regularisation).Single(q => q.Id == id)); - const string testCode = "TestBrush"; + const string testCode = "Brush"; Assert.Throws(() => WorkflowHelpers.RegisterBilling(testCode, firstRegistrar)); 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 da9c8076..a569b29f 100644 --- a/test/yavscTests/WebServerFixture.cs +++ b/test/yavscTests/WebServerFixture.cs @@ -1,3 +1,4 @@ + using IdentityServer8.EntityFramework.Entities; using IdentityServer8.Models; using Microsoft.AspNetCore.Builder; @@ -5,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; @@ -136,20 +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" - }); + .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 => @@ -165,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()) { @@ -172,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; @@ -181,6 +179,60 @@ namespace isnd.tests AddAuthorizedClient(migrationScope, TestClientId, TestClientSecret); TestingUser = await db.Users.FirstOrDefaultAsync(u => u.UserName == TestingUserName); } + + // Seed IdentityServer ConfigurationDbContext with API resources and scopes + using (var configScope = _app.Services.CreateScope()) + { + try + { + var configDbContext = configScope.ServiceProvider.GetService(); + if (configDbContext != null) + { + configDbContext.Database.EnsureCreated(); + + // Add test API scope if it doesn't exist + var testScope = configDbContext.ApiScopes.FirstOrDefault(s => s.Name == "test"); + if (testScope == null) + { + configDbContext.ApiScopes.Add(new IdentityServer8.EntityFramework.Entities.ApiScope + { + Name = "test", + Enabled = true, + DisplayName = "Test API Scope", + Description = "Scope for testing purposes", + UserClaims = new List + { + new IdentityServer8.EntityFramework.Entities.ApiScopeClaim { Type = "role" }, + new IdentityServer8.EntityFramework.Entities.ApiScopeClaim { Type = "email" } + } + }); + + // Add a basic API resource for the test scope + var apiResource = new IdentityServer8.EntityFramework.Entities.ApiResource + { + Name = "testapi", + DisplayName = "Test API", + Enabled = true, + Scopes = new List + { + new IdentityServer8.EntityFramework.Entities.ApiResourceScope + { + Scope = "test" + } + } + }; + configDbContext.ApiResources.Add(apiResource); + configDbContext.SaveChanges(); + } + } + } + catch (Exception ex) + { + _sharedLogger?.LogWarning($"Failed to seed ConfigurationDbContext: {ex.Message}"); + // Don't fail the fixture if seeding fails + } + } + await _app!.ConfigurePipeline(); _app.UseSession(); await _app.StartAsync(); @@ -212,66 +264,59 @@ namespace isnd.tests private void AddAuthorizedClient(IServiceScope scope, string testClientId, string testClientSecret) { + var configDb = scope.ServiceProvider.GetRequiredService(); + if (configDb == null) + throw new InvalidOperationException("ConfigurationDbContext is not available for IdentityServer client seeding."); - var db = scope.ServiceProvider.GetRequiredService(); Client testingClient = new Client { ClientId = testClientId, AccessTokenLifetime = 3600000, AccessTokenType = 1, - BackChannelLogoutUri = SiteSettings!.Audience, ClientName = "Testing client", - Enabled = true + Enabled = true, + RequireClientSecret = true }; - db.Clients.Add(testingClient); - db.SaveChanges(); + configDb.Set().Add(testingClient); + configDb.SaveChanges(); + + var apiScope = new IdentityServer8.EntityFramework.Entities.ApiScope + { + Name = "test", + DisplayName = "Test Scope", + Description = "Scope for testing", + Enabled = true, + Required = false, + ShowInDiscoveryDocument = true, + Emphasize = false + }; + configDb.Set().Add(apiScope); + ClientSecret secret = new ClientSecret { Value = testClientSecret.Sha256(), + Type = IdentityServer8.IdentityServerConstants.SecretTypes.SharedSecret, ClientId = testingClient.Id }; - db.ClientSecrets.Add(secret); + configDb.Set().Add(secret); - var testOrigin = new ClientCorsOrigin - { - ClientId = testingClient.Id, - Origin = SiteSettings!.Audience - - }; - db.ClientCorsOrigins.Add(testOrigin); - db.ClientGrantTypes.Add(new ClientGrantType + configDb.Set().Add(new ClientGrantType { ClientId = testingClient.Id, GrantType = "client_credentials" }); - db.ClientGrantTypes.Add(new ClientGrantType + configDb.Set().Add(new ClientGrantType { ClientId = testingClient.Id, GrantType = "password" }); - db.ClientGrantTypes.Add(new ClientGrantType - { - ClientId = testingClient.Id, - GrantType = "code" - }); - db.ClientScopes.Add(new ClientScope + configDb.Set().Add(new ClientScope { ClientId = testingClient.Id, Scope = "test" }); - db.ApiScopes.Add(new IdentityServer8.EntityFramework.Entities.ApiScope - { - Name = "test", - Enabled = true - }); - db.ClientRedirectUris.Add(new ClientRedirectUri - { - ClientId = testingClient.Id, - RedirectUri = SiteSettings!.Audience - }); - - db.SaveChanges(); + configDb.SaveChanges(); } public void EnsureUser(string testingUserName, string password, string email, IServiceScope scope) 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 @@ +