From 1d7239ab89c398c12159f8eb445f9da62a5a1448 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 27 Sep 2026 17:09:43 +0000 Subject: [PATCH 1/2] [repo-assist] Add referral service tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../ReferralServiceTests.cs | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 EssentialCSharp.Web.Tests/ReferralServiceTests.cs diff --git a/EssentialCSharp.Web.Tests/ReferralServiceTests.cs b/EssentialCSharp.Web.Tests/ReferralServiceTests.cs new file mode 100644 index 00000000..8a139e8e --- /dev/null +++ b/EssentialCSharp.Web.Tests/ReferralServiceTests.cs @@ -0,0 +1,130 @@ +using System.Security.Claims; +using EssentialCSharp.Web.Areas.Identity.Data; +using EssentialCSharp.Web.Data; +using EssentialCSharp.Web.Extensions; +using EssentialCSharp.Web.Services.Referrals; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; + +namespace EssentialCSharp.Web.Tests; + +public class ReferralServiceTests : IntegrationTestBase +{ + [Test] + public async Task EnsureReferralIdAsync_NullUser_ReturnsNull() + { + string? referralId = await InServiceScopeAsync(async services => + await services.GetRequiredService().EnsureReferralIdAsync(null)); + + await Assert.That(referralId).IsNull(); + } + + [Test] + public async Task TrackReferralAsync_ExistingReferrer_IncrementsReferralCount() + { + string userId = CreateUserId(); + string referralId = await CreateUserWithReferralIdAsync(userId); + await CreateUserAsync(CreateUserId()); + + await InServiceScopeAsync(async services => + { + services.GetRequiredService().TrackReferralAsync(referralId, null); + await services.GetRequiredService().SaveChangesAsync(); + }); + + int referralCount = await GetReferralCountAsync(userId); + await Assert.That(referralCount).IsEqualTo(1); + } + + [Test] + public async Task TrackReferralAsync_UserHasSameReferralId_DoesNotIncrementReferralCount() + { + string userId = CreateUserId(); + string referralId = await CreateUserWithReferralIdAsync(userId); + ClaimsPrincipal user = new(new ClaimsIdentity( + [ + new Claim(ClaimsExtensions.ReferrerIdClaimType, referralId) + ])); + + await InServiceScopeAsync(async services => + { + services.GetRequiredService().TrackReferralAsync(referralId, user); + await services.GetRequiredService().SaveChangesAsync(); + }); + + int referralCount = await GetReferralCountAsync(userId); + await Assert.That(referralCount).IsEqualTo(0); + } + + [Test] + public async Task TrackReferralAsync_UnknownReferralId_DoesNotThrowOrChangeUsers() + { + string userId = CreateUserId(); + await CreateUserAsync(userId); + + await InServiceScopeAsync(async services => + { + services.GetRequiredService().TrackReferralAsync("unknown", null); + await services.GetRequiredService().SaveChangesAsync(); + }); + + int referralCount = await GetReferralCountAsync(userId); + await Assert.That(referralCount).IsEqualTo(0); + } + + private async Task CreateUserWithReferralIdAsync(string userId) + { + await CreateUserAsync(userId); + + return await InServiceScopeAsync(async services => + { + EssentialCSharpWebContext dbContext = + services.GetRequiredService(); + UserManager userManager = + services.GetRequiredService>(); + EssentialCSharpWebUser user = await userManager.FindByIdAsync(userId) + ?? throw new InvalidOperationException($"Test user '{userId}' was not created."); + + string referralId = await services.GetRequiredService() + .EnsureReferralIdAsync(user) + ?? throw new InvalidOperationException("A referral ID was not generated."); + await dbContext.SaveChangesAsync(); + return referralId; + }); + } + + private async Task CreateUserAsync(string userId) + { + _ = Factory; + await InServiceScopeAsync(async services => + { + UserManager userManager = + services.GetRequiredService>(); + IdentityResult result = await userManager.CreateAsync( + new EssentialCSharpWebUser + { + Id = userId, + UserName = $"{userId}@example.test", + Email = $"{userId}@example.test" + }); + if (!result.Succeeded) + { + throw new InvalidOperationException( + $"Could not create test user: {string.Join(", ", result.Errors.Select(error => error.Description))}"); + } + }); + } + + private async Task GetReferralCountAsync(string userId) + { + _ = Factory; + return await InServiceScopeAsync(async services => + await services.GetRequiredService().Users + .Where(user => user.Id == userId) + .Select(user => user.ReferralCount) + .SingleAsync()); + } + + private static string CreateUserId() => $"user-{Guid.NewGuid():N}"; +} From b930f5140650baa6e74be1e4ac8ac1dc98f54673 Mon Sep 17 00:00:00 2001 From: Benjamin Michaelis Date: Fri, 16 Oct 2026 18:56:25 -0700 Subject: [PATCH 2/2] test: clarify referral tracking persistence --- .../ReferralServiceTests.cs | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/EssentialCSharp.Web.Tests/ReferralServiceTests.cs b/EssentialCSharp.Web.Tests/ReferralServiceTests.cs index 8a139e8e..2f99f677 100644 --- a/EssentialCSharp.Web.Tests/ReferralServiceTests.cs +++ b/EssentialCSharp.Web.Tests/ReferralServiceTests.cs @@ -25,16 +25,16 @@ public async Task TrackReferralAsync_ExistingReferrer_IncrementsReferralCount() { string userId = CreateUserId(); string referralId = await CreateUserWithReferralIdAsync(userId); - await CreateUserAsync(CreateUserId()); + string unrelatedUserId = CreateUserId(); + await CreateUserAsync(unrelatedUserId); - await InServiceScopeAsync(async services => - { - services.GetRequiredService().TrackReferralAsync(referralId, null); - await services.GetRequiredService().SaveChangesAsync(); - }); + InServiceScope(services => + services.GetRequiredService().TrackReferralAsync(referralId, null)); int referralCount = await GetReferralCountAsync(userId); await Assert.That(referralCount).IsEqualTo(1); + int unrelatedReferralCount = await GetReferralCountAsync(unrelatedUserId); + await Assert.That(unrelatedReferralCount).IsEqualTo(0); } [Test] @@ -47,27 +47,21 @@ public async Task TrackReferralAsync_UserHasSameReferralId_DoesNotIncrementRefer new Claim(ClaimsExtensions.ReferrerIdClaimType, referralId) ])); - await InServiceScopeAsync(async services => - { - services.GetRequiredService().TrackReferralAsync(referralId, user); - await services.GetRequiredService().SaveChangesAsync(); - }); + InServiceScope(services => + services.GetRequiredService().TrackReferralAsync(referralId, user)); int referralCount = await GetReferralCountAsync(userId); await Assert.That(referralCount).IsEqualTo(0); } [Test] - public async Task TrackReferralAsync_UnknownReferralId_DoesNotThrowOrChangeUsers() + public async Task TrackReferralAsync_UnknownReferralId_DoesNotThrowOrChangeUser() { string userId = CreateUserId(); await CreateUserAsync(userId); - await InServiceScopeAsync(async services => - { - services.GetRequiredService().TrackReferralAsync("unknown", null); - await services.GetRequiredService().SaveChangesAsync(); - }); + InServiceScope(services => + services.GetRequiredService().TrackReferralAsync("unknown", null)); int referralCount = await GetReferralCountAsync(userId); await Assert.That(referralCount).IsEqualTo(0); @@ -79,8 +73,6 @@ private async Task CreateUserWithReferralIdAsync(string userId) return await InServiceScopeAsync(async services => { - EssentialCSharpWebContext dbContext = - services.GetRequiredService(); UserManager userManager = services.GetRequiredService>(); EssentialCSharpWebUser user = await userManager.FindByIdAsync(userId) @@ -89,14 +81,12 @@ private async Task CreateUserWithReferralIdAsync(string userId) string referralId = await services.GetRequiredService() .EnsureReferralIdAsync(user) ?? throw new InvalidOperationException("A referral ID was not generated."); - await dbContext.SaveChangesAsync(); return referralId; }); } private async Task CreateUserAsync(string userId) { - _ = Factory; await InServiceScopeAsync(async services => { UserManager userManager = @@ -118,7 +108,6 @@ await InServiceScopeAsync(async services => private async Task GetReferralCountAsync(string userId) { - _ = Factory; return await InServiceScopeAsync(async services => await services.GetRequiredService().Users .Where(user => user.Id == userId)