diff --git a/EssentialCSharp.Web.Tests/FunctionalTests.cs b/EssentialCSharp.Web.Tests/FunctionalTests.cs index 18b7d75d..abdf499d 100644 --- a/EssentialCSharp.Web.Tests/FunctionalTests.cs +++ b/EssentialCSharp.Web.Tests/FunctionalTests.cs @@ -20,6 +20,31 @@ public async Task WhenTheApplicationStarts_ItCanLoadLoadPages(string relativeUrl Assert.Equal(HttpStatusCode.OK, response.StatusCode); } + [Theory] + [InlineData("/guidelines?rid=test-referral-id")] + [InlineData("/about?rid=abc123")] + [InlineData("/hello-world?rid=user-referral")] + [InlineData("/guidelines?rid=")] + [InlineData("/about?rid= ")] + [InlineData("/guidelines?foo=bar")] + [InlineData("/about?someOtherParam=value")] + public async Task WhenPagesAreAccessed_TheyReturnHtml(string relativeUrl) + { + using WebApplicationFactory factory = new(); + + HttpClient client = factory.CreateClient(); + using HttpResponseMessage response = await client.GetAsync(relativeUrl); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + // Ensure the response has content (not blank) + string content = await response.Content.ReadAsStringAsync(); + Assert.NotEmpty(content); + + // Verify it's actually HTML content, not just whitespace + Assert.Contains(" { + private static string SqlConnectionString => $"DataSource=file:{Guid.NewGuid()}?mode=memory&cache=shared"; + private SqliteConnection? _Connection; + protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureServices(services => @@ -21,19 +25,30 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) services.Remove(descriptor); } + _Connection = new SqliteConnection(SqlConnectionString); + _Connection.Open(); + services.AddDbContext(options => { - options.UseSqlite("Data Source=:memory:"); + options.UseSqlite(_Connection); }); using ServiceProvider serviceProvider = services.BuildServiceProvider(); - using IServiceScope scope = serviceProvider.CreateScope(); IServiceProvider scopedServices = scope.ServiceProvider; EssentialCSharpWebContext db = scopedServices.GetRequiredService(); - db.Database.OpenConnection(); db.Database.EnsureCreated(); }); } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (disposing) + { + _Connection?.Dispose(); + _Connection = null; + } + } } diff --git a/EssentialCSharp.Web/Middleware/ReferralTrackingMiddleware.cs b/EssentialCSharp.Web/Middleware/ReferralTrackingMiddleware.cs index 27e72eef..4306becf 100644 --- a/EssentialCSharp.Web/Middleware/ReferralTrackingMiddleware.cs +++ b/EssentialCSharp.Web/Middleware/ReferralTrackingMiddleware.cs @@ -1,4 +1,3 @@ -using System.Security.Claims; using System.Web; using EssentialCSharp.Web.Areas.Identity.Data; using EssentialCSharp.Web.Services.Referrals; @@ -25,6 +24,7 @@ public async Task InvokeAsync(HttpContext context, IReferralService referralServ await _Next(context); return; } + if (context.User is { Identity.IsAuthenticated: true } claimsUser) { referralService.TrackReferralAsync(referralId, claimsUser); @@ -33,5 +33,7 @@ public async Task InvokeAsync(HttpContext context, IReferralService referralServ { referralService.TrackReferralAsync(referralId, null); } + + await _Next(context); } }