@@ -26,7 +26,7 @@ public class AuditInterceptorTests
|
||||
var ctx = new DefaultHttpContext { User = new(new ClaimsIdentity(claims)) };
|
||||
var mock = new Mock<IHttpContextAccessor>();
|
||||
mock.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new AuditSaveChangesInterceptor(mock.Object);
|
||||
return new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(mock.Object));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -86,7 +86,8 @@ public class AuthServiceTests
|
||||
Mock<UserManager<AppUser>> umMock,
|
||||
Mock<ITokenService> tsMock,
|
||||
AppDbContext db)
|
||||
=> new(umMock.Object, tsMock.Object, db, BuildPermissionService().Object, BuildConfig());
|
||||
=> new(umMock.Object, tsMock.Object, db, BuildPermissionService().Object,
|
||||
ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance, BuildConfig());
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Login tests
|
||||
|
||||
@@ -49,7 +49,7 @@ public class DisbursementServiceTests
|
||||
return new AppDbContext(new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
.ConfigureWarnings(w => w.Ignore(InMemoryEventId.TransactionIgnoredWarning))
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(mock.Object)).Options);
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(mock.Object))).Options);
|
||||
}
|
||||
|
||||
private static DisbursementService SvcAs(AppDbContext db, FakeStorage fs, string userId)
|
||||
@@ -57,7 +57,7 @@ public class DisbursementServiceTests
|
||||
var http = new Mock<IHttpContextAccessor>();
|
||||
var ctx = new DefaultHttpContext { User = new(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, userId) })) };
|
||||
http.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new DisbursementService(db, http.Object, fs, new FakePrint());
|
||||
return new DisbursementService(db, http.Object, fs, new FakePrint(), ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
}
|
||||
|
||||
private static (DisbursementService svc, AppDbContext db, FakeStorage fs) Build(string userId = "fin")
|
||||
@@ -203,7 +203,7 @@ public class DisbursementServiceTests
|
||||
var http = new Mock<IHttpContextAccessor>();
|
||||
var ctx = new DefaultHttpContext { User = new(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, userId) })) };
|
||||
http.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return (new DisbursementService(db, http.Object, fs, print), db, fs, print);
|
||||
return (new DisbursementService(db, http.Object, fs, print, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance), db, fs, print);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -20,7 +20,7 @@ public class ExpenseCategoryServiceTests
|
||||
mock.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new AppDbContext(new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(mock.Object)).Options);
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(mock.Object))).Options);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -33,7 +33,7 @@ public class ExpenseServiceTests
|
||||
mock.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new AppDbContext(new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(mock.Object)).Options);
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(mock.Object))).Options);
|
||||
}
|
||||
|
||||
private static (ExpenseService svc, AppDbContext db, FakeStorage fs) Build(string userId = "u1")
|
||||
@@ -52,7 +52,7 @@ public class ExpenseServiceTests
|
||||
var http = new Mock<IHttpContextAccessor>();
|
||||
var ctx = new DefaultHttpContext { User = new(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, userId) })) };
|
||||
http.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new ExpenseService(db, http.Object, fs);
|
||||
return new ExpenseService(db, http.Object, fs, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
}
|
||||
|
||||
// Builds a service whose principal carries ONLY the "sub" claim (no NameIdentifier),
|
||||
@@ -62,7 +62,7 @@ public class ExpenseServiceTests
|
||||
var http = new Mock<IHttpContextAccessor>();
|
||||
var ctx = new DefaultHttpContext { User = new(new ClaimsIdentity(new[] { new Claim("sub", userId) })) };
|
||||
http.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new ExpenseService(db, http.Object, fs);
|
||||
return new ExpenseService(db, http.Object, fs, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
}
|
||||
|
||||
private static CreateExpenseRequest Reimb() => new()
|
||||
|
||||
@@ -23,7 +23,7 @@ public class GivingCategoryServiceTests
|
||||
|
||||
private static AppDbContext BuildDb(string userId = "test-user")
|
||||
{
|
||||
var interceptor = new AuditSaveChangesInterceptor(BuildAccessor(userId));
|
||||
var interceptor = new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(BuildAccessor(userId)));
|
||||
return new AppDbContext(
|
||||
new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
|
||||
@@ -24,7 +24,7 @@ public class GivingServiceTests
|
||||
|
||||
private static AppDbContext BuildDb(string userId = "test-user")
|
||||
{
|
||||
var interceptor = new AuditSaveChangesInterceptor(BuildAccessor(userId));
|
||||
var interceptor = new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(BuildAccessor(userId)));
|
||||
return new AppDbContext(
|
||||
new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
|
||||
@@ -29,7 +29,7 @@ public class MemberServiceTests
|
||||
private static AppDbContext BuildDb(string userId = "test-user")
|
||||
{
|
||||
var accessor = BuildAccessor(userId);
|
||||
var interceptor = new AuditSaveChangesInterceptor(accessor);
|
||||
var interceptor = new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(accessor));
|
||||
return new AppDbContext(
|
||||
new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
|
||||
@@ -20,7 +20,7 @@ public class MinistryServiceTests
|
||||
mock.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new AppDbContext(new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(mock.Object)).Options);
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(mock.Object))).Options);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -21,7 +21,7 @@ public class MonthlyStatementServiceTests
|
||||
mock.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new AppDbContext(new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(mock.Object)).Options);
|
||||
.AddInterceptors(new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(mock.Object))).Options);
|
||||
}
|
||||
|
||||
private static MonthlyStatementService Build(AppDbContext db)
|
||||
@@ -29,7 +29,7 @@ public class MonthlyStatementServiceTests
|
||||
var mock = new Mock<IHttpContextAccessor>();
|
||||
var ctx = new DefaultHttpContext { User = new(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, "test-user") })) };
|
||||
mock.Setup(x => x.HttpContext).Returns(ctx);
|
||||
return new MonthlyStatementService(db, mock.Object);
|
||||
return new MonthlyStatementService(db, mock.Object, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -36,7 +36,7 @@ public class OfferingSessionServiceTests
|
||||
|
||||
private static AppDbContext BuildDb(string userId = "test-user")
|
||||
{
|
||||
var interceptor = new AuditSaveChangesInterceptor(BuildAccessor(userId));
|
||||
var interceptor = new AuditSaveChangesInterceptor(new ROLAC.API.Services.Logging.CurrentUserAccessor(BuildAccessor(userId)));
|
||||
return new AppDbContext(
|
||||
new DbContextOptionsBuilder<AppDbContext>()
|
||||
.UseInMemoryDatabase(Guid.NewGuid().ToString())
|
||||
|
||||
@@ -49,7 +49,9 @@ public class PermissionServiceTests
|
||||
return new Harness
|
||||
{
|
||||
Provider = provider,
|
||||
Service = new PermissionService(scopeFactory, cache),
|
||||
Service = new PermissionService(scopeFactory, cache,
|
||||
new ROLAC.API.Services.Logging.SystemLogQueue(),
|
||||
new Microsoft.AspNetCore.Http.HttpContextAccessor()),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ public class UserManagementServiceTests
|
||||
mgr.Setup(m => m.Users)
|
||||
.Returns(new List<AppUser>().AsQueryable());
|
||||
|
||||
var svc = new UserManagementService(mgr.Object, db);
|
||||
var svc = new UserManagementService(mgr.Object, db, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
var result = await svc.CreateAsync(new CreateUserRequest
|
||||
{
|
||||
MemberId = member.Id,
|
||||
@@ -97,7 +97,7 @@ public class UserManagementServiceTests
|
||||
var mgr = BuildUserManager();
|
||||
mgr.Setup(m => m.Users)
|
||||
.Returns(new List<AppUser>().AsQueryable());
|
||||
var svc = new UserManagementService(mgr.Object, db);
|
||||
var svc = new UserManagementService(mgr.Object, db, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
|
||||
await Assert.ThrowsAsync<InvalidOperationException>(() =>
|
||||
svc.CreateAsync(new CreateUserRequest
|
||||
@@ -131,7 +131,7 @@ public class UserManagementServiceTests
|
||||
// The service checks _userManager.Users — we need to return the existing user
|
||||
mgr.Setup(m => m.Users)
|
||||
.Returns(new List<AppUser> { existingUser }.AsQueryable());
|
||||
var svc = new UserManagementService(mgr.Object, db);
|
||||
var svc = new UserManagementService(mgr.Object, db, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
|
||||
await Assert.ThrowsAsync<InvalidOperationException>(() =>
|
||||
svc.CreateAsync(new CreateUserRequest
|
||||
@@ -147,7 +147,7 @@ public class UserManagementServiceTests
|
||||
var user = new AppUser
|
||||
{ Id = "u1", UserName = "a@b.com", Email = "a@b.com", IsActive = true };
|
||||
var mgr = BuildUserManager(findResult: user);
|
||||
var svc = new UserManagementService(mgr.Object, db);
|
||||
var svc = new UserManagementService(mgr.Object, db, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
|
||||
await svc.DeactivateAsync("u1");
|
||||
|
||||
@@ -160,7 +160,7 @@ public class UserManagementServiceTests
|
||||
{
|
||||
using var db = BuildDb();
|
||||
var mgr = BuildUserManager(findResult: null);
|
||||
var svc = new UserManagementService(mgr.Object, db);
|
||||
var svc = new UserManagementService(mgr.Object, db, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
|
||||
await Assert.ThrowsAsync<KeyNotFoundException>(() => svc.DeactivateAsync("missing"));
|
||||
}
|
||||
@@ -173,7 +173,7 @@ public class UserManagementServiceTests
|
||||
using var db = BuildDb();
|
||||
var user = new AppUser { Id = "u1", UserName = "a@b.com", Email = "a@b.com" };
|
||||
var mgr = BuildUserManager(findResult: user);
|
||||
var svc = new UserManagementService(mgr.Object, db);
|
||||
var svc = new UserManagementService(mgr.Object, db, ROLAC.API.Tests.TestSupport.NullAuditLogger.Instance);
|
||||
|
||||
var pwd = await svc.ResetPasswordAsync("u1");
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
using ROLAC.API.Entities.Logging;
|
||||
using ROLAC.API.Services.Logging;
|
||||
|
||||
namespace ROLAC.API.Tests.TestSupport;
|
||||
|
||||
/// <summary>No-op <see cref="IAuditLogger"/> for unit tests that don't assert on audit output.</summary>
|
||||
public sealed class NullAuditLogger : IAuditLogger
|
||||
{
|
||||
public static readonly NullAuditLogger Instance = new();
|
||||
|
||||
public void Write(
|
||||
string action, string category, LogLevelEnum level = LogLevelEnum.Information,
|
||||
string? entityName = null, string? entityId = null, string? summary = null,
|
||||
object? before = null, object? after = null,
|
||||
string? userId = null, string? userEmail = null, string? ipAddress = null)
|
||||
{
|
||||
// intentionally empty
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user