diff --git a/LittleShop.Tests/Infrastructure/TestWebApplicationFactory.cs b/LittleShop.Tests/Infrastructure/TestWebApplicationFactory.cs index 4fcbebc..c629670 100644 --- a/LittleShop.Tests/Infrastructure/TestWebApplicationFactory.cs +++ b/LittleShop.Tests/Infrastructure/TestWebApplicationFactory.cs @@ -10,6 +10,13 @@ using LittleShop.Services; using Microsoft.Extensions.DependencyInjection.Extensions; using Moq; using System.Linq; +using Microsoft.AspNetCore.Authentication; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; +using System.Collections.Generic; +using System.Security.Claims; +using System.Text.Encodings.Web; +using System.Threading.Tasks; namespace LittleShop.Tests.Infrastructure; @@ -29,9 +36,52 @@ public class TestWebApplicationFactory : WebApplicationFactory options.UseInMemoryDatabase("InMemoryDbForTesting") .ConfigureWarnings(warnings => warnings.Default(WarningBehavior.Ignore))); + // Add test configuration + var configuration = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary + { + {"Jwt:Key", "test-key-that-is-at-least-32-characters-long-for-security"}, + {"Jwt:Issuer", "LittleShop"}, + {"Jwt:Audience", "LittleShop"}, + {"SilverPay:BaseUrl", "http://test.example.com"}, + {"SilverPay:ApiKey", "test-api-key"}, + {"CORS:AllowedOrigins:0", "http://localhost:3000"} + }) + .Build(); + + services.AddSingleton(configuration); + + // Add test authentication + services.AddAuthentication("Test") + .AddScheme("Test", options => { }); + // Mock external services that might cause issues in tests services.Replace(ServiceDescriptor.Scoped(_ => Mock.Of())); services.Replace(ServiceDescriptor.Scoped(_ => Mock.Of())); + services.Replace(ServiceDescriptor.Scoped(_ => Mock.Of())); + services.Replace(ServiceDescriptor.Scoped(_ => Mock.Of())); + services.Replace(ServiceDescriptor.Scoped(_ => Mock.Of())); + services.Replace(ServiceDescriptor.Scoped(_ => Mock.Of())); + + // Keep real implementations for business logic services + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + + // Add validation service + services.TryAddSingleton(); // Build service provider var sp = services.BuildServiceProvider(); @@ -66,4 +116,29 @@ public class TestWebApplicationFactory : WebApplicationFactory // Seed test data will be added as needed for specific tests context.SaveChanges(); } +} + +public class TestAuthenticationHandler : AuthenticationHandler +{ + public TestAuthenticationHandler(IOptionsMonitor options, + ILoggerFactory logger, UrlEncoder encoder) + : base(options, logger, encoder) + { + } + + protected override Task HandleAuthenticateAsync() + { + var claims = new[] + { + new Claim(ClaimTypes.Name, "TestUser"), + new Claim(ClaimTypes.NameIdentifier, "123"), + new Claim(ClaimTypes.Role, "Admin") + }; + + var identity = new ClaimsIdentity(claims, "Test"); + var principal = new ClaimsPrincipal(identity); + var ticket = new AuthenticationTicket(principal, "Test"); + + return Task.FromResult(AuthenticateResult.Success(ticket)); + } } \ No newline at end of file