diff --git a/SharepointToolbox.Tests/Services/UserAccessAuditServiceTests.cs b/SharepointToolbox.Tests/Services/UserAccessAuditServiceTests.cs index c0a34e1..744d9c6 100644 --- a/SharepointToolbox.Tests/Services/UserAccessAuditServiceTests.cs +++ b/SharepointToolbox.Tests/Services/UserAccessAuditServiceTests.cs @@ -61,6 +61,13 @@ public class UserAccessAuditServiceTests FolderDepth: 1, IncludeSubsites: false); + private static TenantProfile DefaultProfile => new() + { + Name = "Test", + TenantUrl = "https://contoso.sharepoint.com", + ClientId = "test-client-id" + }; + // ── Test 1: Filter by target user login ─────────────────────────────────── [Fact] @@ -77,6 +84,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@contoso.com" }, new[] { MakeSite() }, DefaultOptions, @@ -103,6 +111,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@contoso.com" }, new[] { MakeSite() }, DefaultOptions, @@ -127,6 +136,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@contoso.com" }, new[] { MakeSite() }, DefaultOptions, @@ -151,6 +161,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@contoso.com" }, new[] { MakeSite() }, DefaultOptions, @@ -175,6 +186,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@contoso.com" }, new[] { MakeSite() }, DefaultOptions, @@ -199,6 +211,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@contoso.com" }, new[] { MakeSite() }, DefaultOptions, @@ -223,6 +236,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@contoso.com" }, new[] { MakeSite() }, DefaultOptions, @@ -248,6 +262,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { extLogin }, new[] { MakeSite() }, DefaultOptions, @@ -272,6 +287,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@x.com", "bob@x.com" }, new[] { MakeSite() }, DefaultOptions, @@ -298,6 +314,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, new[] { "alice@contoso.com" }, new[] { MakeSite() }, DefaultOptions, @@ -324,6 +341,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( session.Object, + DefaultProfile, Array.Empty(), new[] { MakeSite() }, DefaultOptions, @@ -367,6 +385,7 @@ public class UserAccessAuditServiceTests var result = await svc.AuditUsersAsync( mockSession.Object, + DefaultProfile, new[] { "alice@contoso.com" }, sites, DefaultOptions, diff --git a/SharepointToolbox.Tests/ViewModels/UserAccessAuditViewModelTests.cs b/SharepointToolbox.Tests/ViewModels/UserAccessAuditViewModelTests.cs index f3bdcad..0960157 100644 --- a/SharepointToolbox.Tests/ViewModels/UserAccessAuditViewModelTests.cs +++ b/SharepointToolbox.Tests/ViewModels/UserAccessAuditViewModelTests.cs @@ -49,6 +49,7 @@ public class UserAccessAuditViewModelTests mockAudit .Setup(s => s.AuditUsersAsync( It.IsAny(), + It.IsAny(), It.IsAny>(), It.IsAny>(), It.IsAny(), @@ -65,6 +66,14 @@ public class UserAccessAuditViewModelTests mockSession.Object, NullLogger.Instance); + // Set a default profile so RunOperationAsync doesn't early-return + vm._currentProfile = new TenantProfile + { + Name = "Test", + TenantUrl = "https://contoso.sharepoint.com", + ClientId = "test-client-id" + }; + return (vm, mockAudit, mockGraph); } @@ -83,6 +92,7 @@ public class UserAccessAuditViewModelTests auditMock.Verify( s => s.AuditUsersAsync( It.IsAny(), + It.IsAny(), It.IsAny>(), It.IsAny>(), It.IsAny(), diff --git a/SharepointToolbox/Services/IUserAccessAuditService.cs b/SharepointToolbox/Services/IUserAccessAuditService.cs index 758168d..b2998a7 100644 --- a/SharepointToolbox/Services/IUserAccessAuditService.cs +++ b/SharepointToolbox/Services/IUserAccessAuditService.cs @@ -22,6 +22,7 @@ public interface IUserAccessAuditService /// Flat list of access entries for the target users. Task> AuditUsersAsync( ISessionManager sessionManager, + TenantProfile currentProfile, IReadOnlyList targetUserLogins, IReadOnlyList sites, ScanOptions options, diff --git a/SharepointToolbox/Services/UserAccessAuditService.cs b/SharepointToolbox/Services/UserAccessAuditService.cs index 19f98d4..cef8919 100644 --- a/SharepointToolbox/Services/UserAccessAuditService.cs +++ b/SharepointToolbox/Services/UserAccessAuditService.cs @@ -24,6 +24,7 @@ public class UserAccessAuditService : IUserAccessAuditService public async Task> AuditUsersAsync( ISessionManager sessionManager, + TenantProfile currentProfile, IReadOnlyList targetUserLogins, IReadOnlyList sites, ScanOptions options, @@ -53,7 +54,7 @@ public class UserAccessAuditService : IUserAccessAuditService var profile = new TenantProfile { TenantUrl = site.Url, - ClientId = string.Empty, // Will be set by SessionManager from cached session + ClientId = currentProfile.ClientId, Name = site.Title }; diff --git a/SharepointToolbox/ViewModels/Tabs/UserAccessAuditViewModel.cs b/SharepointToolbox/ViewModels/Tabs/UserAccessAuditViewModel.cs index 4faf6a8..23ba711 100644 --- a/SharepointToolbox/ViewModels/Tabs/UserAccessAuditViewModel.cs +++ b/SharepointToolbox/ViewModels/Tabs/UserAccessAuditViewModel.cs @@ -229,8 +229,15 @@ public partial class UserAccessAuditViewModel : FeatureViewModelBase FolderDepth: 1, IncludeSubsites: IncludeSubsites); + if (_currentProfile == null) + { + StatusMessage = "No tenant profile selected. Please connect first."; + return; + } + var entries = await _auditService.AuditUsersAsync( _sessionManager, + _currentProfile, userLogins, effectiveSites, scanOptions, diff --git a/SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml b/SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml index cd19d52..c51453f 100644 --- a/SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml +++ b/SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml @@ -31,8 +31,10 @@ - +