using SharepointToolbox.Core.Models;
using SharepointToolbox.Services.Export;
namespace SharepointToolbox.Tests.Services.Export;
///
/// Tests for PERM-05: CSV export output.
/// These tests reference CsvExportService which will be implemented in Plan 03.
/// Until Plan 03 runs they will fail to compile — that is expected.
///
public class CsvExportServiceTests
{
private static PermissionEntry MakeEntry(
string objectType, string title, string url,
bool hasUnique, string users, string userLogins,
string permissionLevels, string grantedThrough, string principalType) =>
new(objectType, title, url, hasUnique, users, userLogins, permissionLevels, grantedThrough, principalType);
[Fact]
public void BuildCsv_WithKnownEntries_ProducesHeaderRow()
{
var entry = MakeEntry("Web", "Site A", "https://contoso.sharepoint.com/sites/A",
true, "alice@contoso.com", "i:0#.f|membership|alice@contoso.com",
"Contribute", "Direct Permissions", "User");
var svc = new CsvExportService();
var csv = svc.BuildCsv(new[] { entry });
Assert.Contains("Object", csv);
Assert.Contains("Title", csv);
Assert.Contains("URL", csv);
Assert.Contains("HasUniquePermissions", csv);
Assert.Contains("Users", csv);
Assert.Contains("UserLogins", csv);
Assert.Contains("Type", csv);
Assert.Contains("Permissions", csv);
Assert.Contains("GrantedThrough", csv);
}
[Fact]
public void BuildCsv_WithEmptyList_ReturnsHeaderOnly()
{
var svc = new CsvExportService();
var csv = svc.BuildCsv(Array.Empty());
// Should have exactly one line (header) or header + empty body
Assert.NotEmpty(csv);
Assert.Contains("Object", csv);
}
[Fact]
public void BuildCsv_WithDuplicateUserPermissionGrantedThrough_MergesLocations()
{
// PERM-05 Merge-PermissionRows: two entries with same Users+PermissionLevels+GrantedThrough
// but different URLs must be merged into one row with URLs pipe-joined.
var entryA = MakeEntry("Web", "Site A", "https://contoso.sharepoint.com/sites/A",
true, "alice@contoso.com", "i:0#.f|membership|alice@contoso.com",
"Contribute", "Direct Permissions", "User");
var entryB = MakeEntry("Web", "Site B", "https://contoso.sharepoint.com/sites/B",
true, "alice@contoso.com", "i:0#.f|membership|alice@contoso.com",
"Contribute", "Direct Permissions", "User");
var svc = new CsvExportService();
var csv = svc.BuildCsv(new[] { entryA, entryB });
// Merged row must contain both URLs separated by " | "
Assert.Contains("sites/A", csv);
Assert.Contains("sites/B", csv);
Assert.Contains("|", csv);
}
}