chore: release v2.4
- Add theme system (Dark/Light palettes, ModernTheme, ThemeManager) - Add InputDialog, Spinner common view - Add DuplicatesCsvExportService - Refresh views, dialogs, and view models across tabs - Update localization strings (en/fr) - Tweak services (transfer, permissions, search, user access, ownership elevation, bulk operations) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
using System.ComponentModel;
|
||||
using SharepointToolbox.ViewModels.Dialogs;
|
||||
using SharepointToolbox.Views.Dialogs;
|
||||
using Xunit;
|
||||
|
||||
namespace SharepointToolbox.Tests.ViewModels.Dialogs;
|
||||
|
||||
public class SitePickerDialogLogicTests
|
||||
{
|
||||
private static SitePickerItem Item(string url, string title, long sizeMb = 0, string template = "")
|
||||
=> new(url, title, sizeMb, 0, template);
|
||||
|
||||
[Fact]
|
||||
public void ApplyFilter_TextFilter_MatchesUrlOrTitle_CaseInsensitive()
|
||||
{
|
||||
var items = new[]
|
||||
{
|
||||
Item("https://t/sites/hr", "HR Team"),
|
||||
Item("https://t/sites/finance", "Finance"),
|
||||
};
|
||||
|
||||
var result = SitePickerDialogLogic.ApplyFilter(items, "fINaNce", 0, long.MaxValue, "All").ToList();
|
||||
|
||||
Assert.Single(result);
|
||||
Assert.Equal("Finance", result[0].Title);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ApplyFilter_SizeRange_FiltersInclusively()
|
||||
{
|
||||
var items = new[]
|
||||
{
|
||||
Item("a", "A", sizeMb: 100),
|
||||
Item("b", "B", sizeMb: 500),
|
||||
Item("c", "C", sizeMb: 1200),
|
||||
};
|
||||
|
||||
var result = SitePickerDialogLogic.ApplyFilter(items, "", 100, 600, "All").ToList();
|
||||
|
||||
Assert.Equal(2, result.Count);
|
||||
Assert.Contains(result, i => i.Title == "A");
|
||||
Assert.Contains(result, i => i.Title == "B");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ApplyFilter_KindAll_SkipsKindCheck()
|
||||
{
|
||||
var items = new[] { Item("a", "A", template: "STS#3"), Item("b", "B", template: "GROUP#0") };
|
||||
|
||||
var result = SitePickerDialogLogic.ApplyFilter(items, "", 0, long.MaxValue, "All").ToList();
|
||||
|
||||
Assert.Equal(2, result.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ApplySort_UnknownColumn_ReturnsInputUnchanged()
|
||||
{
|
||||
var items = new[] { Item("b", "B"), Item("a", "A") };
|
||||
|
||||
var result = SitePickerDialogLogic.ApplySort(items, "Nonexistent", ListSortDirection.Ascending).ToList();
|
||||
|
||||
Assert.Equal("B", result[0].Title);
|
||||
Assert.Equal("A", result[1].Title);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ApplySort_Title_Ascending_And_Descending()
|
||||
{
|
||||
var items = new[] { Item("b", "B"), Item("a", "A"), Item("c", "C") };
|
||||
|
||||
var asc = SitePickerDialogLogic.ApplySort(items, "Title", ListSortDirection.Ascending).ToList();
|
||||
var desc = SitePickerDialogLogic.ApplySort(items, "Title", ListSortDirection.Descending).ToList();
|
||||
|
||||
Assert.Equal(new[] { "A", "B", "C" }, asc.Select(i => i.Title));
|
||||
Assert.Equal(new[] { "C", "B", "A" }, desc.Select(i => i.Title));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("", 42L, 42L)]
|
||||
[InlineData(" ", 42L, 42L)]
|
||||
[InlineData("not-a-number", 42L, 42L)]
|
||||
[InlineData("100", 42L, 100L)]
|
||||
[InlineData(" 100 ", 42L, 100L)]
|
||||
public void ParseLongOrDefault_HandlesEmptyAndInvalid(string input, long fallback, long expected)
|
||||
{
|
||||
Assert.Equal(expected, SitePickerDialogLogic.ParseLongOrDefault(input, fallback));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user