86 lines
3.2 KiB
C#
86 lines
3.2 KiB
C#
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<IStoreRepository> _repo = new();
|
|
private readonly Mock<IUnitOfWork> _uow = new();
|
|
private readonly Mock<ICurrentUserService> _currentUser = new();
|
|
private readonly Mock<IScopeAccessService> _scopeAccess = new();
|
|
private readonly Mock<IRouteRepository> _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<ISchemeRepository>(),
|
|
Mock.Of<IOrderRepository>(),
|
|
Mock.Of<IItemRepository>(),
|
|
_repo.Object,
|
|
Mock.Of<IStockRepository>(),
|
|
_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<Guid>())).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);
|
|
}
|
|
}
|