#nullable enable using Bit.Api.Platform.Push; using Bit.Core.Context; using Bit.Core.Enums; using Bit.Core.Exceptions; using Bit.Core.Models.Api; using Bit.Core.NotificationHub; using Bit.Core.Platform.Push; using Bit.Core.Settings; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using NSubstitute; using Xunit; namespace Bit.Api.Test.Platform.Push.Controllers; [ControllerCustomize(typeof(PushController))] [SutProviderCustomize] public class PushControllerTests { [Theory] [BitAutoData(false, true)] [BitAutoData(false, false)] [BitAutoData(true, true)] public async Task RegisterAsync_InstallationIdNotSetOrSelfHosted_BadRequest(bool haveInstallationId, bool selfHosted, SutProvider sutProvider, Guid installationId, Guid userId, Guid identifier, Guid deviceId) { sutProvider.GetDependency().SelfHosted = selfHosted; if (haveInstallationId) { sutProvider.GetDependency().InstallationId.Returns(installationId); } var exception = await Assert.ThrowsAsync(() => sutProvider.Sut.RegisterAsync(new PushRegistrationRequestModel { DeviceId = deviceId.ToString(), PushToken = "test-push-token", UserId = userId.ToString(), Type = DeviceType.Android, Identifier = identifier.ToString(), })); Assert.Equal("Not correctly configured for push relays.", exception.Message); await sutProvider.GetDependency().Received(0) .CreateOrUpdateRegistrationAsync(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any>(), Arg.Any()); } [Theory] [BitAutoData(false)] [BitAutoData(true)] public async Task RegisterAsync_ValidModel_CreatedOrUpdatedRegistration(bool haveOrganizationId, SutProvider sutProvider, Guid installationId, Guid userId, Guid identifier, Guid deviceId, Guid organizationId) { sutProvider.GetDependency().SelfHosted = false; sutProvider.GetDependency().InstallationId.Returns(installationId); var expectedUserId = $"{installationId}_{userId}"; var expectedIdentifier = $"{installationId}_{identifier}"; var expectedDeviceId = $"{installationId}_{deviceId}"; var expectedOrganizationId = $"{installationId}_{organizationId}"; var model = new PushRegistrationRequestModel { DeviceId = deviceId.ToString(), PushToken = "test-push-token", UserId = userId.ToString(), Type = DeviceType.Android, Identifier = identifier.ToString(), OrganizationIds = haveOrganizationId ? [organizationId.ToString()] : null, InstallationId = installationId }; await sutProvider.Sut.RegisterAsync(model); await sutProvider.GetDependency().Received(1) .CreateOrUpdateRegistrationAsync( Arg.Is(data => data == new PushRegistrationData(model.PushToken)), expectedDeviceId, expectedUserId, expectedIdentifier, DeviceType.Android, Arg.Do>(organizationIds => { Assert.NotNull(organizationIds); var organizationIdsList = organizationIds.ToList(); if (haveOrganizationId) { Assert.Contains(expectedOrganizationId, organizationIdsList); Assert.Single(organizationIdsList); } else { Assert.Empty(organizationIdsList); } }), installationId); } }