Initial feature for drag / drop calendar events.

This commit is contained in:
Burak Kaan Köse
2026-04-08 23:46:02 +02:00
parent a3c35dfae5
commit 3dc4ac03ec
30 changed files with 621 additions and 4 deletions
@@ -287,6 +287,30 @@ public class CalendarPageViewModelTests
}
}
[Fact]
public void CanChangeStartAndEndDate_ReturnsTrueForOrganizerMatchingAssignedCalendarAccount()
{
var account = CreateAccount();
var calendar = CreateCalendar(account, "Calendar");
var accountCalendarViewModel = new AccountCalendarViewModel(account, calendar);
var calendarItem = CreateCalendarItem(calendar.Id, new DateTime(2026, 3, 20, 9, 0, 0), "Existing");
calendarItem.AssignedCalendar = accountCalendarViewModel;
calendarItem.OrganizerEmail = account.Address;
calendarItem.CanChangeStartAndEndDate.Should().BeTrue();
}
[Fact]
public void AccountCalendarViewModel_MailAccount_ExposesUnderlyingAccount()
{
var account = CreateAccount();
var calendar = CreateCalendar(account, "Calendar");
var accountCalendarViewModel = new AccountCalendarViewModel(account, calendar);
accountCalendarViewModel.MailAccount.Should().BeSameAs(account);
}
private static CalendarPageViewModel CreateViewModel(
ICalendarService calendarService,
IPreferencesService preferencesService,
@@ -79,6 +79,27 @@ public sealed class WinoSynchronizerCalendarRequestTests
}
}
[Fact]
public async Task Change_start_and_end_date_request_should_dispatch_to_matching_handler()
{
var synchronizer = new TestCalendarSynchronizer(throwDuringRequestExecution: false);
var calendarItemId = Guid.NewGuid();
var request = new ChangeStartAndEndDateRequest(
new CalendarItem { Id = calendarItemId },
[]);
synchronizer.QueueRequest(request);
var result = await synchronizer.SynchronizeCalendarEventsAsync(new CalendarSynchronizationOptions
{
AccountId = synchronizer.Account.Id,
Type = CalendarSynchronizationType.ExecuteRequests
});
result.CompletedState.Should().Be(SynchronizationCompletedState.Success);
synchronizer.ChangeStartAndEndDateInvocationCount.Should().Be(1);
}
public sealed class SynchronizationActionsCompletedRecipient : IRecipient<SynchronizationActionsCompleted>
{
public List<Guid> CompletedAccountIds { get; } = [];
@@ -98,6 +119,7 @@ public sealed class WinoSynchronizerCalendarRequestTests
public override uint BatchModificationSize => 1;
public override uint InitialMessageDownloadCountPerFolder => 0;
public int ChangeStartAndEndDateInvocationCount { get; private set; }
public override Task ExecuteNativeRequestsAsync(List<IRequestBundle<object>> batchedRequests, CancellationToken cancellationToken = default)
=> _throwDuringRequestExecution
@@ -107,6 +129,12 @@ public sealed class WinoSynchronizerCalendarRequestTests
public override List<IRequestBundle<object>> DeleteCalendarEvent(DeleteCalendarEventRequest request)
=> [new TestRequestBundle(new object(), request)];
public override List<IRequestBundle<object>> ChangeStartAndEndDate(ChangeStartAndEndDateRequest request)
{
ChangeStartAndEndDateInvocationCount++;
return [new TestRequestBundle(new object(), request)];
}
public override Task<List<NewMailItemPackage>> CreateNewMailPackagesAsync(
object message,
Wino.Core.Domain.Entities.Mail.MailItemFolder assignedFolder,