test project created

This commit is contained in:
Kalana B. Thilakarathna
2026-08-19 14:40:04 +05:30
parent 397af8fd59
commit 4673d72d53
148 changed files with 8252 additions and 285 deletions
@@ -0,0 +1,163 @@
using Distribution.Infra.Authorization;
using Moq;
using Xunit;
namespace Distribution.Tests.Services;
public class ScopeAccessServiceTests
{
private readonly Mock<IScopeRepository> _repo = new();
private readonly ScopeAccessService _sut;
private readonly Guid _userId = Guid.NewGuid();
public ScopeAccessServiceTests()
{
_sut = new ScopeAccessService(_repo.Object);
}
// Delegation tests
[Fact]
public async Task HasStoreScopeAsync_DelegatesToRepository()
{
var storeId = Guid.NewGuid();
_repo.Setup(r => r.HasStoreScopeAsync(_userId, storeId)).ReturnsAsync(true);
var result = await _sut.HasStoreScopeAsync(_userId, storeId);
Assert.True(result);
_repo.Verify(r => r.HasStoreScopeAsync(_userId, storeId), Times.Once);
}
[Fact]
public async Task HasRouteScopeAsync_DelegatesToRepository()
{
var routeId = Guid.NewGuid();
_repo.Setup(r => r.HasRouteScopeAsync(_userId, routeId)).ReturnsAsync(false);
var result = await _sut.HasRouteScopeAsync(_userId, routeId);
Assert.False(result);
}
[Fact]
public async Task HasRegionScopeAsync_DelegatesToRepository()
{
var regionId = Guid.NewGuid();
_repo.Setup(r => r.HasRegionScopeAsync(_userId, regionId)).ReturnsAsync(true);
var result = await _sut.HasRegionScopeAsync(_userId, regionId);
Assert.True(result);
}
// GetAccessibleStoreIdsAsync
[Fact]
public async Task GetAccessibleStoreIdsAsync_ReturnsEmpty_WhenNoAssignments()
{
_repo.Setup(r => r.GetDirectStoreIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetRouteIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetRegionIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(It.IsAny<List<Guid>>())).ReturnsAsync([]);
_repo.Setup(r => r.GetRouteIdsByRegionIdsAsync(It.IsAny<List<Guid>>())).ReturnsAsync([]);
var result = await _sut.GetAccessibleStoreIdsAsync(_userId);
Assert.Empty(result);
}
[Fact]
public async Task GetAccessibleStoreIdsAsync_ReturnsDirectStores()
{
var storeId = Guid.NewGuid();
_repo.Setup(r => r.GetDirectStoreIdsAsync(_userId)).ReturnsAsync([storeId]);
_repo.Setup(r => r.GetRouteIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetRegionIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(It.IsAny<List<Guid>>())).ReturnsAsync([]);
_repo.Setup(r => r.GetRouteIdsByRegionIdsAsync(It.IsAny<List<Guid>>())).ReturnsAsync([]);
var result = await _sut.GetAccessibleStoreIdsAsync(_userId);
Assert.Single(result);
Assert.Contains(storeId, result);
}
[Fact]
public async Task GetAccessibleStoreIdsAsync_IncludesStoresViaRoute()
{
var routeId = Guid.NewGuid();
var storeViaRoute = Guid.NewGuid();
_repo.Setup(r => r.GetDirectStoreIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetRouteIdsAsync(_userId)).ReturnsAsync([routeId]);
_repo.Setup(r => r.GetRegionIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(new List<Guid> { routeId })).ReturnsAsync([storeViaRoute]);
_repo.Setup(r => r.GetRouteIdsByRegionIdsAsync(It.IsAny<List<Guid>>())).ReturnsAsync([]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(new List<Guid>())).ReturnsAsync([]);
var result = await _sut.GetAccessibleStoreIdsAsync(_userId);
Assert.Contains(storeViaRoute, result);
}
[Fact]
public async Task GetAccessibleStoreIdsAsync_IncludesStoresViaRegion()
{
var regionId = Guid.NewGuid();
var routeViaRegion = Guid.NewGuid();
var storeViaRegion = Guid.NewGuid();
_repo.Setup(r => r.GetDirectStoreIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetRouteIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetRegionIdsAsync(_userId)).ReturnsAsync([regionId]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(new List<Guid>())).ReturnsAsync([]);
_repo.Setup(r => r.GetRouteIdsByRegionIdsAsync(new List<Guid> { regionId })).ReturnsAsync([routeViaRegion]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(new List<Guid> { routeViaRegion })).ReturnsAsync([storeViaRegion]);
var result = await _sut.GetAccessibleStoreIdsAsync(_userId);
Assert.Contains(storeViaRegion, result);
}
[Fact]
public async Task GetAccessibleStoreIdsAsync_DeduplicatesStores()
{
var sharedStoreId = Guid.NewGuid();
var routeId = Guid.NewGuid();
_repo.Setup(r => r.GetDirectStoreIdsAsync(_userId)).ReturnsAsync([sharedStoreId]);
_repo.Setup(r => r.GetRouteIdsAsync(_userId)).ReturnsAsync([routeId]);
_repo.Setup(r => r.GetRegionIdsAsync(_userId)).ReturnsAsync([]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(new List<Guid> { routeId })).ReturnsAsync([sharedStoreId]);
_repo.Setup(r => r.GetRouteIdsByRegionIdsAsync(It.IsAny<List<Guid>>())).ReturnsAsync([]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(new List<Guid>())).ReturnsAsync([]);
var result = await _sut.GetAccessibleStoreIdsAsync(_userId);
Assert.Single(result);
Assert.Equal(sharedStoreId, result[0]);
}
[Fact]
public async Task GetAccessibleStoreIdsAsync_CombinesAllSources()
{
var directStore = Guid.NewGuid();
var routeStore = Guid.NewGuid();
var regionStore = Guid.NewGuid();
var routeId = Guid.NewGuid();
var regionId = Guid.NewGuid();
var routeViaRegion = Guid.NewGuid();
_repo.Setup(r => r.GetDirectStoreIdsAsync(_userId)).ReturnsAsync([directStore]);
_repo.Setup(r => r.GetRouteIdsAsync(_userId)).ReturnsAsync([routeId]);
_repo.Setup(r => r.GetRegionIdsAsync(_userId)).ReturnsAsync([regionId]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(new List<Guid> { routeId })).ReturnsAsync([routeStore]);
_repo.Setup(r => r.GetRouteIdsByRegionIdsAsync(new List<Guid> { regionId })).ReturnsAsync([routeViaRegion]);
_repo.Setup(r => r.GetStoreIdsByRouteIdsAsync(new List<Guid> { routeViaRegion })).ReturnsAsync([regionStore]);
var result = await _sut.GetAccessibleStoreIdsAsync(_userId);
Assert.Equal(3, result.Count);
Assert.Contains(directStore, result);
Assert.Contains(routeStore, result);
Assert.Contains(regionStore, result);
}
}