1
0
mirror of https://github.com/bitwarden/server.git synced 2025-06-30 15:42:48 -05:00
Files
bitwarden/test/Core.Test/NotificationCenter/Commands/UpdateNotificationCommandTest.cs
Maciej Zieniuk fcf346985f PM-10564: Sync notification push type separation for notification updates
Sync notification push type is now used for both Notification create and update.
Renamed the event types to specifically mention the purpose of status for notification status updates.
2024-11-25 20:45:41 +00:00

115 lines
5.0 KiB
C#

#nullable enable
using System.Security.Claims;
using Bit.Core.Enums;
using Bit.Core.Exceptions;
using Bit.Core.NotificationCenter.Authorization;
using Bit.Core.NotificationCenter.Commands;
using Bit.Core.NotificationCenter.Entities;
using Bit.Core.NotificationCenter.Enums;
using Bit.Core.NotificationCenter.Repositories;
using Bit.Core.Services;
using Bit.Core.Test.NotificationCenter.AutoFixture;
using Bit.Core.Utilities;
using Bit.Test.Common.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes;
using Microsoft.AspNetCore.Authorization;
using NSubstitute;
using Xunit;
namespace Bit.Core.Test.NotificationCenter.Commands;
[SutProviderCustomize]
[NotificationCustomize]
public class UpdateNotificationCommandTest
{
private static void Setup(SutProvider<UpdateNotificationCommand> sutProvider,
Guid notificationId, Notification? notification, bool authorized = false)
{
sutProvider.GetDependency<INotificationRepository>()
.GetByIdAsync(notificationId)
.Returns(notification);
sutProvider.GetDependency<IAuthorizationService>()
.AuthorizeAsync(Arg.Any<ClaimsPrincipal>(), notification ?? Arg.Any<Notification>(),
Arg.Is<IEnumerable<IAuthorizationRequirement>>(reqs =>
reqs.Contains(NotificationOperations.Update)))
.Returns(authorized ? AuthorizationResult.Success() : AuthorizationResult.Failed());
sutProvider.GetDependency<INotificationRepository>().ClearReceivedCalls();
}
[Theory]
[BitAutoData]
public async Task UpdateAsync_NotificationNotFound_NotFoundException(
SutProvider<UpdateNotificationCommand> sutProvider,
Notification notification)
{
Setup(sutProvider, notification.Id, notification: null, true);
await Assert.ThrowsAsync<NotFoundException>(() => sutProvider.Sut.UpdateAsync(notification));
await sutProvider.GetDependency<IPushNotificationService>()
.Received(0)
.PushSyncNotificationAsync(Arg.Any<Notification>());
await sutProvider.GetDependency<IPushNotificationService>()
.Received(0)
.PushSyncNotificationStatusAsync(Arg.Any<Notification>(), Arg.Any<NotificationStatus>());
}
[Theory]
[BitAutoData]
public async Task UpdateAsync_AuthorizationFailed_NotFoundException(
SutProvider<UpdateNotificationCommand> sutProvider,
Notification notification)
{
Setup(sutProvider, notification.Id, notification, authorized: false);
await Assert.ThrowsAsync<NotFoundException>(() => sutProvider.Sut.UpdateAsync(notification));
await sutProvider.GetDependency<IPushNotificationService>()
.Received(0)
.PushSyncNotificationAsync(Arg.Any<Notification>());
await sutProvider.GetDependency<IPushNotificationService>()
.Received(0)
.PushSyncNotificationStatusAsync(Arg.Any<Notification>(), Arg.Any<NotificationStatus>());
}
[Theory]
[BitAutoData]
public async Task UpdateAsync_Authorized_NotificationCreated(
SutProvider<UpdateNotificationCommand> sutProvider,
Notification notification)
{
notification.Priority = Priority.Medium;
notification.ClientType = ClientType.Web;
notification.Title = "Title";
notification.Body = "Body";
notification.RevisionDate = DateTime.UtcNow.AddMinutes(-60);
Setup(sutProvider, notification.Id, notification, true);
var notificationToUpdate = CoreHelpers.CloneObject(notification);
notificationToUpdate.Priority = Priority.High;
notificationToUpdate.ClientType = ClientType.Mobile;
notificationToUpdate.Title = "Updated Title";
notificationToUpdate.Body = "Updated Body";
notificationToUpdate.RevisionDate = DateTime.UtcNow.AddMinutes(-30);
await sutProvider.Sut.UpdateAsync(notificationToUpdate);
await sutProvider.GetDependency<INotificationRepository>().Received(1)
.ReplaceAsync(Arg.Is<Notification>(n =>
// Not updated fields
n.Id == notificationToUpdate.Id && n.Global == notificationToUpdate.Global &&
n.UserId == notificationToUpdate.UserId && n.OrganizationId == notificationToUpdate.OrganizationId &&
n.CreationDate == notificationToUpdate.CreationDate &&
// Updated fields
n.Priority == notificationToUpdate.Priority && n.ClientType == notificationToUpdate.ClientType &&
n.Title == notificationToUpdate.Title && n.Body == notificationToUpdate.Body &&
DateTime.UtcNow - n.RevisionDate < TimeSpan.FromMinutes(1)));
await sutProvider.GetDependency<IPushNotificationService>()
.Received(1)
.PushSyncNotificationAsync(notification);
await sutProvider.GetDependency<IPushNotificationService>()
.Received(0)
.PushSyncNotificationStatusAsync(Arg.Any<Notification>(), Arg.Any<NotificationStatus>());
}
}