feat(11-04): add logo management commands to SettingsViewModel and ProfileManagementViewModel
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
using System.IO;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Moq;
|
||||
using SharepointToolbox.Core.Models;
|
||||
using SharepointToolbox.Infrastructure.Auth;
|
||||
using SharepointToolbox.Infrastructure.Persistence;
|
||||
using SharepointToolbox.Services;
|
||||
using SharepointToolbox.ViewModels;
|
||||
|
||||
namespace SharepointToolbox.Tests.ViewModels;
|
||||
|
||||
[Trait("Category", "Unit")]
|
||||
public class ProfileManagementViewModelLogoTests : IDisposable
|
||||
{
|
||||
private readonly string _tempFile;
|
||||
private readonly Mock<IBrandingService> _mockBranding;
|
||||
private readonly GraphClientFactory _graphClientFactory;
|
||||
private readonly ILogger<ProfileManagementViewModel> _logger;
|
||||
|
||||
public ProfileManagementViewModelLogoTests()
|
||||
{
|
||||
_tempFile = Path.GetTempFileName();
|
||||
File.Delete(_tempFile);
|
||||
_mockBranding = new Mock<IBrandingService>();
|
||||
_graphClientFactory = new GraphClientFactory(new MsalClientFactory());
|
||||
_logger = NullLogger<ProfileManagementViewModel>.Instance;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (File.Exists(_tempFile)) File.Delete(_tempFile);
|
||||
if (File.Exists(_tempFile + ".tmp")) File.Delete(_tempFile + ".tmp");
|
||||
}
|
||||
|
||||
private ProfileManagementViewModel CreateViewModel()
|
||||
{
|
||||
var profileService = new ProfileService(new ProfileRepository(_tempFile));
|
||||
return new ProfileManagementViewModel(
|
||||
profileService,
|
||||
_mockBranding.Object,
|
||||
_graphClientFactory,
|
||||
_logger);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_BrowseClientLogoCommand_IsNotNull()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.NotNull(vm.BrowseClientLogoCommand);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_ClearClientLogoCommand_IsNotNull()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.NotNull(vm.ClearClientLogoCommand);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_AutoPullClientLogoCommand_IsNotNull()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.NotNull(vm.AutoPullClientLogoCommand);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void BrowseClientLogoCommand_CannotExecute_WhenNoProfileSelected()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.False(vm.BrowseClientLogoCommand.CanExecute(null));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ClearClientLogoCommand_CannotExecute_WhenNoProfileSelected()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.False(vm.ClearClientLogoCommand.CanExecute(null));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AutoPullClientLogoCommand_CannotExecute_WhenNoProfileSelected()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.False(vm.AutoPullClientLogoCommand.CanExecute(null));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClearClientLogoCommand_ClearsClientLogo_AndPersists()
|
||||
{
|
||||
var profileService = new ProfileService(new ProfileRepository(_tempFile));
|
||||
var profile = new TenantProfile
|
||||
{
|
||||
Name = "TestTenant",
|
||||
TenantUrl = "https://test.sharepoint.com",
|
||||
ClientId = "00000000-0000-0000-0000-000000000001",
|
||||
ClientLogo = new LogoData { Base64 = "dGVzdA==", MimeType = "image/png" }
|
||||
};
|
||||
await profileService.AddProfileAsync(profile);
|
||||
|
||||
var vm = new ProfileManagementViewModel(
|
||||
profileService,
|
||||
_mockBranding.Object,
|
||||
_graphClientFactory,
|
||||
_logger);
|
||||
|
||||
vm.SelectedProfile = profile;
|
||||
|
||||
await vm.ClearClientLogoCommand.ExecuteAsync(null);
|
||||
|
||||
Assert.Null(profile.ClientLogo);
|
||||
|
||||
// Verify persisted
|
||||
var profiles = await profileService.GetProfilesAsync();
|
||||
var persisted = profiles.First(p => p.Name == "TestTenant");
|
||||
Assert.Null(persisted.ClientLogo);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
using System.IO;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Moq;
|
||||
using SharepointToolbox.Core.Models;
|
||||
using SharepointToolbox.Infrastructure.Persistence;
|
||||
using SharepointToolbox.Services;
|
||||
using SharepointToolbox.ViewModels;
|
||||
using SharepointToolbox.ViewModels.Tabs;
|
||||
|
||||
namespace SharepointToolbox.Tests.ViewModels;
|
||||
|
||||
[Trait("Category", "Unit")]
|
||||
public class SettingsViewModelLogoTests : IDisposable
|
||||
{
|
||||
private readonly string _tempFile;
|
||||
|
||||
public SettingsViewModelLogoTests()
|
||||
{
|
||||
_tempFile = Path.GetTempFileName();
|
||||
File.Delete(_tempFile);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (File.Exists(_tempFile)) File.Delete(_tempFile);
|
||||
if (File.Exists(_tempFile + ".tmp")) File.Delete(_tempFile + ".tmp");
|
||||
}
|
||||
|
||||
private SettingsViewModel CreateViewModel(IBrandingService? brandingService = null)
|
||||
{
|
||||
var settingsService = new SettingsService(new SettingsRepository(_tempFile));
|
||||
var mockBranding = brandingService ?? new Mock<IBrandingService>().Object;
|
||||
var logger = NullLogger<FeatureViewModelBase>.Instance;
|
||||
return new SettingsViewModel(settingsService, mockBranding, logger);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_BrowseMspLogoCommand_IsNotNull()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.NotNull(vm.BrowseMspLogoCommand);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_ClearMspLogoCommand_IsNotNull()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.NotNull(vm.ClearMspLogoCommand);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_MspLogoPreview_IsNullByDefault()
|
||||
{
|
||||
var vm = CreateViewModel();
|
||||
Assert.Null(vm.MspLogoPreview);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClearMspLogoCommand_CallsClearMspLogoAsync_AndSetsMspLogoPreviewToNull()
|
||||
{
|
||||
var mockBranding = new Mock<IBrandingService>();
|
||||
mockBranding.Setup(b => b.ClearMspLogoAsync()).Returns(Task.CompletedTask);
|
||||
|
||||
var vm = CreateViewModel(mockBranding.Object);
|
||||
|
||||
await vm.ClearMspLogoCommand.ExecuteAsync(null);
|
||||
|
||||
mockBranding.Verify(b => b.ClearMspLogoAsync(), Times.Once);
|
||||
Assert.Null(vm.MspLogoPreview);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user