using e_suite.API.Common.repository; using e_suite.Database.Audit; using e_suite.Database.Core.Extensions; using e_suite.Database.Core.Models; using e_suite.Database.Core.Tables.Domain; using e_suite.Database.Core.Tables.UserManager; using e_suite.UnitTestCore; using eSuite.Core.Clock; using eSuite.Core.Miscellaneous; using Microsoft.EntityFrameworkCore; using MockQueryable; namespace UserManager.UnitTests.Repository; public class FakeUserManagerRepository : FakeRepository, IUserManagerRepository { private readonly IClock _clock; public List Users = []; public List EmailUserActions = []; public List Domains = []; public List SsoProviders = []; public List SingleUseGuids = []; public FakeUserManagerRepository(IClock clock) { _clock = clock; Domains.Add( new Domain { Id = 1, Guid = new Guid("{E5B6C043-C2EB-46CC-9387-E5F45420C93F}"), Name = "Default Test domain" } ); Domains.Add(new Domain { Id = 2, Guid = new Guid("d3d36362-dd2a-490a-b8ef-71ee59934b8d"), Name = "Alternative Test Domain" } ); SsoProviders.Add(new SsoProvider { Id = 1, Name = "Test provider", ClientId = "SecretClientId", ClientSecret = "NotTellingYou", Deleted = false, IsPublic = true, AuthorizationEndpoint = "AuthorizationEndpoint", TokenEndpoint = "TokenEndpoint", ValidIssuer = "ValidIssuer" }); Users.Add( new User { Id = -1, Guid = new Guid("{EA6A2EB2-ADBF-47A1-8FA6-EF363D0750DC}"), Email = "audit@test.test", FirstName = "Audit", LastName = "Tester", DomainId = Domains[0].Id, Domain = Domains[0], EmailConfirmed = true, Created = new DateTimeOffset(2023, 7, 24, 13, 45, 24, TimeSpan.Zero), LastUpdated = new DateTimeOffset(2023, 7, 24, 13, 45, 25, TimeSpan.Zero) }); } public Task GetUserByEmail(string loginEmail, CancellationToken cancellationToken) { //return Task.FromResult(Users.SingleOrDefault(x => x.Email.Equals(loginEmail, StringComparison.InvariantCultureIgnoreCase))); return Task.FromResult(Users.SingleOrDefault(x => x.Email.Equals(loginEmail, StringComparison.InvariantCultureIgnoreCase))); } public async Task GetUserSsoId(long ssoId, string ssoUserId, CancellationToken cancellationToken) { var users = await GetUsers() .Where(u => u.SsoProviderId.Equals(ssoId) && u.SsoSubject.Equals(ssoUserId)) .ToListAsync(cancellationToken); return users.FirstOrDefault(); } public async Task GetUserByDomainSsoId(long domainSsoId, string ssoUserId, CancellationToken cancellationToken) { var users = await GetUsers() .Where(u => u.Domain.SsoProviderId.Equals(domainSsoId) && u.SsoSubject.Equals(ssoUserId)) .ToListAsync(cancellationToken); return users.FirstOrDefault(); } public Task AddEmailUserAction(AuditUserDetails auditUserDetails, EmailUserAction emailConfirmation, CancellationToken cancellationToken) { emailConfirmation.User = Users.Single(x => x.Id == emailConfirmation.UserId); EmailUserActions.Add(emailConfirmation); return Task.CompletedTask; } public Task AddUser(AuditUserDetails auditUserDetails, User user, CancellationToken cancellationToken) { if (Users.Any(x => x.Email.Equals(user.Email, StringComparison.InvariantCultureIgnoreCase))) throw new Exception("User already exists"); Users.Add(user); return Task.CompletedTask; } public Task EditUser(AuditUserDetails auditUserDetails, User user, CancellationToken cancellationToken) { var realUser = Users.Single(x => x.Id == user.Id); realUser.FirstName = user.FirstName; realUser.LastName = user.LastName; realUser.MiddleNames = user.MiddleNames; realUser.Email = user.Email; realUser.Password = user.Password; realUser.EmailConfirmed = user.EmailConfirmed; realUser.UsingTwoFactorAuthentication = user.UsingTwoFactorAuthentication; realUser.TwoFactorAuthenticationKey = user.TwoFactorAuthenticationKey; realUser.Created = user.Created; realUser.Active = user.Active; realUser.LastUpdated = _clock.GetNow; return Task.CompletedTask; } public Task GetEmailUserAction(Guid token, CancellationToken cancellationToken) { return Task.FromResult(EmailUserActions.SingleOrDefault(c => c.Token.Equals(token) && c.Expires > _clock.GetNow)); } public Task DeleteEmailUserAction(AuditUserDetails auditUserDetails, EmailUserAction emailUserAction, CancellationToken cancellationToken) { var item = EmailUserActions.Single(x => x.Token.Equals(emailUserAction.Token)); EmailUserActions.Remove(item); return Task.CompletedTask; } public IQueryable GetUsers() { return Users.BuildMock(); } public Task GetUserById(IGeneralIdRef generalIdRef, CancellationToken cancellationToken) { return Task.FromResult(Users.SingleOrDefault(x => x.Id == generalIdRef.Id || x.Guid == generalIdRef.Guid )); } public Task GetSsoProviderById(long id, CancellationToken cancellationToken) { return Task.FromResult(SsoProviders.SingleOrDefault(x => x.Id == id)); } public IQueryable GetSsoProviders() { return SsoProviders.BuildMock(); } public Task SaveSingleUseGuidForUser(SingleUseGuid singleUseGuid, CancellationToken cancellationToken) { SingleUseGuids.Add(singleUseGuid); return Task.CompletedTask; } public Task GetUserBySingleUseGuid(Guid guid, CancellationToken cancellationToken) { var singleUserGuid = SingleUseGuids.SingleOrDefault(x => x.Guid == guid && x.Expires >= _clock.GetNow); return Task.FromResult(singleUserGuid?.User); } public Task DeleteSingleUseGuid(Guid guid, CancellationToken cancellationToken) { var singleUserGuid = SingleUseGuids.SingleOrDefault(x => x.Guid == guid && x.Expires >= _clock.GetNow); if (singleUserGuid != null) { SingleUseGuids.Remove(singleUserGuid); } return Task.CompletedTask; } public Task GetUserById(GeneralIdRef generalIdRef) { foreach (var user in Users) { if (user.Id == generalIdRef.Id) return Task.FromResult(user)!; if (user.Guid == generalIdRef.Guid) return Task.FromResult(user)!; } return Task.FromResult(null); } public Task GetDomainById(GeneralIdRef domainId, CancellationToken cancellationToken) { return Task.FromResult(Domains.FindByGeneralIdRef(domainId)); } public Task DeleteExpiredEmailUserActions() { DeleteExpiredEmailUserActionsCalled = true; return Task.CompletedTask; } public Task DeleteExpiredSingleUseGuids() { DeleteExpiredSingleUseGuidsCalled = true; return Task.CompletedTask; } public bool DeleteExpiredSingleUseGuidsCalled { get; set; } public Task GetCurrentEmailUserAction(long userId, EmailUserActionType emailUserActionType, CancellationToken cancellationToken) { var now = _clock.GetNow; var result = EmailUserActions.Where( x => x.UserId == userId && x.EmailActionType == emailUserActionType && x.Expires > now) .OrderByDescending(x => x.Expires) .FirstOrDefault(); return Task.FromResult(result); } public bool DeleteExpiredEmailUserActionsCalled { get; set; } }