using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.SharePoint.Client;
using Moq;
using SharepointToolbox.Core.Models;
using SharepointToolbox.Services;
using SharepointToolbox.ViewModels.Tabs;
namespace SharepointToolbox.Tests.ViewModels;
///
/// Unit tests for PermissionsViewModel.
/// PERM-02: multi-site scan loop invokes ScanSiteAsync once per URL.
///
public class PermissionsViewModelTests
{
[Fact]
public async Task StartScanAsync_WithMultipleSiteUrls_CallsServiceOncePerUrl()
{
// Arrange
var mockPermissionsService = new Mock();
mockPermissionsService
.Setup(s => s.ScanSiteAsync(
It.IsAny(),
It.IsAny(),
It.IsAny>(),
It.IsAny()))
.ReturnsAsync(new List());
var mockSiteListService = new Mock();
var mockSessionManager = new Mock();
mockSessionManager
.Setup(s => s.GetOrCreateContextAsync(It.IsAny(), It.IsAny()))
.ReturnsAsync((ClientContext)null!);
var vm = new PermissionsViewModel(
mockPermissionsService.Object,
mockSiteListService.Object,
mockSessionManager.Object,
new NullLogger());
// Set up two site URLs via SelectedSites
vm.SelectedSites.Add(new SiteInfo("https://tenant1.sharepoint.com/sites/alpha", "Alpha"));
vm.SelectedSites.Add(new SiteInfo("https://tenant1.sharepoint.com/sites/beta", "Beta"));
vm.SetCurrentProfile(new TenantProfile
{
Name = "Test",
TenantUrl = "https://tenant1.sharepoint.com",
ClientId = "client-id"
});
// Act
await vm.TestRunOperationAsync(CancellationToken.None, new Progress());
// Assert: ScanSiteAsync called exactly twice (once per URL)
mockPermissionsService.Verify(
s => s.ScanSiteAsync(
It.IsAny(),
It.IsAny(),
It.IsAny>(),
It.IsAny()),
Times.Exactly(2));
}
}