using Distribution.Features.Item; using Distribution.Features.Order; using Distribution.Features.Route; using Distribution.Features.Scheme; using Distribution.Features.Stock; using Distribution.Features.Store; using Distribution.Infra.Authorization; using Distribution.Infra.UoW; using Distribution.Models; using Moq; using Xunit; namespace Distribution.Tests.Services; public class StoreServiceTests { private readonly Mock _repo = new(); private readonly Mock _uow = new(); private readonly Mock _currentUser = new(); private readonly Mock _scopeAccess = new(); private readonly Mock _routeRepo = new(); private readonly StoreService _sut; public StoreServiceTests() { _currentUser.Setup(u => u.RoleLevel).Returns(50); // global scope, skips per-store scope lookups var schemeService = new SchemeService( Mock.Of(), Mock.Of(), Mock.Of(), _repo.Object, Mock.Of(), _uow.Object); _sut = new StoreService(_repo.Object, _uow.Object, _currentUser.Object, _scopeAccess.Object, schemeService, _routeRepo.Object); } private static Store ActiveStore() => new() { Id = Guid.NewGuid(), IsActive = true }; // GetVisitHistoryAsync [Fact] public async Task GetVisitHistoryAsync_ReturnsNull_WhenStoreNotFound() { _repo.Setup(r => r.GetByIdAsync(It.IsAny())).ReturnsAsync((Store?)null); var result = await _sut.GetVisitHistoryAsync(Guid.NewGuid()); Assert.Null(result); } [Fact] public async Task GetVisitHistoryAsync_ReturnsEmpty_WhenNoVisitsLogged() { var store = ActiveStore(); _repo.Setup(r => r.GetByIdAsync(store.Id)).ReturnsAsync(store); _routeRepo.Setup(r => r.GetVisitsByStoreIdAsync(store.Id)).ReturnsAsync([]); var result = await _sut.GetVisitHistoryAsync(store.Id); Assert.NotNull(result); Assert.Empty(result); } [Fact] public async Task GetVisitHistoryAsync_MapsVisits_MostRecentFirst() { var store = ActiveStore(); var repId = Guid.NewGuid(); var older = new RouteVisitLog { Id = Guid.NewGuid(), FK_StoreId = store.Id, FK_UserId = repId, CheckInAt = DateTime.Now.AddDays(-2), CheckOutAt = DateTime.Now.AddDays(-2).AddHours(1) }; var newer = new RouteVisitLog { Id = Guid.NewGuid(), FK_StoreId = store.Id, FK_UserId = repId, CheckInAt = DateTime.Now.AddDays(-1), CheckOutAt = null }; _repo.Setup(r => r.GetByIdAsync(store.Id)).ReturnsAsync(store); _routeRepo.Setup(r => r.GetVisitsByStoreIdAsync(store.Id)).ReturnsAsync([older, newer]); var result = await _sut.GetVisitHistoryAsync(store.Id); Assert.NotNull(result); Assert.Equal(2, result.Count); Assert.Equal(newer.Id, result[0].VisitId); Assert.Equal("In Progress", result[0].Outcome); Assert.Equal(older.Id, result[1].VisitId); Assert.Equal("Completed", result[1].Outcome); Assert.Equal(repId, result[0].RepUserId); } }