#nullable enable using System.Security.Claims; using Bit.Core.Exceptions; using Bit.Core.NotificationCenter.Authorization; using Bit.Core.NotificationCenter.Commands; using Bit.Core.NotificationCenter.Entities; using Bit.Core.NotificationCenter.Repositories; using Bit.Core.Test.NotificationCenter.AutoFixture; 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] [NotificationStatusCustomize] public class CreateNotificationStatusCommandTest { private static void Setup(SutProvider sutProvider, Notification? notification, NotificationStatus notificationStatus, bool authorizedNotification = false, bool authorizedCreate = false) { sutProvider.GetDependency() .GetByIdAsync(notificationStatus.NotificationId) .Returns(notification); sutProvider.GetDependency() .CreateAsync(notificationStatus) .Returns(notificationStatus); sutProvider.GetDependency() .AuthorizeAsync(Arg.Any(), notification ?? Arg.Any(), Arg.Is>(reqs => reqs.Contains(NotificationOperations.Read))) .Returns(authorizedNotification ? AuthorizationResult.Success() : AuthorizationResult.Failed()); sutProvider.GetDependency() .AuthorizeAsync(Arg.Any(), notificationStatus, Arg.Is>(reqs => reqs.Contains(NotificationStatusOperations.Create))) .Returns(authorizedCreate ? AuthorizationResult.Success() : AuthorizationResult.Failed()); } [Theory] [BitAutoData] public async Task CreateAsync_NotificationNotFound_NotFoundException( SutProvider sutProvider, NotificationStatus notificationStatus) { Setup(sutProvider, notification: null, notificationStatus, true, true); await Assert.ThrowsAsync(() => sutProvider.Sut.CreateAsync(notificationStatus)); } [Theory] [BitAutoData] public async Task CreateAsync_NotificationReadNotAuthorized_NotFoundException( SutProvider sutProvider, Notification notification, NotificationStatus notificationStatus) { Setup(sutProvider, notification, notificationStatus, authorizedNotification: false, true); await Assert.ThrowsAsync(() => sutProvider.Sut.CreateAsync(notificationStatus)); } [Theory] [BitAutoData] public async Task CreateAsync_CreateNotAuthorized_NotFoundException( SutProvider sutProvider, Notification notification, NotificationStatus notificationStatus) { Setup(sutProvider, notification, notificationStatus, true, authorizedCreate: false); await Assert.ThrowsAsync(() => sutProvider.Sut.CreateAsync(notificationStatus)); } [Theory] [BitAutoData] public async Task CreateAsync_NotificationFoundAuthorized_NotificationStatusCreated( SutProvider sutProvider, Notification notification, NotificationStatus notificationStatus) { Setup(sutProvider, notification, notificationStatus, true, true); var newNotificationStatus = await sutProvider.Sut.CreateAsync(notificationStatus); Assert.Equal(notificationStatus, newNotificationStatus); } }